Ответы на вопросы с Lucene

Для игрушечного проекта я хочу реализовать автоматизированную систему ответов на вопросы с помощью Lucene, и я пытаюсь найти разумный способ ее реализации. Основная операция заключается в следующем:

1) Пользователь вводит вопрос.

2) Система определит ключевые слова в вопросе.

3) Ключевые слова будут найдены в большой базе знаний, и совпадающие предложения будут показаны в качестве ответов.

Моя база знаний (то есть корпус) не структурирована. Это просто большой сплошной текст (скажем, руководство пользователя без каких-либо глав). Я имею в виду, что единственная структура состоит в том, что предложения и абзацы идентифицируются.

Я планирую рассматривать каждое предложение или абзац как отдельный документ. Чтобы представить ответ в контексте, я могу рассмотреть возможность сохранения одного предложения/абзаца до/после проиндексированного в качестве полезной нагрузки. Я хотел бы знать, имеет ли это смысл. Кроме того, мне интересно, есть ли другие проверенные и известные подходы для такого рода систем. Например, другой подход, который приходит на ум, состоит в том, чтобы индексировать большие фрагменты корпуса как документы с позициями токенов, а затем обрабатывать окрестности найденных ключевых слов для построения моих ответов.

Я был бы признателен за прямые рекомендации, основанные на опыте или интуиции, а также за учебные пособия или вводные материалы для систем ответов на вопросы с учетом Lucene.

Спасибо.


person Ruggiero Spearman    schedule 25.01.2011    source источник
comment
Может быть, я должен также добавить, что память вызывает беспокойство. Я не хотел бы хранить всю свою базу знаний в памяти. Наверное, это исключает подходы с использованием хайлайтера.   -  person Ruggiero Spearman    schedule 25.01.2011
comment
Lucene очень быстр и эффективен, когда дело доходит до обработки больших наборов документов. По умолчанию индекс находится на диске, хотя вы можете сопоставить его с памятью.   -  person Joel    schedule 25.01.2011


Ответы (3)


Индексация каждого предложения как документа вызовет у вас некоторые проблемы. Вы указали один: вам нужно будет хранить окружающие тексты в виде полезной нагрузки. Это означает, что вам нужно будет сохранить каждое предложение три раза (до, во время и после), и вам придется вручную вводить полезную нагрузку.

Если вы хотите, чтобы каждое предложение было документом, я бы рекомендовал придумать идентификатор для каждого предложения и сохранить его как отдельное поле. Затем вы можете отображать [ID-1, ID, ID+1] в каждом результате.

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

Вы также можете использовать указатель (если он есть в вашем корпусе). Условия там могут быть повышены, так как они предположительно более важны.

person Xodarap    schedule 26.01.2011

Это не неразумный подход.

Одно из улучшений, которое вы могли бы рассмотреть, — это включение обратной связи по обучению, чтобы вы могли постоянно улучшать оценку контента по сравнению с поисковыми запросами. Для этого вы должны попросить пользователей оценить полученные ответы («полезные или бесполезные»), чтобы вы могли начать ранжировать документы по ключевым словам на основе исторических данных. Вы можете классифицировать потенциальные документы как полезные/бесполезные для заданных ключевых слов, используя простой байесовский классификатор.

person Joel    schedule 25.01.2011

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

--Сай

person Sai Venkat    schedule 25.01.2011
comment
какой алгоритм обучения Mahout вы бы порекомендовали для этой задачи? - person Joel; 25.01.2011
comment
Для меня это более или менее похоже на проблему классификации. - person Sai Venkat; 25.01.2011
comment
Спасибо. Это может быть многообещающим подходом; но моя текущая проблема заключается не в том, чтобы улучшить работу ответчика на вопрос. Я просто хочу увидеть лучший способ справиться с такой проблемой в контексте Lucene, как вызов. Я имею в виду, что меня больше интересует техническая проблема хранения большого количества неструктурированных данных на диске/в памяти и произвольного доступа к ним по нескольким ключевым словам. - person Ruggiero Spearman; 25.01.2011
comment
@Amaç - Lucene с радостью справится с очень большими наборами документов. Если вы не рассматриваете сотни миллионов документов или у вас очень ограниченное оборудование, вам, вероятно, не придется сильно беспокоиться о масштабировании. - person Joel; 25.01.2011