Устранение неоднозначности слов в NLTK Python

Я новичок в NLTK Python, и я ищу пример приложения, которое может устранять неоднозначность слов. У меня много алгоритмов в результатах поиска, но нет примера приложения. Я просто хочу передать предложение и узнать смысл каждого слова, обратившись к библиотеке wordnet. Спасибо

Я нашел похожий модуль в PERL. http://marimba.d.umn.edu/allwords/allwords.html Есть ли такой модуль в NLTK Python?


person thesensemakers    schedule 13.09.2010    source источник
comment
вот реализация Python: github.com/alvations/pywsd   -  person alvas    schedule 28.02.2014


Ответы (6)


Недавно часть кода pywsd была перенесена в новейшую версию NLTK 'в модуле wsd.py, попробуйте:

>>> from nltk.wsd import lesk
>>> sent = 'I went to the bank to deposit my money'
>>> ambiguous = 'bank'
>>> lesk(sent, ambiguous)
Synset('bank.v.04')
>>> lesk(sent, ambiguous).definition()
u'act as the banker in a game or in gambling'

Для повышения производительности WSD используйте библиотеку pywsd вместо модуля NLTK. В общем, simple_lesk() от pywsd работает лучше, чем lesk от NLTK. Я постараюсь как можно больше обновить модуль NLTK, когда буду свободен.


В ответах на комментарий Криса Спенсера обратите внимание на ограничения алгоритмов Леска. Я просто даю точную реализацию алгоритмов. Это не серебряная пуля, http://en.wikipedia.org/wiki/Lesk_algorithm

Также обратите внимание, что, хотя:

lesk("My cat likes to eat mice.", "cat", "n")

не дадут вам правильный ответ, вы можете использовать pywsd реализацию max_similarity():

>>> from pywsd.similarity import max_similiarity
>>> max_similarity('my cat likes to eat mice', 'cat', 'wup', pos='n').definition 
'feline mammal usually having thick soft fur and no ability to roar: domestic cats; wildcats'
>>> max_similarity('my cat likes to eat mice', 'cat', 'lin', pos='n').definition 
'feline mammal usually having thick soft fur and no ability to roar: domestic cats; wildcats'

@ Крис, если тебе нужен python setup.py, просто сделай вежливый запрос, я напишу ...

person alvas    schedule 22.06.2014
comment
К сожалению, точность просто ужасная. lesk("My cat likes to eat mice.", "cat", "n") = ›Synset('computerized_tomography.n.01'). А у pywsd даже нет установочного скрипта ... - person Cerin; 23.08.2014
comment
Уважаемый Крис, а вы пробовали другие варианты lesk? Esp. simple_lesk() или adapted_lesk? Известно, что исходный lesk имеет проблемы, поэтому в пакете доступны другие решения. en.wikipedia.org/wiki/Lesk_algorithm. Кроме того, я поддерживаю в свободное время, и это не то, чем я зарабатываю на жизнь ... - person alvas; 23.08.2014
comment
Да, я пробовал все варианты Lesk в вашем пакете, и ни один из них не работал с моим образцом. Мне пришлось создать вариант, который также использовал бы глоссы всех гипонимов и меронимов, связанных с этим словом, чтобы получить несколько положительных результатов, но даже тогда он был точен только на 15%. Проблема не в вашем коде, а в Леске. Это просто ненадежная эвристика. - person Cerin; 25.08.2014
comment
попробуйте максимизировать сходство. Может быть, лучше. Также я кодирую больше алгоритмов, но это осталось для code-sprint в сентябре. Также обратите внимание на более современные методы. Наконец, Most Frequent Sense обычно работает довольно хорошо, и современному уровню техники удается превзойти его на 1-2%, максимум на 5%, когда он отступает с MFS ... - person alvas; 25.08.2014
comment
Ребята, есть ли смысл взять помеченный вручную корпус (с синсетами, неоднозначными для человека) и обучить на нем какой-нибудь ML-классификатор? тогда обученный классификатор может быть включен в ваш пакет в качестве еще одного алгоритма устранения неоднозначности, если мы увидим, что его точность на текстах, невидимых во время обучения, высока) - person Anatoly Alekseev; 18.01.2018
comment
@AnatolyAlekseev см. - person alvas; 19.01.2018
comment
@alvas Почему при импорте модуля он говорит, что ему нужно прогреться? Каждый раз при импорте занимает около 25 секунд (и все остальные приложения перестают отвечать на запросы). - person John Strood; 24.09.2018
comment
Он загружается только один раз. Это сэкономит вам много времени позже после загрузки =) - person alvas; 25.09.2018
comment
@alvas Спасибо. Без обид, но загрузка рассола размером ~ 80 МБ делает все невосприимчивым, заставляет меня выбросить свой ноутбук: P - person John Strood; 26.09.2018
comment
Есть способ, чтобы он не загружался, но время запуска функций значительно увеличится. А 80 МБ - это на самом деле ничего особенного, нейронные сети сегодня занимают от 100 МБ до ГБ. - person alvas; 26.09.2018


Да, действительно, существует книга, написанная командой NLTK, в которой есть несколько глав по классификации и они подробно описывают как использовать WordNet. Вы также можете купить физическую версию книги в Safari.

К вашему сведению: NLTK написан преподавателями естественного языка программирования для использования в их вводных курсах программирования.

person Indolering    schedule 21.12.2011
comment
Насколько я понимаю, эта глава посвящена классификации, но не очень разбирается в словесной неоднозначности. - person geekazoid; 03.01.2014

В качестве практического ответа на запрос OP, вот реализация на python нескольких методов WSD, которые возвращают значения в виде наборов (-ов) NLTK, https://github.com/alvations/pywsd

Это включает в себя

  • алгоритмы Lesk (включая оригинальный Lesk, адаптированный Lesk и простой Lesk)
  • Базовые алгоритмы (случайное восприятие, первое ощущение, наиболее частое восприятие)

Его можно использовать как таковое:

#!/usr/bin/env python -*- coding: utf-8 -*-

bank_sents = ['I went to the bank to deposit my money',
'The river bank was full of dead fishes']

plant_sents = ['The workers at the industrial plant were overworked',
'The plant was no longer bearing flowers']

print "======== TESTING simple_lesk ===========\n"
from lesk import simple_lesk
print "#TESTING simple_lesk() ..."
print "Context:", bank_sents[0]
answer = simple_lesk(bank_sents[0],'bank')
print "Sense:", answer
print "Definition:",answer.definition
print

print "#TESTING simple_lesk() with POS ..."
print "Context:", bank_sents[1]
answer = simple_lesk(bank_sents[1],'bank','n')
print "Sense:", answer
print "Definition:",answer.definition
print

print "#TESTING simple_lesk() with POS and stems ..."
print "Context:", plant_sents[0]
answer = simple_lesk(plant_sents[0],'plant','n', True)
print "Sense:", answer
print "Definition:",answer.definition
print

print "======== TESTING baseline ===========\n"
from baseline import random_sense, first_sense
from baseline import max_lemma_count as most_frequent_sense

print "#TESTING random_sense() ..."
print "Context:", bank_sents[0]
answer = random_sense('bank')
print "Sense:", answer
print "Definition:",answer.definition
print

print "#TESTING first_sense() ..."
print "Context:", bank_sents[0]
answer = first_sense('bank')
print "Sense:", answer
print "Definition:",answer.definition
print

print "#TESTING most_frequent_sense() ..."
print "Context:", bank_sents[0]
answer = most_frequent_sense('bank')
print "Sense:", answer
print "Definition:",answer.definition
print

[out]:

======== TESTING simple_lesk ===========

#TESTING simple_lesk() ...
Context: I went to the bank to deposit my money
Sense: Synset('depository_financial_institution.n.01')
Definition: a financial institution that accepts deposits and channels the money into lending activities

#TESTING simple_lesk() with POS ...
Context: The river bank was full of dead fishes
Sense: Synset('bank.n.01')
Definition: sloping land (especially the slope beside a body of water)

#TESTING simple_lesk() with POS and stems ...
Context: The workers at the industrial plant were overworked
Sense: Synset('plant.n.01')
Definition: buildings for carrying on industrial labor

======== TESTING baseline ===========
#TESTING random_sense() ...
Context: I went to the bank to deposit my money
Sense: Synset('deposit.v.02')
Definition: put into a bank account

#TESTING first_sense() ...
Context: I went to the bank to deposit my money
Sense: Synset('bank.n.01')
Definition: sloping land (especially the slope beside a body of water)

#TESTING most_frequent_sense() ...
Context: I went to the bank to deposit my money
Sense: Synset('bank.n.01')
Definition: sloping land (especially the slope beside a body of water)
person alvas    schedule 03.01.2014

У NLTK есть API для доступа к Wordnet. Wordnet размещает слова как синсеты. Это даст вам некоторую информацию о слове, его гиперонимах, гипонимах, корневом слове и т. Д.

«Обработка текста Python с помощью NLTK 2.0 Cookbook» - хорошая книга, которая познакомит вас с различными функциями NLTK. Его легко читать, понимать и применять.

Кроме того, вы можете посмотреть другие статьи (за пределами области NLTK), в которых говорится об использовании Википедии для устранения неоднозначности слов.

person sprezzatura    schedule 02.01.2011

Да, это возможно с модулем wordnet в NLTK. Меры подобия, которые используются в инструменте, упомянутом в вашем сообщении, существуют и в модуле NLTK wordnet.

person Jaggu    schedule 18.09.2010