我研究了一些简单的语义网络实现和解析自然语言的基本技术。然而,我很少看到有项目尝试将这两者结合起来。
例如,考虑以下对话:
"the man has a hat""he has a coat""what does he have?" => "a hat and coat"
基于上述句子的语法树解析,一个简单的语义网络可能看起来像这样:
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']
然而,这种实现假设了文本片段“the man”和“he”指的是同一个网络实体这一先验知识。
你会如何设计一个系统来“学习”语义网络片段之间的这些关系?我习惯于基于创建简单的属性/值对训练集来思考机器学习/自然语言处理问题,并将其输入到分类或回归算法中,但我在以这种方式构建这个问题时遇到了困难。
最终,似乎我需要在语义网络之上叠加概率,但这将大大增加实现的复杂性。沿着这条线有没有什么先前的研究?我看了一些库,比如NLTK和OpenNLP,虽然它们有处理符号逻辑和解析自然语言的不错工具,但似乎都没有任何将一种转换为另一种的概率框架。
回答:
这类任务背后有相当多的历史。你最好的开始可能是查看问答系统。
我一直给出的普遍建议是,如果你有一个高度受限的领域,你知道所有可能被提及的事物以及它们的所有交互方式,那么你可能会非常成功。如果这更像是一个“开放世界”问题,那么要想出一些可以接受的工作方式将是极其困难的。
从自然语言中提取关系的任务被称为“关系提取”(有趣的是),有时也称为事实提取。这是一个相当大的研究领域,这个人为此写了博士论文,还有许多其他人也这样做。正如你所注意到的,这里有很多挑战,比如实体检测、指代消解等。这意味着你提取的实体和关系中可能会有很多“噪音”。
至于在知识库中表示已提取的事实,大多数人倾向于不使用概率框架。在最简单的层面上,实体和关系被存储为平面表中的三元组。另一种方法是使用本体来添加结构并允许对事实进行推理。这使得知识库的用途大大增加,但也增加了很多可扩展性问题。至于添加概率,我知道Prowl项目旨在创建一个概率本体,但在我看来它看起来还不够成熟。
关于概率关系建模的研究,主要是华盛顿大学的马尔可夫逻辑网络和斯坦福大学及其他地方的概率关系模型。我对这个领域有点脱节,但据我所知,这是一个困难的问题,而且都是早期阶段的研究。问题很多,主要是关于高效和可扩展的推理。
总的来说,这是一个好主意,也是一个非常合理的目标。然而,实现起来也非常困难。如果你想看看当前技术水平的一个光鲜例子(即,有很多人和资金可以做到什么),或许可以查看PowerSet。