该章三个问题:
1:我们应该怎样建立一个系统,从非结构化的文章中提取出结构化的数据。
2:有哪些稳健的方法可以识别文章中的实体以及关系?
3: 哪些数据库适合用来做这些工作,我们怎样用他们训练并评测我们的模型?
第一节:提取信息
先将非结构化的数据转为结构化的数据,然后利用强大的搜索工具如sql对数据进行查询,这种获取语义的方法被称为信息提取。
1.1 信息提取结构
将文本分割为句子,句子分割为单词,为单词标记词性。识别有信息量的实体,根据他们的语境确定其关系。
第二节:分块
2.1 名词短语分块
用正则表达式构建分块语法,再对已经标注词性的句子进行分块:
2.2 标记模块
是一系列pos标记,与正则表达式模块很相似:
<DT>?<JJ.*>*<NN.*>+
但是还是有许多复杂的表达无法用该模块提取。需要继续优化。
2.3 用正则表达式分块,
如以上所示,建立语法规则 grammar
2.4 探索文章语料库
之前我们学过怎样用pos标记寻找三词短语:
用基于正则表达式的分块器会更加容易一些:
还可以加缝隙,排除不合适的元素:grammar= r'''NP: {<.*>+} }<VBD|IN>+{ 这样就排除了动词以及介词
Chunks的表达:可以用tags 或者 trees:
IOB-Tags: B: begin, I:inside, O:outsid B-NP:一个名词短语的开始
第三节:研发与测试分块器
简单的评估与基准
获得已经标注好的数据库的内容
print(conll2000.chunked_sents('train.txt',chunk_types=['NP'])[10])
以此为基础,训练n-gram分类器
可以将该一元分类器改为二元分类器,使用BigramChunker
训练基于分类器的分块器:与二元相比更加灵活,可以甄别多种可能有用的特征
7.4 语言结构中的递归现象
分级别,多次对句子中的结构进行深度分析分析。不过因为创造这种分级方法,查找错误是比较麻烦的,而且这种方法得确定深度等级,所以对分析复杂的句法并不是很合适。
--- 树:句法树
--- 遍历树:可以用递归函数来遍历树
7.5 识别命名实体
也可以像上面的通过分类器确定分块器的方法,通过数据训练,使其能够识别某些多字符命名实体。
7.6 提取关系
可以通过正则表达式,确定两实体之间的关系如(r'.*\bin\b(?!\b.+ing)' 该表达可以忽略现在分词ing的表达
用正则表达式可能会得到假阳性答案 false postives
总结: