Python NLTK学习11(命名实体识别和关系抽取)

本系列博客为学习《用Python进行自然语言处理》一书的学习笔记。

命名实体识别

命名实体识别(NER)系统的目标是识别所有文字提及的命名实体。可以分解成两个子任务:确定NE的边界和确定其类型。 命名实体识别非常适用于基于分类器类型的方法来处理的任务。 NLTK有一个已经训练好的可以识别命名实体的分类器,可以使用函数nltk.ne_chunk()进行访问。如果我们设置参数binary=True,那么命名实体只被标注为NE。否则分类器会添加类型标签,如PERSON,ORGANIZATION以及GPE。如下:

    # 取出语料库中的一个句子
    sent = nltk.corpus.treebank.tagged_sents()[22]

    # 使用NE分块器进行命名实体识别,返回Tree对象,
    # Tree对象的label()方法可以查看命名实体的标签
    for tree in nltk.ne_chunk(sent, binary=True).subtrees():
        # 过滤根树
        if tree.label() == "S":
            continue

        print(tree)

以上代码我们设置参数binary=True得到如下结果:

(NE U.S./NNP)

(NE Brooke/NNP)

(NE University/NNP)

(NE Vermont/NNP College/NNP)

(NE Medicine/NNP)

如果设置参数binary=False则可以得到如下结果:

(GPE U.S./NNP)

(PERSON Brooke/NNP T./NNP Mossman/NNP)

(ORGANIZATION University/NNP)

(PERSON Vermont/NNP College/NNP)

(GPE Medicine/NNP)

关系抽取

一旦文本中的命名实体已被识别, 我们就可以提取它们之间的关系。我们通常会寻找指定类型的命名实体之间的关系。我们可以找出所有(X, a, Y)形式的三元组。X,Y是指定类型的命名实体,a表示X和Y之间关系的字符串。我们先看如下的例子:

    # 命名实体的关系是 X in Y
    re_in = re.compile(r'.*\bin\b(?!\b.+ing)')

    # ieer 是一个命名实体语料库
    for doc in nltk.corpus.ieer.parsed_docs('NYT_19980315'):
        # 我们抽取组织和位置之间的关系
        for rel in nltk.sem.extract_rels('ORGANIZATION', 'LOCATION', doc, corpus='ieer', pattern=re_in):
            print(rel['subjtext'], 'IN', rel['objtext'])

nltk.sem.extract_rels函数接受的参数主要是主实体名(ORGANIZATION),宾实体名(LOCATION),以及代表它们之间关系的正则表达式,该函数返回关系的列表,关系是字典结构。关系中的键subjtext可以取出主实体对象,关系中的键objtext可以取出宾实体对象。

以上代码的运行结果为:

WHYY IN Philadelphia

McGlashan & Sarrail IN San Mateo

Freedom Forum IN Arlington

Brookings Institution IN Washington

Idealab IN Los Angeles

Open Text IN Waterloo

WGBH IN Boston

Bastille Opera IN Paris

Omnicom IN New York

DDB Needham IN New York

Kaplan Thaler Group IN New York

BBDO South IN Atlanta

Georgia-Pacific IN Atlanta

其他章节链接

Python NLTK学习1(Text对象)

Python NLTK学习2(FreqDist对象)

Python NLTK学习3(语料库)

Python NLTK学习4(条件频率分布)

Python NLTK学习5(词性标注)

Python NLTK学习6(创建词性标注器)

Python NLTK学习7(对中文昵称进行性别分类)

Python NLTK学习8(正则表达式分块器)

Python NLTK学习9(评估分类器的方法)

Python NLTK学习10(评估分块器)

Python NLTK学习11(命名实体识别和关系抽取)


赞助作者写出更好文章


您还未登录,登录GitHub账号发表精彩评论

 GitHub登录


最新评论

    还没有人评论...

 

 

刘杰

29岁, 现居苏州

微信:

CoderJieLiu

邮箱:

coderjie@outlook.com

Github:

https://github.com/BurnellLiu

简介:

弱小和无知不是生存的障碍,傲慢才是!

Think Twice, Code Once!

本站: 登录 注册

苏ICP备16059872号-1 苏ICP备16059872号-2 . Copyright © 2017. http://www.coderjie.com. All rights reserved.

账号登录

注册 忘记密码