Я написал чат-бота на python, который подключается к разногласиям и может выполнять некоторые задачи. Одной из задач является запрос списка ресурсов конкретной компьютерной игры и возвращение подробного местоположения запрашиваемого ресурса.
Теперь я хочу интегрировать функциональность в чат, как можно проще. Поэтому я подумал, что могу использовать для этого методы НЛП.
Чтобы привести пример:
Пользователь 1 хочет знать, где он / она может найти ресурс "лес". Поэтому он / она спрашивает в чате раздора: «Где я могу найти дрова?»
Моя программа теперь сможет определить этот вопрос как действительный запрос для местоположения ресурса и ответить местоположением для ресурса "wood".
Это может включать несколько шагов:
- Определите, что на самом деле вопрос задается
- Определить имя ресурса, который был запрошен для
- ???
Я не новичок в программировании, однако я новичок в НЛП. Также я новичок в области глубокого обучения / уже разработанных моделей RNN с использованием тензор-потока / керас.
Для этого проекта я нашел nltk
и spaCy
, оба из которых являются модулями python, используемыми для NLP. Я уже узнал, что анализ текста состоит из нескольких отдельных работ, и не все из них могут представлять интерес для моего проекта. Но похоже, что и токенизация, и маркировка pos могут представлять интерес. Но так или иначе я изо всех сил пытаюсь найти жизнеспособный подход к задаче. Это уже начинается с того, как определить, является ли текстовое сообщение на самом деле вопросом . Мое исследование показало, что это не функциональность, предоставляемая библиотеками НЛП из коробки, и предварительно подготовленные модели глубокого обучения обычно используются для категоризации таких предложений.
Идеи, которые у меня были до сих пор:
1) Проанализируйте каждое предложение в сообщении чата за предложением
Токенизируйте предложение, используйте stemming, затем pos-тегирование, затем итерируйте все токены, чтобы выяснить:
- Глаголы "найти" (где я могу найти ...) или "получить" (где я могу получить ...) "или" есть "(где это ...) содержатся
- Проверьте, содержится ли существительное, и если да, то является ли это существительное допустимым именем ресурса (возможно, лучший подход - выяснить, существует ли на самом деле объект, связанный с глаголом. Возможно ли это даже?)
- Проверьте, если предложение, если вопрос, проверив, если последний токен является
?
2) Использовать какое-то соответствие, например spaCy
соответствие на основе правил
- Создайте несколько шаблонов, которые могут идентифицировать нужные типы вопросов / вопросов
- Соответствует шаблонам в каждом сообщении чата
- Если найдено, извлеките имя ресурса
3) Использовать не-НЛП методы
Если все остальное должно быть нежизнеспособным / слишком сложным, я все же могу придумать жестко закодированный подход, в котором я бы просто заранее определил пару типов вопросов и провел бы строковый поиск по их встречаемости в сообщениях чата и попытался бы вручную извлечь имена ресурсов используя строковые операции.
Вероятно, это будет наиболее подверженное ошибкам и негибкое решение, но я оставлю его в качестве запасного варианта.
Конечно, я хочу реализовать решение, которое будет работать настолько гибко, насколько это возможно, чтобы оно могло обнаруживать различные формы и типы вопросов без предварительного предварительного кодирования всех возможных типов вопросов. Это должно быть как можно ближе к «бот просто понимает чат и отвечает на вопрос» насколько это возможно.
Может ли кто-нибудь направить меня к хорошему решению? (не запрашивая полный код, а методы / шаги / библиотеки, которые я буду использовать)
Может быть, в качестве sidenote: в более поздней версии я хочу расширить функциональность. Тогда, возможно, что другие пользователи назовут местоположение ресурса в чате разногласий, и бот добавит это местоположение в свою базу данных, если она еще не содержится. Таким образом, разговор в чате может выглядеть так:
User 1: Where can I find cryptonite?
User 2: It can be found in lex luthors lab
Bot: Shall I add "lex luthors lab" as location for resource "cryptonite"?
User 2: @bot: yes
Bot: Done.