У меня проблемы с выполнением устранения неоднозначности Word Sense в Python с использованием алгоритма Lesk

Я новичок в Python и NLTK, поэтому, пожалуйста, потерпите меня. Я хочу найти смысл слова в контексте предложения. Я использую алгоритм Lesk WSD, но он выдает разные результаты при каждом запуске. Я знаю, что у Леска есть некоторая степень неточности. Но я думаю, что POS-тег повысит точность.

Алгоритм Леска принимает POS-тег в качестве аргумента, но принимает "n", "s", "v" в качестве входных данных, а не "NN", "VBP" или другие POS-теги, которые выводятся функцией pos_tag(), Я хотел бы знать, как помечать слова в форме 'n', 's', 'v' или, если есть метод, в котором я могу преобразовать 'NN','VBP' и другие теги в 'n ',' s ',' v ', поэтому я могу дать их в качестве входных данных для функции lesk(context_sentence,word,pos_tag).

Я рассчитываю оценку чувств каждого слова, используя SentiWordNet впоследствии.

    from nltk.wsd import lesk
    from nltk import word_tokenize
    import nltk, re, pprint
    from nltk.corpus import sentiwordnet as swn

    def word_sense():

        sent = word_tokenize("He should be happy.")
        word = "be"
        pos = "v"
        score = lesk(sent,word,pos)
        print(score)
        print (str(score),type(score))
        set1 = re.findall("'([^']*)'",str(score))[0]
        print (set1)
        bank = swn.senti_synset(str(set1))
        print (bank)

    word_sense()

1 ответ

Решение

nltk.wsd.lesk не возвращает счет, он возвращает предсказанный Synset:

>>> from nltk.corpus import wordnet as wn
>>> from nltk.corpus import sentiwordnet as swn
>>> from nltk import word_tokenize
>>> from nltk.wsd import lesk
>>> sent = word_tokenize("He should be happy".lower())
>>> lesk(sent, 'be', 'v')
Synset('equal.v.01')

lesk не идеален, его следует использовать только в качестве базовой системы для WSD.

Хотя это приятно

>>> ss = str(lesk(sent, 'be', 'v'))
>>> re.findall("'([^']*)'",ss)
['equal.v.01']

Проще получить идентификатор синтаксиса:

>>> lesk(sent, 'be', 'v').name()
u'equal.v.01'

Тогда вы можете сделать:

>>> swn.senti_synset(lesk(sent, 'be', 'v').name())
SentiSynset('equal.v.01')

Преобразовать POS tag в WN POS, вы можете просто попробовать: Преобразование POS-тегов из TextBlob в Wordnet-совместимые входы

Другие вопросы по тегам