Слова в БД - поиск по лексическому словарю (семантическое сходство) - PullRequest
0 голосов
/ 03 августа 2010

Я реализую небольшую словарную базу данных, в которой я хотел бы выполнять поиск на основе лексического / семантического сходства между ними ..

Например, beer имеет «сестринские слова», такие как soda, lemonade, wine, champagne, каждое из которых «отличается» в «различном направлении» (например: первые два являются «умеренными» версиями идеи «пива», в то время как последние две являются «более экстремальными» версиями)

Я знаю, что в WordNet есть API, но большинство слов (и фраз) в моем словаре связаны в более неформальной форме

(другой пример. «Гангстер» относится к [nun, orphan, rebel] {criminal, mafia boss, murderer}, где конечности меняются слева направо, а те, что в [], считаются «положительными конечностями», а те, что в { } являются "отрицательными конечностями")

В использовании:

  1. Пользователь вводит поисковый ввод (слово)
  2. Слово соответствует сестринским словам.
  3. У пользователя есть шанс "подстроить слово", изменяя конечности как минимум в 2 направлениях, как, например, в примерах выше.

Как лучше всего осуществить такой поиск - шаги 2 и 3 выше?

Я подумываю об использовании PHP / MySQL, так как это то, с чем я знаком, но какие есть лучшие альтернативы? Опять же - имейте в виду, что это не большой словарь. Это просто подборка общих слов.


Вот моя попытка ответить на это - это очень, очень просто ... предложения по улучшению приветствуются:

Слова таблицы MySQL:


id, (primary key, autoincrement) 
word (varchar 75), 
relatedword (varchar 75)
relationscore (int 11)
direction (tinyint, -1 or 1)

С учетом запроса $ word и $ direction:

"SELECT relatedword FROM words WHERE word='$word' AND direction=$direction ORDER BY relationscore DESC"

1 Ответ

0 голосов
/ 05 августа 2010

Мне непонятно, почему вы считаете, что Wordnet неуместен.Я думаю, что то, что вы называете «положительными / отрицательными конечностями» и «родственными словами», - это то, что лингвисты называют гипернимами (более общими синонимами) и гипонимами (более конкретными синонимами).Wordnet включает в себя достаточно хорошую модель из них.

Чтобы использовать Wordnet, вы могли бы найти «сестринские» слова, «поднявшись» на несколько уровней, используя отношение гипернимов («пива»).Так что, если вы начали с «пива», повышение на 3 уровня даст вам «напиток».Затем вы используете отношение гипонимов («напиток»), чтобы «опуститься» на несколько уровней, чтобы получить типы напитков с той же степенью специфичности, что и пиво.

Это пример интерфейса Wordnet, доступ к которому осуществляется через Nodebox Linguistics .Я считаю, что PHP имеет эквивалентный интерфейс Wordnet, хотя я никогда не использовал его.

>>> import en
>>> noun = 'beer'
>>> generalization_depth = 3
>>> sister_words = en.noun.hyponym(en.noun.hypernyms(noun)[generalization_depth][0])
>>> for word in reduce(lambda a,b: a+b, sister_words, []):
...     print word
... 
milk
wish-wash
potion
alcohol
alcoholic beverage
intoxicant
inebriant
hydromel
oenomel
near beer
ginger beer
mixer
cooler
refresher
smoothie
fizz
cider
cyder
cocoa
chocolate
hot chocolate
drinking chocolate
fruit juice
fruit crush
fruit drink
ade
mate
soft drink
coffee
java
tea
tea-like drink
drinking water
...