一句话,可以由任何词构成,可长可短,是一个非结构化的信息。那么为了要计算机理解一句话,我们视图将句子转化为结构化的形式
比如说:
“我下午要和小明在公司讨论一个技术问题”
1)小明是一个实体
2)参与者有两个:我和小明
3)地点设定是:公司
4)要做的事情是:讨论
5)讨论的内容是:问题
6)这个问题是一个技术问题
7)公司是一个地点
8)讨论是一种行为
9)我和小明有某种关系
10)下午是一个时间
1. 分块
分块就是根据句子中的词性和词,按照某种规则组合在一起形成了一个个分块,每个分块代表一个实体。常见的实体包括:组织、人员、地点、日期、时间等
以上面的例子为例,首先我们做名词短语分块,比如:技术问题。名词短语分块通过词性标记和一些规则就可以识别出来,也可以通过机器学习的方法识别
除了名词短语分块还有很多其他分块:介词短语,动词短语、句子
2.分块如何标记和存储呢?
可以采用IOB标记,I(inside,内部)、O(outside,外部)、B(begin, 开始),一个块的开始标记为B,块内的标识符序列标注为I,所有其他标识符标注为O
也可以用树结构来存储分块,用树结构可以解决IOB无法标注的另一类分块,那就是多级分块。多级分块就是一句话可以有多重分块方法,比如:我以我的最高权利惩罚你。这里面“最高权利”、“我的最高权利”、“以我的最高权利”是不同类型分块形成一种多级分块,这是无法通过IOB标记的,但是用树结构可以。这也叫做级联分块。具体树结构举个例子:
(S
(NP 小明)
(VP
(V 追赶)
(NP
(Det 一只)
(N 兔子))))
这是不是让你想到了语法树?
3.关系抽取
通过上面的分块可以很容易识别出实体,那么关系抽取实际就是找出实体和实体之间的关系,这是自然语言处理一个质的跨越,实体识别让机器认知了一种事物,关系识别让机器掌握了一个真相。
关系抽取的第一个方法就是找到(X, a, Y)这种三元组,其中X和Y都是实体,a是表达关系的字符串,这完全可以通过正则来识别,因为不同语言有这不同的语法规则,所以方法都是不同的,比如中文里的“爱”可以作为这里的a,但是“和”、“因为”等就不能作为这里的a
编程实现
from nltk.corpus import conll2000
print coll2000.chunked_sents('train.txt')[99]
参考资料来源:http://www.shareditor.com/