Как использовать NLP в python для анализа вопросов из чата - PullRequest
0 голосов
/ 01 июля 2019

Я написал чат-бота на 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.  

1 Ответ

1 голос
/ 03 июля 2019

ТЛ: др

Кажется, что у вас в основном намерение / сущность проблема.

1) Анализируйте каждое сообщение чата предложение за предложением. Это можно решить с помощью классификации намерений.

2) Использовать какое-то соответствие, например соответствие на основе правил spaCy Эту проблему можно решить с помощью извлечения сущности.


Намерение

Намерение - это классификация всего предложения.

Например, у вас может быть намерение: find_resource. Затем вам понадобятся примеры предложений, которые должны быть классифицированы как find_resource. Например:

X = [
  'Where can I find wood?',
  'What is the location of wood?',
  'Where do I find fire?',
  'Give me the coordinates of lemons.',
  'What is the best place to gather coal?',
  'Do you know where I can find tomatoes?',
  'Tell me a spot to collect wood.'
]

Вы можете обучить нейронную сеть для выполнения этой задачи классификации, но есть гораздо более простые модели, которые вы могли бы попробовать в первую очередь. Хорошей библиотекой машинного обучения является scikit-learn , которая предоставляет готовые традиционные методы классификации машинного обучения. Также имеется подпакет feature_extraction.text для работы с текстом.

Пример * * 1 032 # Training data ## X is the sample sentences X = [ 'Where can I find wood?', 'What is the location of wood?', 'Where do I find fire?', 'Give me the coordinates of lemons.', 'What is the best place to gather coal?', 'Do you know where I can find tomatoes?', 'Tell me a spot to collect wood.', 'How can I level up strength?', 'How do I train woodcutting?', 'Where can I practice my swimming skill?', 'Can I become better in running?', 'Where can I train my woodcutting skill?' ] ## y is the intent class corresponding to sentences in X y = [ 'find_resource', 'find_resource', 'find_resource', 'find_resource', 'find_resource', 'find_resource', 'find_resource', 'improve_skill', 'improve_skill', 'improve_skill', 'improve_skill', 'improve_skill' ] # Define the classifier from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import SGDClassifier from sklearn.pipeline import Pipeline clf = Pipeline( [ ('tfidf', TfidfVectorizer()), ('sgd', SGDClassifier()) ] ) ## Train the classifier clf.fit(X, y) # Test your classifier ## New sentences (that weren't in X and your model never seen before) new_sentences = [ 'What are the coordinates of wood?', 'Where can I find paper?', 'How can I improve woodcutting?', 'Where can I improve my jumping skill?' ] predicted_intents = clf.predict(new_sentences) print(predicted_intents) > ['find_resource' 'find_resource' 'improve_skill' 'improve_skill'] Извлечение сущности Извлечение сущности - это задача поиска определенной подстроки в вашем предложении. Это может быть location, time, person_name и т. Д. ... или в вашем случае resource_type. Типичные тренировочные данные выглядят так: X = [ 'Where can I find [wood](resource_type)?', 'What is the location of [wood](resource_type)?', 'Where do I find [fire](resource_type)?', 'How can I level up [strength](skill_type)?', 'Where can I train my [woodcutting](skill_type) skill?' ] Действительно spaCy предлагает самые современные модели. Он имеет предварительно обученные типы объектов, но также позволяет расширять его с помощью пользовательских объектов (resource_type в вашем случае). примечание 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. Вы можете смоделировать вашу проблему как: Intents: X = [ 'Where can I find cryptonite?' 'It can be found in lex luthors lab', 'yes' ] y = [ 'find_resource', 'provide_location', 'affirm' ] Объекты: X = [ 'Where can I find [cryptonite](resource_type)?' 'It can be found in [lex luthors lab](location)', 'yes' ] Хитрость в том, чтобы вы выяснили, действительно ли User 2 ответил на User 1 или нет. Кроме того, вам нужно сохранять состояние разговора, но это зависит от используемой вами платформы ботов. Тем не менее, это больше не проблема НЛП.

...