用python进行自然语言处理_《Python自然语言处理》学习笔记--从文本提取信息
《Python自然语言处理》学习笔记--从文本提取信息标签 :NLP应用NLTK解决的问题构建有个系统,从非结构化文本中提取结构化数据;识别一个文本中描述的实体和关系;哪些语料库适合于这项工作,且如何使用它们来训练评估模型?信息提取如果我们现在有这样的一个需求--对公司和地点之间的关系感兴趣:给定一个公司,希望能够确定它做业务的位置;给定位置,会想发现哪些公司在该位置做业务。如果数据直...

《Python自然语言处理》学习笔记--从文本提取信息
标签 :NLP应用 NLTK
解决的问题
- 构建有个系统,从非结构化文本中提取结构化数据;
- 识别一个文本中描述的实体和关系;
- 哪些语料库适合于这项工作,且如何使用它们来训练评估模型?
信息提取
如果我们现在有这样的一个需求--对公司和地点之间的关系感兴趣:给定一个公司,希望能够确定它做业务的位置;给定位置,会想发现哪些公司在该位置做业务。
如果数据直接是结构化数据,即公司、位置和业务数据对应,那么通过匹配对应就可以解决问题。
但是如果尝试是从文本中获取相似的信息,如:
The
这样不能直接通过匹配来解决需求,需要首先将自然语言这样的非结构化数据转化为结构化数据,这种从文本获取意义的方法被称为信息提取。
信息提取结构:
首先通过句子分割器将该文档的原始文本分割成句子,使用分词器将每个句子进一步细分为词;
from
词性标注:接下来对每个句子进行词性标注,再通过命名体识别寻找每个句子中的实体;
# postag对单词进行词性标注,返回单词和词性的元组
关系识别:最后搜索文本中出现在彼此附近的实体对之间的特殊模式,并利用这些模式来建立元组记录实体间的关系;
词块划分
用于实体识别的基本技术是分块,小块显示词级别的标识符和词性标注,大块显示较高级别的组块。

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


多个规则词块划分
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))

如果标记模式匹配位置重叠,最左边的优先匹配。例:如果将匹配两个连续名词的文本的规则应用到包含3个连续名词的文本中,则只有前两个名词被分块。
nouns = [("money", "NN"), ("market", "NN"), ("fund", "NN")]
grammar = "NP: {<NN><NN>} # Chunk two consecutive nouns"
cp = RegexpParser(grammar)
print(cp.parse(nouns))

故这里可以用NP: {+}来代替NP: {},把fund也接受到块内。
更多推荐
所有评论(0)