Как распознать параметры команды? nlp python

Здраствуйте! Пишу дипломную работу на тему "Разработка голосового ассистента на Python". Хотелось бы сделать, чтобы он распознавал не только шаблонные команды. Нашёл решение этой проблемы с помощью линейной регрессии, но после этого столкнулся с новой проблемой. Мне захотелось добавить команду поиска в гугле, а для этого нужно понять что искать. То есть из фразы "найди в интернете как подчинить карбюратор" нужно выделить часть "как подчинить карбюратор". Придумал такое решение: у каждой команды есть своё ключевое слово по типу "найди", "поищи" и т.д.; в функцию, которая отвечает за вытягивание параметров из фразы я передаю список таких слов и потом ищу в тексте слова, которые зависимы от этого слова (в случае примера это слово "найди", а зависимые от него: "интернете", "как"); слова которые могут быть частью команды я не учитываю (в случае примера это слово "интернет"), а остальные слова передаю в другую функцию, которая выделяет фразу, в которую они входят (в случае примера данная функция выдаёт "как подчинить карбюратор"). И вроде, всё прекрасно работает, но при этом в некоторых случаях оно работает неправильно. Может кто-то сможет найти в чём проблема или подсказать как это реализовать правильно по другому.

Код функций на python, используя библиотеку spacy:

import spacy

nlp = spacy.load("ru_core_news_sm")

def find_phrase(text_doc, start_words):
    phrase = []
    for token in text_doc:
        if token.head in start_words or token in start_words:
            phrase.append(token)

    if sorted(phrase) == sorted(start_words):
        return " ".join([token.text for token in text_doc if token in start_words])
    else:
        return find_phrase(text_doc, phrase)


def extract_params(text: str, keywords: list[str], ban_words: list[str]):
    delete_words = ["пожалуйста"]

    text = " ".join(word for word in text.split() if word.lower() not in delete_words)

    keywords_doc_lemmas = [token.lemma_ for token in nlp(" ".join(keywords))]
    ban_words_doc_lemmas = [token.lemma_ for token in nlp(" ".join(ban_words))]
    doc = nlp(text)

    # поиск ключевого слова
    index = -1
    for i, token in enumerate(doc):
        if token.lemma_ in keywords_doc_lemmas:
            index = i
            break

    # поиск зависимых слов
    start_words = []

    for token in doc:
        if (
            token.lemma_ not in ban_words_doc_lemmas
            and token.head == doc[index]
            and token != doc[index]
        ):
            start_words.append(token)

    return find_phrase(doc, start_words)

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