Как мне извлечь значения из строки и использовать эти значения в запросе к базе данных?

#python #chatbot #stemming #named-entity-recognition

#python #чат-бот #вытекающие #распознавание именованных объектов

Вопрос:

Я пытаюсь извлечь пользовательские объекты из предложения / вопроса и запросить их в базе данных, проблема в том, что у меня проблемы с извлечением объектов.

Моя таблица содержит 10000 строк и выглядит следующим образом:

 Car type | Owner
------------------
Sedan    | John
Hatchback| Mary
 

Пример вопроса, на который я хотел бы, чтобы программа ответила:

«Кто купил седан?»

В идеале правильным ответом здесь было бы John .

Могу ли я заставить программу понять контекст, стоящий за приведенным ниже предложением, и правильно ответить на него?

Это означает, что движок должен:

  1. Поймите, что «седан» в предложении «Кто купил седан» — это объект (тип автомобиля) и переведите его как Car Type = Sedan .
  2. Поймите, что слово «приобретенный» в предложении означает то же самое, что и «владелец».

Давайте предположим, что владелец тот же, что и человек, который его купил, никакой аренды или чего-либо подобного.

Конечная цель — понять сущности в этом предложении и преобразовать его в SQL-запрос.

Комментарии:

1. Используйте сопоставление, чтобы сопоставить такие слова, как sedan: ‘тип автомобиля’ и Purchased: ‘Владелец’, а затем проанализировать предложение и заменить этими соответствующими словами

2. Звучит как парный t-тест, когда вы уже собрали данные. Если вы еще не собрали данные, вам нужно собрать списки типов автомобилей и владельцев, а также слова, указывающие на владение / покупку автомобиля, и выполнить парный t-тест для типа автомобиля и владельца, отфильтрованный по списку «владелец». blog.minitab.com/blog/adventures-in-statistics-2 /…

3. @min2bro я тоже об этом подумал, но не будет ли немного сложно идентифицировать все такие похожие слова с «Принадлежащим»? Если пользователь задает вопрос: «Кто купил седан?», в идеале двигатель должен распознать, что купил = владелец, но это не так, поскольку слово «купил» не сопоставляется с «владельцем».

4. Вы задаете здесь более глубокий вопрос, я могу предложить вам использовать некоторые векторные алгоритмы слов для решения этой проблемы, где вы можете обучить и сопоставить эти алгоритмы, чтобы найти контекстуальное значение этих слов, которые являются синонимами, такими как Покупка, купленный и т.д. относится к владельцу. Это более сложный способ, хотя для этого вам нужно найти уже обученные модели.

Ответ №1:

То, что вы ищете, называется NLTK, что означает набор инструментов для обработки естественного языка.

Чтобы дать вам представление о том, что может делать эта библиотека, вот демонстрационный код с домашней страницы NLTK, показывающий, как маркировать и помечать текст:

 import nltk
sentence = "At eight o'clock on Thursday morning Arthur didn't feel very good."
tokens = nltk.word_tokenize(sentence)
print(tokens)
tagged = nltk.pos_tag(tokens)
print(tagged[0:6])
 

Ожидаемый результат:

 ['At', 'eight', "o'clock", 'on', 'Thursday', 'morning', 'Arthur', 'did', "n't", 'feel', 'very', 'good', '.']
[('At', 'IN'), ('eight', 'CD'), ("o'clock", 'JJ'), ('on', 'IN'), ('Thursday', 'NNP'), ('morning', 'NN')]
 

Теперь, учитывая, насколько просты ваши требования, вам может даже не понадобиться такая сложная библиотека, как NLTK, для решения ваших проблем, вы можете использовать простой заранее определенный поиск по строкам insead.

Например, если вам нужно всего лишь ответить на несколько вопросов, таких как:

«Кому принадлежит автомобиль типа [x]?»

«Сколько людей владеют автомобилями типа [x]?»

«Какой тип автомобиля принадлежит [x]?»

Вы можете использовать регулярное выражение для поиска совпадений по заранее заданным вопросам:

 import re

# get the question
question = "What kind of car does Joe own?"

# use regex to find matches for predefined question formats
car_type_for_match = re.findall(r"What type of car does (.*?) own?", question)

if car_type_for_match and len(car_type_for_match) > 0:
  print("Car type for: {}".format(car_type_for_match))
 

Который вы можете позже расширить дополнительными if утверждениями, чтобы добавить больше вопросов.

Желаю удачи.