Tokenization с исключением возвращает каждый токен обработчиком исключения - PullRequest
0 голосов
/ 06 октября 2019

Существует популярный российский анализатор НЛП под названием 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']

...