搜索自然语句结构

时间:2011-02-10 16:19:34

标签: sql artificial-intelligence scalability nlp machine-learning

存储和搜索自然语言句子结构树数据库的最佳方法是什么?

使用OpenNLP's English Treebank Parser,我可以为任意句子获得相当可靠的句子结构解析。我想要做的是创建一个工具,可以从我的源代码中提取所有文档字符串,为doc字符串中的所有句子生成这些树,将这些树及其相关的函数名存储在数据库中,然后允许用户使用自然语言查询搜索数据库。

因此,给定函数"This uploads files to a remote machine."的句子upload_files(),我会得到树:

(TOP
  (S
    (NP (DT This))
    (VP
      (VBZ uploads)
      (NP (NNS files))
      (PP (TO to) (NP (DT a) (JJ remote) (NN machine))))
    (. .)))

如果有人输入了“如何上传文件?”这一查询,等同于树:

(TOP
  (SBARQ
    (WHADVP (WRB How))
    (SQ (MD can) (NP (PRP I)) (VP (VB upload) (NP (NNS files))))
    (. ?)))

如何在SQL数据库中存储和查询这些树?

我编写了一个简单的概念验证脚本,可以使用正则表达式和网络图解析混合执行此搜索,但我不确定如何以可扩展的方式实现此功能。

是的,我意识到使用简单的关键字搜索检索我的例子是微不足道的。我试图测试的想法是如何利用语法结构,所以我可以清除具有相似关键词但具有不同句子结构的条目。例如,使用上述查询,我​​不想检索与具有相似关键字的句子"Checks a remote machine to find a user that uploads files."相关联的条目,但显然描述了完全不同的行为。

3 个答案:

答案 0 :(得分:2)

关系数据库无法以自然的方式存储知识,您实际需要的是知识库本体(尽管它可以构建在关系数据库之上)。它将数据保存为三元组<subject, predicate, object>,因此您的短语将存储为<upload_file(), upload, file>。在这些KB中搜索有很多工具和方法(例如,Prolog是一种旨在实现此目的的语言)。因此,您所要做的就是将句子从自然语言翻译成 KB三元组/本体图,将用户查询翻译为不完整三元组(您的问题看起来像{{1 }}或联合查询,然后搜索您的KB。 OpenNLP将帮助您进行翻译,其余的取决于您决定使用的具体技术和技术。

答案 1 :(得分:2)

我同意ffriend您需要采取不同的方法,这种方法建立在知识库和自然语言搜索的现有工作之上。在关系数据库中存储无上下文的解析树不是问题,但是作为搜索的一部分进行有意义的解析树比较将非常困难。当你只是想利用一些关于语法关系的知识时,解析树真的太复杂了。如果将解析简化为依赖三元组,则可以使搜索问题更容易,并首先获得您感兴趣的语法关系。例如,您可以使用Stanford dependency parser,它生成一个无上下文的解析,然后从中提取依赖三元组。它为“此函数将文件上载到远程计算机”生成如下输出:

det(function-2, This-1)
nsubj(uploads-3, function-2)
dobj(uploads-3, files-4)
det(machine-8, a-6)
amod(machine-8, remote-7)
prep_to(uploads-3, machine-8)

在您的数据库中,您可以存储与该函数关联的这些三元组的简化子集,例如:

upload_file(): subj(uploads, function)
upload_file(): obj(uploads, file)
upload_file(): prep(uploads, machine)

当人们搜索时,你可以找到具有最重叠三元组的函数或者那些沿着这些行的东西,你可能还想要权衡不同的依赖关系或允许部分匹配等。你可能还想减少单词在三重奏中,可能是POS,取决于你需要的东西。

有很多人从事过自然语言搜索(比如Powerset),所以一定要搜索现有的方法。我在这里提出的方法非常简单,我可以想到很多例子会有问题,但我认为这些方面的某些方面可以很好地适用于受限制的域。

答案 2 :(得分:1)

这不是一个完整的答案,但如果您想在树上执行语言复杂的查询,最好的办法是预处理解析器输出并使用tgrep2进行搜索:

http://www.stanford.edu/dept/linguistics/corpora/cas-tut-tgrep.html

据我所知,Trgrep / tgrep2是用于搜索解析树的最灵活和功能最全的包。这不是您所要求的基于MySQL的解决方案,但我认为您可能有兴趣了解此选项。

Tgrep2允许您询问有关父母,后代和兄弟姐妹的问题,而其他解决方案不会保留解析的完整树结构或允许此类复杂查询。