2010-08-03 63 views
0

我实现小型字典数据库,在那里,我想根据它们之间的词法/语义相似做搜索搜索..词在DB - 通过词汇字典(语义相似)

例如,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) 
 

给定$单词查询和$方向:

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

回答

0

我不清楚为什么你认为Wordn et是不合适的。我认为你称之为“积极/消极的肢体”和“姊妹词”是语言学家所称的上位词(更一般的同义词)和下位词(更具体的同义词)。 Wordnet包含了一个相当不错的模型。

要使用Wordnet,您可以使用上位词('啤酒')关系,通过“上升”几个级别找到“姐妹”单词。所以,如果你开始使用“啤酒”,上升3个级别会给你“饮料”。然后,使用下位词('饮料')关系“下降”几个级别,以获得与啤酒具有相同特异性的饮料类型。

这是通过Nodebox Linguistics访问的Wordnet接口的示例。我相信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 
+0

很好,我想这也依赖于分类 - 例如,一个反叛并不一定是“坏”,但是当涉及到凶手/犯罪,还有的一些明显的负面意义。它本身并不是特殊性,而是(在这种情况下)“好人”,“坏人”分类的实际程度。在牛奶/啤酒案例中......啤酒会被认为比其他人更负面/更极端。 – ina 2010-08-05 00:23:46

+0

@ina,我明白你的意思了。由于这是一个非常主观的标准,我认为你不会找到任何具有“好/坏”分类的现有数据库。 – Cerin 2010-08-05 12:49:30