Я пытаюсь создать общий идентификатор синонима для слов в предложении, которые являются значимыми (т.е. не "a" или "the"), и я использую инструментарий естественного языка (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 и т. д.), чтобы связать слово с ближайшим правильно классифицированным другим ключевым словом. Возможно, в сочетании с мерой расстояния редактирования, но опять же я не смог найти никакой документации по этому поводу.