![783ff3b31038b28bc897ec7b9d8eb39f.png](https://i-blog.csdnimg.cn/blog_migrate/e57b7afb3b2d7a6f6c1a66daef714af4.jpeg)
《Python自然语言处理》学习笔记--从文本提取信息
标签 :NLP应用 NLTK
解决的问题
- 构建有个系统,从非结构化文本中提取结构化数据;
- 识别一个文本中描述的实体和关系;
- 哪些语料库适合于这项工作,且如何使用它们来训练评估模型?
信息提取
如果我们现在有这样的一个需求--对公司和地点之间的关系感兴趣:给定一个公司,希望能够确定它做业务的位置;给定位置,会想发现哪些公司在该位置做业务。
如果数据直接是结构化数据,即公司、位置和业务数据对应,那么通过匹配对应就可以解决问题。
但是如果尝试是从文本中获取相似的信息,如:
The
这样不能直接通过匹配来解决需求,需要首先将自然语言这样的非结构化数据转化为结构化数据,这种从文本获取意义的方法被称为信息提取。
信息提取结构:
首先通过句子分割器将该文档的原始文本分割成句子,使用分词器将每个句子进一步细分为词;
from
词性标注:接下来对每个句子进行词性标注,再通过命名体识别寻找每个句子中的实体;
# postag对单词进行词性标注,返回单词和词性的元组
关系识别:最后搜索文本中出现在彼此附近的实体对之间的特殊模式,并利用这些模式来建立元组记录实体间的关系;
词块划分
用于实体识别的基本技术是分块,小块显示词级别的标识符和词性标注,大块显示较高级别的组块。
![c9c0085b5d3ff29ec9e2b371bd74a32d.png](https://i-blog.csdnimg.cn/blog_migrate/4d734a7f4450ce7f4ef697772723ac07.jpeg)
名词短语词块划分
名词短语分块也叫NP-分块,NP分块一般是比完整的名词短语更小的片段,因为NP分块被定义为:NP分块之间没有重合。因此修饰一个名词的任何介词短语或从句将不包括在相应的NP分块内。
NP分块的依据是词性标记。为了创建NP分块,首先需要定义分块语法,规定句子应该如何分块。
这里使用一个正则表达式规则定义一个NP分块:由可选的且后面跟着任意数目形容词(JJ)的限定词(DT)和名词(NN)组成。
from nltk import RegexpParser
sentence = [("the", "DT"), ("little", "JJ"), ("yellow", "JJ"),
("dog", "NN"),("barked", "VBD"), ("at", "IN"), ("the", "DT"), ("cat", "NN")]
# 用正则表达式建立标记模式
grammar = "NP: {<DT>?<JJ>*<NN>}"
# 根据规则来创建词块分析器
cp = RegexpParser(grammar)
# 应用组块分析器
result = cp.parse(sentence)
print(result)
# 输出树状图
result.draw()
![28109129d1aabfd9410b86be88afb9a3.png](https://i-blog.csdnimg.cn/blog_migrate/15432bf77a1a30345a20b4c1fc33e481.png)
![264d46207129d0b1edd46afed7c59ecf.png](https://i-blog.csdnimg.cn/blog_migrate/10a317fec3fe2edd6aac89dfaa7cf770.png)
多个规则词块划分
RegexpParser分块器以一个平面结构开始,轮流应用分块规则进行分块。所有的规则都被调用后,返回块结构。
例子由2个给i则组成了一个简单的分块语法,第一条规则匹配一个可选的限定词或所有名词,其后带有0个或多个形容词及一个名词;第二条规则匹配一个或多个专有名词。
from nltk import RegexpParser
grammar = r"""
NP: {<DT|PP$>?<JJ>*<NN>} # chunk determiner/possessive, adjectives and noun
{<NNP>+} # chunk sequences of proper nouns
"""
cp = RegexpParser(grammar)
sentence = [("Rapunzel", "NNP"), ("let", "VBD"), ("down", "RP"),("her", "PP$"), ("long", "JJ"), ("golden", "JJ"), ("hair", "NN")]
print(cp.parse(sentence))
![b033820968837e00b9c654a271d0f009.png](https://i-blog.csdnimg.cn/blog_migrate/a2a5ac04505c48aa162fa05cf6f59ece.png)
如果标记模式匹配位置重叠,最左边的优先匹配。例:如果将匹配两个连续名词的文本的规则应用到包含3个连续名词的文本中,则只有前两个名词被分块。
nouns = [("money", "NN"), ("market", "NN"), ("fund", "NN")]
grammar = "NP: {<NN><NN>} # Chunk two consecutive nouns"
cp = RegexpParser(grammar)
print(cp.parse(nouns))
![22e2ddcad9505eca2970d48746ff872b.png](https://i-blog.csdnimg.cn/blog_migrate/ec24ddf0e55e6abf66add2d8991accd6.png)
故这里可以用NP: {+}来代替NP: {},把fund也接受到块内。