我试图以某种(半)结构化的方式存储日常句子 - 或者更确切地说是句子表达的信息。现在,我正在探索 RDF 的可行性。我对 RDF 不够熟悉,无法评估这是否合适。虽然我确信会有某种形式的信息丢失,但我不能说这对于实际目的是可以接受的。
显然,像“Bob ate the cake”这样的句子可以直接映射成主谓宾三元组(虽然我不知道如何正确处理谓词的时态):
:Bob :ate :Cake .
然后我遇到了具体化,它将单个三元组转换为 4-三元组图,表示具有主语、谓语和宾语节点的语句。这允许在陈述上反映陈述,例如,“Alice 认为 Bob 吃了蛋糕。”:
_:stmt1 rdf:type rdf:Statement .
_:stmt1 rdf:subject :Bob .
_:stmt1 rdf:predicate :ate .
_:stmt1 rdf:object :Cake .
:Alice :thinks _:stmt1 .
到目前为止,一切都很好。然而,日常语言有更多的结构。这里只是一些更明显的(对我来说):
条件:“如果 Alice 说真话,Bob 吃了蛋糕。”
辅助动词:“爱丽丝可以烤蛋糕。”
从句补充:“爱丽丝喜欢吃蛋糕。”
否定:鉴于开放世界假设,没有三元组
:Bob :ate :Cake .
是模棱两可的。在许多实际情况中,我认为明确否定是很重要的。析取:“(要么)爱丽丝或鲍勃吃了蛋糕。” 大多数人在日常语言中不能可靠地区分 OR 和 XOR。
量词:“大多数人喜欢蛋糕。”,“很少有人讨厌蛋糕。”
我假设有些可以以相对简单的方式实现。例如,“Alice 认为 Bob 没有吃蛋糕”可以表示为
_: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 .
这也可能允许通过使用三元组来表达简单的副词(例如“Bob 快速吃了蛋糕”),例如
_:predA :advmod :quickly
另一方面,单独的具体化会迅速增加所需三元组的数量。我想您可以将其推向极端,并将依赖解析器的输出视为一组三元组,例如:
nsubj(thinks, Alice)
ccomp(thinks, ate)
nsubj(ate, Bob)
dobj(ate, cake)
...
但是在查询图形或从中推断时,我看不到这真正有用。
我阅读了几篇侧重于将文本转换为 RDF 的科学论文,但其中大多数侧重于简单事实的提取。除此之外,我找不到任何好的资源来说明 RDF 如何有用/富有表现力/实用 RDF 来表示超越简单事实的知识。