我正在尝试以某种(半)结构化方式存储日常句子(或者更确切地说,由句子表达的信息)。现在,我正在为此探索RDF的可行性。我对RDF不够熟悉,无法评估这是否合适。虽然我肯定会发生某种形式的信息丢失,但我不能说出于实际目的这是可以接受的。
很显然,诸如“鲍勃吃蛋糕”之类的句子可以直接映射到主语-谓语-宾语三元组(尽管我不知道如何正确处理谓语的时态):
:Bob :ate :Cake .
然后,我遇到了将单个三元组转换为四元组图的表示形式,该图形表示带有主语,谓语和宾语节点的语句。这样可以将陈述反映在陈述之上,例如“爱丽丝认为鲍勃吃了蛋糕。”:
_:stmt1 rdf:type rdf:Statement .
_:stmt1 rdf:subject :Bob .
_:stmt1 rdf:predicate :ate .
_:stmt1 rdf:object :Cake .
:Alice :thinks _:stmt1 .
到目前为止,一切都很好。但是,日常语言具有更多的构造。以下是一些(对我而言)更明显的东西:
条件:“如果爱丽丝说实话,鲍勃就吃了蛋糕。”
辅助动词:“爱丽丝可以烤蛋糕。”
颅骨补语:“爱丽丝喜欢吃蛋糕。”
否定:考虑到开放世界的假设,三元组:Bob :ate :Cake .
的存在是模棱两可的。在许多实际情况下,我认为明确表示否定很重要。
分离语:“(要么)爱丽丝或鲍勃都吃了蛋糕。”大多数人无法在日常语言中可靠地区分OR和XOR。
量词:“大多数人都喜欢蛋糕。”,“很少有人讨厌蛋糕。”
我认为可以通过相对简单的方式来实现。例如,“爱丽丝认为鲍勃没有吃蛋糕”可以表示为
_:stmt1 rdf:type rdf:Statement .
_:stmt1 rdf:subject :Bob .
_:stmt1 rdf:predicate _:predA .
_:predA :term :eat
_:predA :tense :past
_:predA :negated :true
_:stmt1 rdf:object :Cake .
:Alice :thinks _:stmt1 .
这还可以通过使用三元组来表达简单的副词(例如“鲍勃迅速吃掉蛋糕”)
_:predA :advmod :quickly
另一方面,仅靠调整就能迅速增加所需三元组的数量。我想您可以将其推到极限,并将依赖解析器的输出视为一组三元组,例如:
nsubj(thinks, Alice)
ccomp(thinks, ate)
nsubj(ate, Bob)
dobj(ate, cake)
...
但是,在查询图形或从图形推断时,我看不到它真正有用。
我阅读了几篇专注于将文本转换为RDF的科学论文,但大多数论文着重于简单事实的提取。除此之外,我找不到任何有用的资源来说明RDF如何表示简单的事实以外的知识。