Существует популярный российский анализатор НЛП под названием PyMorphy2, который особенно хорошо справляется с лемматизацией или POS, но в настоящее время он плохо справляется с английским. Цель состоит в том, чтобы вернуть склеенные лемму + POS, если это русское слово. в противном случае он выдает TypeError по умолчанию (не может распознать POS английских слов), поэтому при попытке добавить обработчик исключений код выглядит так:
from nltk import sent_tokenize, word_tokenize, regexp_tokenize
from pymorphy2 import MorphAnalyzer
def preprocess(sent, pat=r"\b\w\w+\b", morph=MorphAnalyzer()):
try:
tok = [morph.parse(t)[0].normal_form+morph.parse(t)[0].tag.POS
for t in regexp_tokenize(sent, pat)]
except TypeError:
tok = [t for t in regexp_tokenize(sent, pat)]
return tok
Actual:
preprocess("я вижу кто-то наступил на грабли")
['видетьверб', 'ктоNPRO', 'тоCONJ', 'наступитьVERB', 'наPREP', 'граблиNOUN']
preprocess("я вижу кто-то наступил на грабли hello")
['вижу', 'кто', 'то','наступил', 'на', 'грабли', 'привет']
Временное (и смешное) решение:
tok = [morph.parse(t)[0].normal_form+str(morph.parse(t)[0].tag.POS)
for t in regexp_tokenize(sent, pat)]
['видетьVERB', 'ктоNPRO ',' тоCONJ ',' наступитьVERB ',' наPREP ',' граблиNOUN ',' helloNONE ']
Ожидаемое:
preprocess("я вижу кто-то наступил на грабли hello")
[' видетьVERB ', 'ктоNPRO', 'тоCONJ', 'наступитьVERB', 'наPREP', 'граблиNOUN', 'hello']