Первое что нужно сделать при разработке поисковых, диалоговых и прочих систем, основанных на natural language processing — это научиться разбирать тексты пользовательских запросов и находить в них
сущности рабочей модели. Задача нахождения стандартных сущностей (geo, date, money и т.д.) в целом уже
решена, остается лишь выбрать подходящий
NER компонент и воспользоваться его функционалом. Если же вам нужно найти элемент, характерный для вашей конкретной модели или вы нуждаетесь в улучшенном качестве поиска стандартного элемента, придется создать свой собственный NER компонент или обучить какой-то уже существующий под свои цели.
Если вы работаете с системами вроде
Alexa или
Google Dialogflow — процесс обучения сводится к созданию простейшей конфигурации. Для каждой сущности модели вы должны создать список синонимов. Далее в дело вступают нейронные сети. Это быстро, просто, очень удобно, все заработает сразу. Из минусов — отсутствует контроль за настройками нейронных сетей, а также одна общая для данных систем проблема — вероятностный характер поиска. Все эти минусы могут быть совершенно не важны для вашей модели, особенно если в ней ищется одна-две принципиально отличающиеся друг от друга сущности. Но если элементов модели достаточно много, а особенно если они в чем-то пересекаются, проблема становится более значимой.
Если вы проектируете собственную систему, обучаете и настраиваете поисковые компоненты, например от
Apache OpenNlp,
Stanford NLP,
Google Language API,
Spacy или
Apache NlpCraft для поиска собственных элементов, забот, разумеется, несколько больше, но и контроль над такой системой заметно выше.
Ниже поговорим о том, как нейронные сети используются при поиске сущностей в проекте
Apache NlpCraft. Для начала вкратце опишем все возможности поиска в системе.