存储和搜索自然语言句子结构树的数据库的最佳方法是什么?
使用OpenNLP的English Treebank解析器,我可以对任意句子进行相当可靠的句子结构解析。我想做的是创建一个工具,该工具可以从源代码中提取所有文档字符串,为文档字符串中的所有句子生成这些树,将这些树及其关联的函数名称存储在数据库中,然后允许用户使用自然语言查询来搜索数据库。
因此,给定该"This uploads files to a remote machine."函数的句子upload_files(),我将得到这棵树:
"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."具有相似关键字的句子相关联的条目,但是显然是在描述完全不同的行为。
"Checks a remote machine to find a user that uploads files."
关系数据库不能以自然的方式存储知识,您真正需要的是 知识库 或 本体 (尽管可以在关系数据库之上构建)。它将数据保存在三胞胎中<subject, predicate,object>,因此您的词组将存储为<upload_file(), upload, file>。有很多工具和方法可以在此类知识库中进行搜索(例如,Prolog是一种旨在执行此操作的语言)。因此,您要做的就是将句子从自然语言翻译为 KB三元组/本体图 ,将用户查询翻译为 不完整的三元组 (您的问题看起来像<?, upload, file>)或 联合查询 然后搜索您的知识库。OpenNLP将帮助您进行翻译,其余取决于您决定使用的具体技术。
<subject, predicate,object>
<upload_file(), upload, file>
<?, upload, file>