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

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

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

标签 :NLP应用 NLTK

解决的问题

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

信息提取

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

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

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

The 

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

信息提取结构:

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

from 

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

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

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

词块划分

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

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

名词短语词块划分

名词短语分块也叫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: {
?*}" # 根据规则来创建词块分析器 cp = RegexpParser(grammar) # 应用组块分析器 result = cp.parse(sentence) print(result) # 输出树状图 result.draw()

28109129d1aabfd9410b86be88afb9a3.png

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

多个规则词块划分

RegexpParser分块器以一个平面结构开始,轮流应用分块规则进行分块。所有的规则都被调用后,返回块结构。

例子由2个给i则组成了一个简单的分块语法,第一条规则匹配一个可选的限定词或所有名词,其后带有0个或多个形容词及一个名词;第二条规则匹配一个或多个专有名词。

from nltk import RegexpParser
grammar = r"""
  NP: {?*}   # chunk determiner/possessive, adjectives and noun
      {+}                # 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: {}  # Chunk two consecutive nouns"
cp = RegexpParser(grammar)
print(cp.parse(nouns))

22e2ddcad9505eca2970d48746ff872b.png

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

你可能感兴趣的:(用python进行自然语言处理)