用python进行自然语言处理_《Python自然语言处理》学习笔记--从文本提取信息

783ff3b31038b28bc897ec7b9d8eb39f.png

《Python自然语言处理》学习笔记--从文本提取信息

标签 :NLP应用 NLTK

解决的问题

  1. 构建有个系统,从非结构化文本中提取结构化数据
  2. 识别一个文本中描述的实体和关系
  3. 哪些语料库适合于这项工作,且如何使用它们来训练评估模型

信息提取

如果我们现在有这样的一个需求--对公司和地点之间的关系感兴趣:给定一个公司,希望能够确定它做业务的位置;给定位置,会想发现哪些公司在该位置做业务。

如果数据直接是结构化数据,即公司、位置和业务数据对应,那么通过匹配对应就可以解决问题。

但是如果尝试是从文本中获取相似的信息,如:

The 

这样不能直接通过匹配来解决需求,需要首先将自然语言这样的非结构化数据转化为结构化数据,这种从文本获取意义的方法被称为信息提取

信息提取结构:

首先通过句子分割器将该文档的原始文本分割成句子,使用分词器将每个句子进一步细分为词;

from 

词性标注:接下来对每个句子进行词性标注,再通过命名体识别寻找每个句子中的实体;

# postag对单词进行词性标注,返回单词和词性的元组

关系识别:最后搜索文本中出现在彼此附近的实体对之间的特殊模式,并利用这些模式来建立元组记录实体间的关系;

词块划分

用于实体识别的基本技术是分块,小块显示词级别的标识符和词性标注,大块显示较高级别的组块。

c9c0085b5d3ff29ec9e2b371bd74a32d.png

名词短语词块划分

名词短语分块也叫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

264d46207129d0b1edd46afed7c59ecf.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

如果标记模式匹配位置重叠,最左边的优先匹配。例:如果将匹配两个连续名词的文本的规则应用到包含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

故这里可以用NP: {+}来代替NP: {},把fund也接受到块内。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值