python telegram bot совет

Прошу совета сообщества с таким вопросом. Есть задача написать Телеграмм бота на python. Он должен выводить заранее заготовленные сообщения из базы\файла при вводе определенных фраз (с этими этапами все понятно) Вопрос в том каким образом обойти проблему если пользователь напишет слово касса, кассу, кассы, кассой и по разному засклоняем слово или вообще ошибется в написании? Не хотелось бы смотреть в сторону машинного обучения и тяжелых алгоритмов. Можно ли обойтись решением попроще?

Заранее благодарю, за любые советы!


Ответы (1 шт):

Автор решения: gil9red

Накидал пример токенизации слов, нормализации и исправления опечаток:

  • Для токенизации и нормализации используется сторонний модуль pymorphy2
  • Для исправления опечаток используется встроенные модуль difflib ** Суть в сравнении двух слов на схожесть и при определенном значении коэффициента (подобрал опытным путем), два слова считаем достаточно похожими ** И возвращаем то слово, что наиболее похоже

Пример:

from typing import Optional, List
from difflib import SequenceMatcher

# pip install pymorphy2
import pymorphy2
from pymorphy2.tokenizers import simple_word_tokenize


morph = pymorphy2.MorphAnalyzer()


def get_tokens(text: str) -> List[pymorphy2.analyzer.Parse]:
    return [morph.parse(word)[0] for word in simple_word_tokenize(text)]


ALL_WORDS = ['замена', 'заменить', 'касса']


def fix_command(word: str) -> Optional[str]:
    rations = [
        (word2, SequenceMatcher(None, word, word2).ratio())
        for word2 in ALL_WORDS
    ]
    rations = [(word, ratio) for word, ratio in rations if ratio >= 0.7]
    if not rations:
        return 
    
    return max(rations, key=lambda x: x[1])[0]


commands = [
    'замена кассы',
    'заменить кассs',
    'замени кассу',
]
for command in commands:
    words = get_tokens(command)
    norm_words = [fix_command(word.normal_form) for word in words]
    print(command, norm_words)

Результат:

замена кассы ['замена', 'касса']
заменить кассs ['заменить', 'касса']
замени кассу ['заменить', 'касса']
→ Ссылка