我有一个大型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的结构来解决这个问题,但是如果可能的话就不会这样做。
感谢您花时间阅读我的问题,并考虑提供帮助。
答案 0 :(得分:2)
我从Lucene(或者实际上是Solr)的经验中知道;相似度得分为0.1很快就达到了。这可以解释为什么返回文件中所有的答案。
在我使用Solr的搜索系统中,我使用约0.4~0.6的边界(取决于搜索的字段)。
您可以尝试显示每个问题的返回分数(如果XQueryUtil允许);查看正确匹配您要匹配的行的数量。这样你就可以选择一个好的/更好的边界。
另一种方法是尝试使用更高的值,看看你得到的答案是否少,并尝试通过反复试验找到正确的值。
答案 1 :(得分:0)
重要:solr中的分数始终是相对的。 您永远不应该将它们与固定值进行比较,因为它们在查询之间不同,并且它们没有标准化。
为什么不使用普通查询,将行设置为1或10并按顺序(自动)排序? 您可以将答案设为多值字段,并为每个q创建一个文档。
您应该通过自己的质量函数运行最佳匹配,以至少处理最少的语义匹配。