从NLTK递归提取新词的同义词
假设我有两个小字典:
posList=['有趣的','新颖的','创造性的','最先进的']
negList=['过时的','简单明了的','微不足道的']
我有一个新词,比如说“创新的”,这个词我不太了解。我想通过查找它的同义词来判断它的情感倾向。我会用NLTK的功能来找同义词,如果这些同义词不在我的小字典里,我就会递归地调用NLTK的功能,继续查找这些同义词的同义词。
开始的输入可能是这样的:
from nltk.corpus import wordnet
innovative = wordnet.synsets('innovative')
然后我会这样循环:
print synset
print synset.lemmas
这会产生这样的输出:
Synset('advanced.s.03')
[Lemma('advanced.s.03.advanced'), Lemma('advanced.s.03.forward-looking'), Lemma('advanced.s.03.innovative'), Lemma('advanced.s.03.modern')]
Synset('innovative.s.02')
[Lemma('innovative.s.02.innovative'), Lemma('innovative.s.02.innovational'), Lemma('innovative.s.02.groundbreaking')]
很明显,新词包括'advanced'(先进的)、'forward-looking'(前瞻性的)、'modern'(现代的)、'innovational'(创新的)、'groundbreaking'(突破性的),这些词都不在我的字典里。所以现在我应该用这些新词作为起点,再次调用同义词的功能,直到没有新的词出现为止。
有没有人能给我一个示例代码,教我如何从Synset中提取这些词,并把它们放在一个集合结构里?
我觉得这涉及到Python中的re模块,但我对Python还很陌生。还有一点我需要说明的是,我只想要形容词,所以只要Lemmas中的's'和'a'符号,比如Lemma('advanced.s.03.modern'),而不是'v'(动词)或'n'(名词)。
之后我会尝试计算一个新词和字典中任意单词的相似度分数,我需要定义这个度量标准。这个问题比较复杂,因为形容词没有按照层级排列,而且根据我的知识,没有现成的度量标准。有没有人能给点建议?
1 个回答
你可以通过以下方式获取同义词的同义词。 (请注意,这段代码使用了NodeBox Linguistics库中的WordNet功能,因为它提供了更简单的方式来访问WordNet)。
def get_remote_synonyms(s, pos):
if pos == 'a':
syns = en.adjective.senses(s)
if syns:
allsyns = sum(syns, [])
# if there are multiple senses, take only the most frequent two
if len(syns) >= 2:
syns = syns[0] + syns[1]
else:
syns = syns[0]
else:
return []
remote = []
for syn in syns:
newsyns = en.adjective.senses(syn)
remote.extend([r for r in newsyns[0] if r not in allsyns])
return [unicode(i) for i in list(set(remote))]
据我所知,NLTK的所有语义测量功能都是基于上位词和下位词的层级关系,所以它们不能用于形容词。此外,如果你把WordNet的结果和像thesaurus.com这样的同义词词典的结果进行比较,会发现WordNet缺少很多同义词。