Определите ключевые слова и команды в естественном тексте

Я пытаюсь создать систему, которая идентифицирует различные команды и входные данные на основе письменного текста, введенного человеком. Я начну с примера, чтобы было понятнее. Предположим, пользователь вводит следующий текст:

Меня имя Джон Доу, мой возраст 28 лет, мой адрес Баркли-стрит, тел. 7 Гавана. Мне нравится шоколадный торт с клубникой и ванилью.

Основываясь на наборе предопределенных маркеров (например, «имя», «возраст», «адрес», «мне нравится»), я хотел бы определить их соответствующее значение (например, «Джон Доу ", "28", "Баркли-стрит... Гавана", "Шоколадный торт... ванильный").

Моя текущая попытка состояла в том, чтобы решить эту проблему с помощью некоторых шаблонов регулярных выражений: для каждого маркера я построил регулярное выражение, говорящее что-то вроде «если вы найдете маркер X, возьмите весь текст между ним и любым из маркеров X, Y, Z, которые вы могли бы найти". Это было извлечение текста между маркерами, но построение всего на основе регулярных выражений будет очень громоздким, особенно если я начну учитывать гибкость и небольшие вариации.

У меня нет большого опыта работы с НЛП, поэтому я не совсем уверен, с чего мне начать для правильного решения. Каковы некоторые подходящие подходы/решения/библиотеки для решения этой проблемы?


person Cosmin SD    schedule 07.09.2016    source источник
comment
Хотя я, возможно, не очень хорошо знаю НЛП, я могу сказать вам это со 100% уверенностью: регулярные выражения НЕ достаточно мощны, чтобы надежно интерпретировать текст. Естественные языки чрезвычайно сложны и часто противоречивы, и даже более мощные конструкции, чем регулярные выражения (например, контекстно-свободные грамматики).) недостаточно для обработки текстов на естественном языке.   -  person Sebastian Lenartowicz    schedule 07.09.2016
comment
Вы можете попытаться разделить строку на основе маркеров. regexformat.com/version_files/Rx5_ScrnSht01.jpg   -  person    schedule 08.09.2016
comment
Затем вы можете дополнительно разделить результаты на основе разных маркеров, пока не сможете сформулировать. Резюме: разделить на первичные маркеры, затем разделить на вторичные маркеры (которые могут быть подмножеством первичных).   -  person    schedule 08.09.2016
comment
Что ж, я почти согласен с Себастьяном в том, что регулярные выражения недостаточно эффективны и не подходят для этого сценария. Тем не менее, я не совсем уверен, с чего начать в отношении альтернатив. Проблема с маркерами заключается в том, что даже если я применяю набор правил, люди все равно могут писать такие варианты, как «Меня зовут Джон, и мне 28 лет», «Меня зовут Джон и мне 28 лет», «Меня зовут Джон», «Меня зовут Джон» и т. д. .   -  person Cosmin SD    schedule 09.09.2016
comment
Вы можете попробовать такой подход, как реализует парсер RegEx JSON, взгляните на Sub ParseJson(). Вы заменяете некоторые последовательности элементарных символов и словосочетания токенами, затем заменяете некоторые комбинации токенов другим одиночным токеном, повторяете в цикле, пока не получите токен верхнего уровня, что означает успешное распознавание. Затем извлеките необходимые данные на основе вложенности и структуры токенов.   -  person omegastripes    schedule 09.09.2016


Ответы (2)


То, что вы на самом деле пытаетесь сделать, - это «извлечение информации», в частности, распознавание именованных сущностей (NER), чтобы обнаружить интересующие упоминания. Для обзора см.:

https://en.wikipedia.org/wiki/Information_extraction

Чтобы действительно начать решать вашу проблему с чего-то близкого к современному, я бы посоветовал заглянуть в Stanford NLP Toolkit (http://nlp.stanford.edu/software/) для ваших основных задач NLP (токенизация, маркировка POS), но их инструментарий NER не поможет вам с вашими конкретными требованиями. Вы могли бы попробовать их SPIED, чтобы помочь вам, но я не использовал его и не могу ручаться за это. В конечном счете, если вы серьезно относитесь к этой задаче (которая на первый взгляд кажется довольно сложной), вам придется написать собственную систему NER для всех сущностей, которые вы хотите извлечь. Возможно, вы захотите включить некоторые из ваших регулярных выражений в качестве функций машинного обучения, которые помогут вам в решении вашей задачи (начните с простой библиотеки машинного обучения, такой как LibSVM или Mallet), но в любом случае это потребует много работы.

Удачи!

person ozborn    schedule 10.09.2016

Если требуется идентифицировать именованные объекты, такие как человек, место, организация, то можно использовать библиотеку StanfordNER в Python. Кроме того, существует решение для обучения собственной модели распознавания сущностей с использованием алгоритма CRF в Python. Вот статья, объясняющая то же самое.

person SidharthMacherla    schedule 09.04.2020