文中の重要な単語 (つまり、「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 など) を使用して、正しく分類された最も近い他のキーワードにその単語をリンクさせたいと思います。おそらく編集距離の測定と関連していますが、これに関するドキュメントを見つけることができませんでした。