我有一个wordnet数据库设置,我正在尝试为各种单词生成同义词。
例如,“最伟大”这个词。我会翻阅并找到几个不同的同义词,但它们都不符合定义 - 例如,一个是“最高级的”。
我猜我需要在给定语言中按频率进行某种检查,或者根据一个单词来获取基本单词(例如,最大 - >伟大,伟大 - >最佳)。
我应该使用什么表格来确保我的言语有点意义?
答案 0 :(得分:4)
词干分析器或词形变换器都不能让你从greatest
- > great
:
>>> from nltk.stem import WordNetLemmatizer
>>> from nltk.stem import WordNetLemmatizer, PorterStemmer
>>> porter = PorterStemmer()
>>> wnl = WordNetLemmatizer()
>>> greatest = 'greatest'
>>> porter.stem(greatest)
u'greatest'
>>> wnl.lemmatize(greatest)
'greatest'
>>> greater = 'greater'
>>> wnl.lemmatize(greater)
'greater'
>>> porter.stem(greater)
u'greater'
但似乎你可以利用PennTreeBank标签集的一些不错的属性从greatest -> great
获取:
>>> from nltk import pos_tag
>>> pos_tag(['greatest'])
[('greatest', 'JJS')]
>>> pos_tag(['greater'])
[('greater', 'JJR')]
>>> pos_tag(['great'])
[('great', 'JJ')]
让我们尝试一个疯狂的基于规则的系统,让我们从greatest
开始:
>>> import re
>>> word1 = 'greatest'
>>> re.sub('est$', '', word1)
'great'
>>> re.sub('est$', 'er', word1)
'greater'
>>> pos_tag([re.sub('est$', '', word1)])[0][1]
'JJ'
>>> pos_tag([re.sub('est$', 'er', word1)])[0][1]
'JJR'
>>> word1
'greatest'
现在我们知道我们可以构建我们自己的小型超级词干/ lemmatizer / tail_substituter,让我们写一条规则,说明一个单词是否给出了一个最高级的POS标签,而我们的tail_substituter
在我们干和JJR时给了我们JJ当我们转换时,我们可以有把握地说,这个词的比较和基本形式可以很容易地用tail_substituter
来获得:
>>> if pos_tag([word1])[0][1] == 'JJS' \
... and pos_tag([re.sub('est$', '', word1)])[0][1] == 'JJ' \
... and pos_tag([re.sub('est$', 'er', word1)])[0][1] == 'JJR':
... comparative = re.sub('est$', 'er', word1)
... adjective = re.sub('est$', '', word1)
...
>>> adjective
'great'
>>> comparative
'greater'
现在可以让你从greatest -> greater -> great
开始。来自great -> best
有点奇怪,因为词汇上它们并没有相关性,尽管它们的语义相对似乎是相关的。
所以我认为great -> best
是一个有效的转换