Случайный падеж слов в term.words
den1s0v opened this issue · 4 comments
Я установил библиотеку rutermextract-0.3
при помощи pip
на Ubuntu-18.04, Python 3.6.
Запустил для проверки на рабочей книге. Всё выполнилось без проблем.
Просматривая возвращённый массив терминов terms
, обнаружил, что слова в массиве term.words
не всегда эквивалентны словам в term.normalized
. Т.е. слова те же, но могут стоять в другом падеже.
Выглядит так, что вхождения, найденные в тексте, остались в массиве в исходном виде, без нормализации.
А теперь код:
# In[]: from rutermextract import TermExtractor term_extractor = TermExtractor() with open('texts/patterns.txt', "r", newline="") as file: txt = file.read(); terms = list(term_extractor(txt)) print(len(terms), 'terms total') # Out[]: 4534 terms total # In[]: for term in terms: print("'%-30s'" % term.normalized, term.word_count, list(map(str, term.words))) # Out[]: (выдержки из вывода:) состояние words: ['состояние'] программа *words: ['программу']* команда words: ['команда'] код *words: ['кода']* подклассы *words: ['подклассами']* друг *words: ['другом']* пример *words: ['примере']* запрос words: ['запрос'] # ... цепочка обязанностей words: ['цепочка', 'обязанностей'] конкретные классы *words: ['конкретных', 'классов']* другая сторона *words: ['другой', 'стороны']* такие образ *words: ['таким', 'образом']* базовый класс *words: ['базовом', 'классе']* другие объекты *words: ['других', 'объектов']* сервисный объект *words: ['сервисного', 'объекта']* состояние редактора words: ['состояние', 'редактора'] # ... и т.д.
P.S. Думаю, это не является большой проблемой, т.к. со своей задачей библиотека справляется хорошо. Огромное спасибо автору за его труд!
Простите, ошибся, копируя код (браузер старый, не могу отредактировать текст issue).
Эта строка печати:
print("'%-30s'" % term.normalized, term.word_count, list(map(str, term.words)))
На самом деле выглядит так (разница небольшая, но есть):
print("{:<20} words:".format(term.normalized), list(map(str, term.words)))
@den1s0v всё так и есть: в term.words
слова в их изначальной форме, а в term.normalized
— нормализованная фраза целиком. Возможности получить нормализованные слова по отдельности сейчас нет. Отчасти это связано с тем, что нормализованная форма слова зависит и от других слов во фразе, поэтому непонятно, как это должно работать.
Чтобы разделить нормализованную фразу на слова, можно использовать term.normalized.split()
.
Чтобы привести к начальной форме каждое слово само по себе, можно сделать так: [word.get_nominal() for word in term.words]
В первом случае из фразы состояние редактора
вы получите ['состояние', 'редактора']
, во втором — ['состояние', 'редактор']
. Разница небольшая, но есть :)
Если считаете, что такая функциональность нужна в библиотеке — присылайте пул-реквест :)
Стало понятнее, спасибо Большое!