Использование NLTK и WordNet; как преобразовать глагол простого времени в формы причастия настоящего, прошедшего или прошедшего времени?

Используя NLTK и WordNet, как преобразовать глагол простого времени в его форму причастия настоящего, прошедшего или прошедшего времени ?

Например:

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

v = 'go'
present = present_tense(v)
print present # prints "going"

past = past_tense(v)
print past # prints "went"

person Software Enthusiastic    schedule 20.09.2010    source источник
comment
Нет никого, кто может ответить на этот вопрос?   -  person Software Enthusiastic    schedule 21.09.2010


Ответы (4)


Я думаю, что вам нужна библиотека NodeBox :: Linguistics. Это именно то, что:

print en.verb.present("gave")
>>> give
person msbmsb    schedule 21.09.2010
comment
Очень хорошо, думаю, я ищу только это ... Дай мне попробовать. - person Software Enthusiastic; 22.09.2010
comment
кажется, в нем есть какие-то ошибки. например en.is_verb (загрузка) вернет true, но en.verb.present (загрузка) сообщит об ошибке - person camino; 14.03.2013
comment
Да, нельзя импортировать en в python 3 - person pyd; 01.11.2017
comment
NodeBox заменен шаблоном (clips.uantwerpen.be/pattern). В настоящее время нет официальной поддержки шаблона Python 3, хотя кажется, что вы могли бы заставить его работать, создав ветку разработки (см .: github.com/clips/pattern/issues/62) - person Agargara; 16.01.2018
comment
Мне удалось заставить его работать на Windows / Anaconda / Python 3.6, просто нужно было сначала запустить pip install mysqlclient и git clone github.com/clips/pattern cd pattern git fetch git checkout development python setup.py установить позже. Отличная работа команды Pattern, поддержит вас в ближайшем случае. - person Anatoly Alekseev; 17.01.2018
comment
Как установить его в Python 2? - person Nathan B; 21.01.2018

С помощью NLTK это тоже можно сделать. Это может дать основную форму глагола. Но не точное время, но все же может пригодиться. Попробуйте следующий код.

from nltk.stem.wordnet import WordNetLemmatizer
words = ['gave','went','going','dating']
for word in words:
    print word+"-->"+WordNetLemmatizer().lemmatize(word,'v')

Результат:

gave-->give
went-->go
going-->go
dating-->date

Взгляните на вопрос о переполнении стека NLTK WordNet Lemmatizer: не следует ли лемматизировать все склонения слова? .

person Gunjan    schedule 07.11.2014
comment
Будьте осторожны со словами, вторая форма которых совпадает с инфинитивом другого глагола. Упал мой последний неудачный пример. WordNetLemmatizer не преобразует его в «падать», потому что на самом деле есть глагол «падать». Другой пример - «войлок». И нет никакого способа сказать лемматизатору, что глагол находится во второй форме. - person Dany; 03.03.2016
comment
Ответ на мой предыдущий комментарий - использовать метод _morphy. Он возвращает список возможных базовых форм. Если вы знаете, что слово, которое вы пытаетесь лемматизировать, отсутствует в базовой форме, вы можете исключить его из списка, полученного с помощью '_morphy', и выбрать одно из остальных. - person Dany; 03.03.2016
comment
Стоит отметить, что NLTK находится под лицензией GNU и не может использоваться в коммерческих целях без коммерческой лицензии. - person Gibolt; 18.07.2019
comment
Это не ответ на заданный вопрос, а на противоположный вопрос: вопрос заключался в том, как получить измененные формы из базовой формы, и этот ответ предоставляет способ получить базовую форму из измененной формы. - person Tom; 22.02.2021

Для Python3:

pip install pattern

тогда

from pattern.en import conjugate, lemma, lexeme, PRESENT, SG
print (lemma('gave'))
print (lexeme('gave'))
print (conjugate(verb='give',tense=PRESENT,number=SG)) # he / she / it

дает

give 
['give', 'gives', 'giving', 'gave', 'given'] 
gives

спасибо @Agargara за указание и авторам Pattern за их красивую работу, поддержите их ;-)

PS. Чтобы использовать большинство функций шаблона в Python 3.7+, вы можете использовать описанный трюк здесь

person Anatoly Alekseev    schedule 17.01.2018
comment
Я пробовал вот этот. Но у меня есть ошибки. Traceback (most recent call last): File "..\venv\lib\site-packages\pattern\text\__init__.py", line 609, in _read raise StopIteration StopIteration - person Sashini Hettiarachchi; 02.10.2019
comment
Сашини извините, автор, наверное, поменял упаковку. шаблон удаления pip, а затем шаблон установки pip -U сделает свое дело. Я обновил свой ответ. - person Anatoly Alekseev; 01.08.2020
comment
Это выдает ошибку, ОШИБКА: команда с ошибкой со статусом выхода 1: 'c: \ users \ prabhat \ appdata \ local \ programs \ python \ python39 \ python.exe' 'c: \ users \ prabhat \ appdata \ local \ programs \ python \ python39 \ lib \ site-packages \ pip_vendor \ pep517_in_process.py 'prepare_metadata_for_build_wheel' C: \ Users \ PRABHAT \ AppData \ Local \ Temp \ tmp3ucs_d6m 'Проверьте журналы для полного вывода команд. - person Prabhat kumar; 08.10.2020

JWI (библиотека WordNet от MIT) также имеет стеммер (WordNetStemmer), который преобразует различные морфологические формы таких слов, как («написано», «пишет», «написал») в их базовую форму. Похоже, это работает только для существительных (например, множественного числа) и глаголов.

Создание слов в Java с WordNet и JWNL также показывает, как сделайте такой вид стемминга с помощью JWNL, другой библиотеки Wordnet на основе Java:

person Hoda    schedule 23.06.2011