从NLTK递归提取新词的同义词

0 投票
1 回答
1322 浏览
提问于 2025-04-17 15:54

假设我有两个小字典:

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 个回答

0

你可以通过以下方式获取同义词的同义词。 (请注意,这段代码使用了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缺少很多同义词。

撰写回答