Обработка общих синонимов и частей речи с использованием nltk

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

8
задан Slater Victoroff 22 February 2015 в 21:51
поделиться