结构化数据: 实体和关系的规范和可预测的组织。
将自然语言句子这样的非结构化数据转换成结构化数据,然后利用强大的查询工具,如SQL。这种从文本中获取意义的方法被称为信息提取。
信息提取系统搜索大量非结构化文本,寻找特定类型的实体和关系,并用它们来填充有组织的数据库。这些数据库可以用来寻找特定问题的答案。
简单的信息提取系统结构
- 使用句子分割器将文档的原始文本分割成句
- 使用分词器将每个句子进一步细分为词
- 对每个句子进行词性标注
- 命名实体识别,寻找每个句子中提到的潜在的有趣的实体
- 使用关系识别搜索文本中不同实体间的可能关系
该系统将文档的原始文本作为输入,将生成的(entity, relation, entity)元祖链表作为输出。
def ie_preprocess(document):
sentences = nltk.sent_tokenize(document) #句子分割
sentences = [nltk.wold_tokenize(sent) for sent in sentences] #分词
sentences = [nltk.pos_tag(sent) for sent in sentences] # 词性标注
分块
用于命名实体识别的基本技术。
NP-分块(名词短语分块,NP-chunking)信息最有用的来源之一是词性标注。
定义分块语法,利用正则表达式规则定义。例如,规则:NP-分块是由可选的且后面跟着任意数目形容词(JJ)的限定词(DT)和名词(NN)组成:
grammer = "NP: {<DT>?<JJ>*<NN>+}
cp = nltk.RegexpParser(grammer)
result = cp.parse(sentence)
result.draw()
命名实体识别(NER)
系统的目标是识别所有文字提及的命名实体。这里可以分解成两个子任务:确定NE的边界和确定其类型。是一个非常适合用于分类器类型的方法。
NLTK提供了一个已经训练好的可以识别命名实体的分类器,使用nltk.ne_chunk()
访问。
sent = nltk.corpus.treebank.tagged_sents()[22]
print nltk.ne_chunk(sent, binary=True)
设置参数binary=True
,那么命名实体只被标注为NE;否则分类器会添加类型标签。
关系抽取
只要文本中的命名实体被识别,我们就可以提取它们之间存在的关系。
通常会寻找指定类型的命名实体之间的关系。方法之一:首先寻找所有(X,a,Y)形式的三元组,然后从a的实体中抽出正在查找的关系。
关系抽取可以使用基于规则的系统,它通常查找文本中的连结实体和相关词的特定模式;
或者使用机器学习系统,通常尝试从训练预料自动学习这种模式。
参考《Natural Language Processing with Python》