我正在尝试为句子中重要的单词(即不是“a”或“the”)创建一个通用同义词标识符,并且我正在使用 python 中的自然语言工具包(nltk)。我遇到的问题是 nltk 中的同义词查找器需要词性参数才能链接到它的同义词。我尝试的解决方法是使用 nltk 中存在的简化词性标注器,然后减少第一个字母以便将此参数传递给同义词查找器,但这不起作用。
def synonyms(Sentence):
Keywords = []
Equivalence = WordNetLemmatizer()
Stemmer = stem.SnowballStemmer('english')
for word in Sentence:
word = Equivalence.lemmatize(word)
words = nltk.word_tokenize(Sentence.lower())
text = nltk.Text(words)
tags = nltk.pos_tag(text)
simplified_tags = [(word, simplify_wsj_tag(tag)) for word, tag in tags]
for tag in simplified_tags:
print tag
grammar_letter = tag[1][0].lower()
if grammar_letter != 'd':
Call = tag[0].strip() + "." + grammar_letter.strip() + ".01"
print Call
Word_Set = wordnet.synset(Call)
paths = Word_Set.lemma_names
for path in paths:
Keywords.append(Stemmer.stem(path))
return Keywords
这是我目前正在使用的代码,正如你所看到的,我首先对输入进行词形还原以减少从长远来看我将拥有的匹配数量(我计划在数万个句子上运行它),并且在理论上,我会在此之后对单词进行词干处理以进一步提高这种效果并减少我生成的冗余单词的数量,但是这种方法几乎总是以以下形式返回错误:
Traceback (most recent call last):
File "C:\Python27\test.py", line 45, in <module>
synonyms('spray reddish attack force')
File "C:\Python27\test.py", line 39, in synonyms
Word_Set = wordnet.synset(Call)
File "C:\Python27\lib\site-packages\nltk\corpus\reader\wordnet.py", line 1016, in synset
raise WordNetError(message % (lemma, pos))
WordNetError: no lemma 'reddish' with part of speech 'n'
我对将要运行的数据没有太多控制权,因此简单地清理我的语料库并不是一个真正的选择。关于如何解决这个问题的任何想法?
我做了一些更多的研究,我有一个有希望的领先优势,但我仍然不确定如何实现它。在未找到或错误分配的单词的情况下,我想使用相似度度量(Leacock Chodorow、Wu-Palmer 等)将单词链接到最接近正确分类的其他关键字。也许与编辑距离测量相结合,但我仍然无法找到任何类型的文档。