命名实体识别,关系抽取

2019-07-11  本文已影响0人  青椒rose炒饭

命名实体(NEs):确切的名词短语,知识特定的个体,组织或者人,日期等。可以分解为两个任务:确定边界和确定类型。有一个问题是需要注意的,能够使用命名实体识别的句子必须his已经标注的,大概是因为命名实体识别是基于块的吧。

import nltk
from nltk.corpus import conll2000

sent = nltk.corpus.treebank.tagged_sents()[22]
print(sent)

use_binary = nltk.ne_chunk(sent,binary=True)
#使用for循环将没有识别出来的命名实体过滤掉,
#识别出来的会是树结构,不是命名实体的就是元组
for subtree in use_binary:
    if isinstance(subtree,type(use_binary)): print(subtree)

print("------------------------")

without_binary = nltk.ne_chunk(sent)
for subtree in without_binary:
    if isinstance(subtree,type(without_binary)): print(subtree)
使用和不使用binary的区别

使用了词典binary之后命名实体直接标注为NE,不使用是分别标注的。

关系抽取

命名实体识别之后就能提取他们之间存在的关系了,进行这一不是将文中所有的命名实体和关系的三元组(X,a,Y)都提取出来,a是命名实体X和Y之间的字符串,然后使用正则表达式从中抽取我们查找的关系。

import nltk
import re
IN = re.compile(r'.*\bin\b(?!\b.+ing)')
for doc in nltk.corpus.ieer.parsed_docs('NYT_19980315'):
    for rel in nltk.sem.extract_rels('ORG','LOC',doc,corpus='ieer',pattern=IN):
        print(nltk.sem.rtuple(rel))

其中正则表达式是为了去除in doing对结果的影响。\b匹配单词之间的空格选定单词非ing结尾,前面有 in的结构,
?的作用要匹配后面的需要先匹配前面的,!表示取反。

运行结果
上一篇下一篇

猜你喜欢

热点阅读