通过使用嵌套循环解析XML并返回多个值

时间:2011-06-21 07:57:56

标签: java xml for-loop xquery

我有一个大型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?" 1}}。问题是它返回所有答案标签。例如,如果询问 <answer> I like [personal_info/hobby] </answer> <answer>[personal_info/hobby]</answer> <answer>I enjoy [personal_info/hobby] </answer> ,则应返回

{{1}}

但返回文件中找到的所有答案标签。它也会一次又一次地重复它们,不可预知的次数。

你可以帮我解决这个问题吗?

数据集是通过运行各种脚本生成的,并由我收集和手动检查。如果有必要,我可以改变XML的结构来解决这个问题,但是如果可能的话就不会这样做。

感谢您花时间阅读我的问题,并考虑提供帮助。

2 个答案:

答案 0 :(得分:2)

我从Lucene(或者实际上是Solr)的经验中知道;相似度得分为0.1很快就达到了。这可以解释为什么返回文件中所有的答案。

在我使用Solr的搜索系统中,我使用约0.4~0.6的边界(取决于搜索的字段)。

您可以尝试显示每个问题的返回分数(如果XQueryUtil允许);查看正确匹配您要匹配的行的数量。这样你就可以选择一个好的/更好的边界。

另一种方法是尝试使用更高的值,看看你得到的答案是否少,并尝试通过反复试验找到正确的值。

答案 1 :(得分:0)

重要:solr中的分数始终是相对的。 您永远不应该将它们与固定值进行比较,因为它们在查询之间不同,并且它们没有标准化。

为什么不使用普通查询,将行设置为1或10并按顺序(自动)排序? 您可以将答案设为多值字段,并为每个q创建一个文档。

您应该通过自己的质量函数运行最佳匹配,以至少处理最少的语义匹配。