语义网络的概率生成

Cer*_*rin 9 nlp machine-learning data-mining

我研究了一些简单的语义网络实现和解析自然语言的基本技术.但是,我没有看到很多项目试图弥合两者之间的差距.

例如,考虑对话框:

"the man has a hat"
"he has a coat"
"what does he have?" => "a hat and coat"
Run Code Online (Sandbox Code Playgroud)

基于上述句子的语法树解析的简单语义网络可能看起来像:

the_man = Entity('the man')
has = Entity('has')
a_hat = Entity('a hat')
a_coat = Entity('a coat')
Relation(the_man, has, a_hat)
Relation(the_man, has, a_coat)
print the_man.relations(has) => ['a hat', 'a coat']
Run Code Online (Sandbox Code Playgroud)

然而,该实现假设先前知道文本段"人"和"他"指的是同一网络实体.

您将如何设计一个"学习"语义网络各段之间关系的系统?我习惯于在创建一个简单的属性/值对训练集的基础上考虑ML/NL问题,并将其提供给分类或回归算法,但我无法以这种方式解决这个问题.

最终,我似乎需要在语义网络之上叠加概率,但这会使实现变得非常复杂.沿着这些路线有没有现有技术?我看过一些类似于NLTK和OpenNLP的库,虽然他们有很好的工具来处理符号逻辑和解析自然语言,但似乎没有任何一种可用的框架可以将一个转换为另一个.

Sto*_*ken 4

这种任务背后有相当多的历史。您最好的开始可能是查看问题解答

我总是给出的一般建议是,如果您有一些高度受限的领域,您知道所有可能提到的事物以及它们相互作用的所有方式,那么您可能会非常成功。如果这更像是一个“开放世界”问题,那么想出一些可以接受的方法将是极其困难的。

从自然语言中提取关系的任务称为“关系提取”(有趣的是),有时也称为事实提取。这是一个相当大的研究领域,这个人做了一篇关于它的博士论文,就像许多其他人一样。正如您所注意到的,这里存在大量挑战,例如实体检测、照应解析等。这意味着您提取的实体和关系中可能存在大量“噪音”。

至于表示知识库中提取的事实,大多数人倾向于不使用概率框架。在最简单的层面上,实体和关系作为三元组存储在平面表中。另一种方法是使用本体来添加结构并允许对事实进行推理。这使得知识库变得更加有用,但也增加了很多可扩展性问题。至于添加概率,我知道Prowl项目旨在创建概率本体,但在我看来它并不是很成熟。

有一些关于概率关系模型的研究,主要是华盛顿大学的马尔可夫逻辑网络和斯坦福大学等地的概率关系模型。我对这个领域有点脱节,但这是一个难题,据我所知,这都是早期研究。存在很多问题,主要围绕高效且可扩展的推理。

总而言之,这是一个好主意,也是一件非常明智的事情。然而,实现起来也非常困难。如果你想看一个最先进的例子(即一群人和金钱可以实现什么),也许可以看看PowerSet