一直对自然语言处理和知识图谱感兴趣,然而其细分领域中最感兴趣的领域或问题是开放式信息抽取。

这里简单记录下自己的探索历程和内心感受。

任务划分

信息抽取主要包含实体抽取、关系抽取和事件抽取,这里主要关注事件抽取。

可以用监督学习模型吗

因为是开放式信息抽取,没有标记语料和训练带标签数据的过程,甚至说事件的种类都不是固定已知的,所以不能用监督学习模型。

怎么做

打算借助基础nlp工具LTP,调研依存句法、语义角色标注、语义依存分析等功能。

简单对比

经过简单对比,觉得语义角色标注有遗漏的情况,而依存句法和语义依存效果相对较好,同时语义依存结果相对复杂,同时还存在一定的Bug。所以选择使用依存句法去入手。

调研相关文章和开源项目

在调研网上其他的基于句法的开放式信息抽取的文章和项目时,发现了lemonhu/open-entity-relation-extraction: Knowledge triples extraction and knowledge base construction based on dependency syntax for open domain text.。觉得该项目和我要做的相近,于是调研了其代码实现,发现里面的规则是硬编码的,写的比较死,拓展性比较差,于是便思索是否有别的更好的方案。

新的想法

苦思冥想着觉得这些规则不应该硬编码,而是别的可拓展或易于修改的方式。后来突然想到树也算图的一种特殊结构,所以树的遍历、树的路径匹配也可以看做图的遍历、图的子图的路径匹配,而最近刚搞了Neo4j,Neo4j自然可以视作一个高效的图计算引擎,因此将句法分析和Neo4j结合在一起搞的想法便初步形成了。相应的,实体可以看做图的节点,实体在事件中所扮演的角色可以看做是到中心词(动词)的边,依存树中的定语(和实体构成定中修饰关系)可以视作实体节点的属性,而状语作为对中心词(动词)的修饰可以视作事件中心词的属性。所以由依存树到知识图谱便对应起来了。于是乎我们可以去构建Cypher查询语句来实现实体和事件的抽取。

如下图:

pic1

深入Neo4j

由于涉及到一些图遍历相关的东西,所以自己便想着通过使用Neo4j的apoc拓展库来实现,之前使用了apoc.path.expand,不过后来发现自己用错了,更应该用的是apoc.path.subgraphNodes,然后写了几个语法发现在一些Case上的提取结果还算不错。

就难受住

不过当Case变得复杂的时候,发现依存句法解析的有些问题,自然也就导致部分提取不到,于是自己内心就变得沮丧了起来。这是自己想解决的问题呀,可是好难,自己也不知如何去实现,就难受住。

柳暗花明

后来想着要不试试别的工具的效果,包括语义角色标注和语义依存分析,结果竟然发现语义角色标注的解析结果还真的挺好的。

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Volantis 作为主题,总访问量为
载入天数...载入时分秒...
冀ICP备20001334号