Разбор XML с использованием вложенных циклов и возвращение нескольких значений - PullRequest
2 голосов
/ 21 июня 2011

У меня большой XML-файл, имеющий следующую структуру:

<brain>
<q>
  <question> What are your hobbies? </question>
  <question> What do you do for sake of fun? </question>
  <question> How do you spend your spare time? </question>
  <question> What are your interests? </question>
  <question> What do you enjoy most? </question>
  <answer> I like [personal_info/hobby] </answer>
  <answer>[personal_info/hobby]</answer>
  <answer>I enjoy [personal_info/hobby] </answer>
</q>

<q>
  <question> Where do you live? </question>
  <question> What city do you live in? </question>
  <question> Where are you from? </question>
  <question> Where are you living? </question>
  <question> Where is your residence? </question>
  <answer> I live at [personal_info/loc] </answer>
  <answer> I am living in [personal_info/loc]</answer>
  <answer> At [personal_info/loc]</answer>
  <answer>   [personal_info/loc]</answer>
</q>
.
.
.
</brain>

Как вы уже догадались, это база данных для чат-бота. Идея состоит в том, что пользователь введет вопрос (или любое другое предложение по этому вопросу), и наш чат-робот на основе Java запустит XQuery над этим файлом. Используемая мною реализация XQuery (известная как nux) обеспечивает нечеткое совпадение сходства предложений и поэтому возвращает предложения, которые частично совпадают. Вот некоторый код, чтобы проиллюстрировать это:

Nodes results = XQueryUtil.xquery(doc, "declare namespace lucene = \"java:nux.xom.pool.FullTextUtil\"; "
    + "for $q in /brain/q "
    + " for $question in $q/question"
    + " let $score := lucene:match($question, \"How are you\") "
    + " where $score > 0.1 "
    + " order by $score descending "
    + "return $q/answer");

Этот код должен циклически проходить через каждый brain/q, а затем q/question, и если его коэффициент подобия больше 0,1, он должен вернуть <answer> из того, что есть в <q>. Проблема в том, что он возвращает ВСЕ теги ответа. Например, если спросить "What are your hobbies?", он должен вернуть

  <answer> I like [personal_info/hobby] </answer>
  <answer>[personal_info/hobby]</answer>
  <answer>I enjoy [personal_info/hobby] </answer>

но возвращает все теги ответа, найденные в файле. Он также повторяет их снова и снова в течение непредсказуемого количества раз.

Не могли бы вы помочь мне в этом?

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

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

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

Я знаю по опыту с Lucene (или на самом деле Solr);что показатель сходства 0,1 достигается довольно быстро.Что объясняет, почему все ответы в файле возвращаются.

В поисковой системе, для которой я использую Solr, я использую границу около 0,4 ~ 0,6 (в зависимости от искомых полей).

Вы можете попытаться показать возвращенные баллы за вопрос (если XQueryUtil позволяет это);чтобы увидеть, насколько правильные строки соответствуют линиям, которые вы хотите сопоставить.Таким образом, вы можете выбрать хорошую / лучшую границу.

Другой способ - просто попытаться использовать более высокие значения и посмотреть, получите ли вы меньше ответов, и попытаться найти правильное значение методом проб и ошибок.

0 голосов
/ 22 июня 2011

Важно: оценки в solr всегда относительны.Никогда не следует сравнивать их с фиксированным значением, поскольку они отличаются от запроса к запросу и не нормализуются.

Почему бы не использовать обычный запрос, установить строки в 1 или 10 и (автоматически) упорядочить по количеству баллов?Вы можете сделать ответы многозначным полем и создать один документ для q.

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

...