Для игрушечного проекта я хочу реализовать автоматизированную систему ответов на вопросы с помощью Lucene, и я пытаюсь найти разумный способ ее реализации. Основная операция заключается в следующем:
1) Пользователь вводит вопрос.
2) Система определит ключевые слова в вопросе.
3) Ключевые слова будут найдены в большой базе знаний, и совпадающие предложения будут показаны в качестве ответов.
Моя база знаний (то есть корпус) не структурирована. Это просто большой сплошной текст (скажем, руководство пользователя без каких-либо глав). Я имею в виду, что единственная структура состоит в том, что предложения и абзацы идентифицируются.
Я планирую рассматривать каждое предложение или абзац как отдельный документ. Чтобы представить ответ в контексте, я могу рассмотреть возможность сохранения одного предложения/абзаца до/после проиндексированного в качестве полезной нагрузки. Я хотел бы знать, имеет ли это смысл. Кроме того, мне интересно, есть ли другие проверенные и известные подходы для такого рода систем. Например, другой подход, который приходит на ум, состоит в том, чтобы индексировать большие фрагменты корпуса как документы с позициями токенов, а затем обрабатывать окрестности найденных ключевых слов для построения моих ответов.
Я был бы признателен за прямые рекомендации, основанные на опыте или интуиции, а также за учебные пособия или вводные материалы для систем ответов на вопросы с учетом Lucene.
Спасибо.
Ответ 1 · Xodarap
Индексация каждого предложения как документа вызовет у вас некоторые проблемы. Вы указали один: вам нужно будет хранить окружающие тексты в виде полезной нагрузки. Это означает, что вам нужно будет сохранить каждое предложение три раза (до, во время и после), и вам придется вручную вводить полезную нагрузку.
Если вы хотите, чтобы каждое предложение было документом, я бы рекомендовал придумать идентификатор для каждого предложения и сохранить его как отдельное поле. Затем вы можете отображать [ID-1, ID, ID+1] в каждом результате.
Однако более важный вопрос: как разбить текст на документы? Выявление семантически связанных областей кажется трудным, поэтому единственный способ сделать это по предложению/абзацу. Лучше было бы, если бы вы могли найти, какой текст является заголовком раздела, а затем поместить все в этот раздел в виде документа.
Вы также можете использовать указатель (если он есть в вашем корпусе). Условия там могут быть повышены, так как они предположительно более важны.
Ответ 2 · рейтинг 1 · Joel
Это не неразумный подход.
Одно из улучшений, которое вы могли бы рассмотреть, - это включение обратной связи по обучению, чтобы вы могли постоянно улучшать оценку контента по сравнению с поисковыми запросами. Для этого вы должны попросить пользователей оценить полученные ответы ("полезные или бесполезные"), чтобы вы могли начать ранжировать документы по ключевым словам на основе исторических данных. Вы можете классифицировать потенциальные документы как полезные/бесполезные для заданных ключевых слов, используя простой байесовский классификатор.
Ответ 3 · Sai Venkat
Вместо luncene, который выполняет индексацию текста, поиск и извлечение, я думаю, что с этим поможет использование чего-то вроде Apache Mahout. Mahout рассматривает текст как знание, и это делает ответ на вопрос лучше, чем просто сопоставление текста. Mahout - это ПО для машинного обучения и интеллектуального анализа данных, которое лучше подходит для этой области. Просто мысль очень высокого уровня.
--Сай