NLP |提取命名实体
原文:https://www.geesforgeks.org/NLP-extracting-named-entities/
识别命名实体是一种特定类型的块提取,它使用实体标签和块标签。
常见的实体标签包括 PERSON、LOCATION 和 ORGANIZATION。POS 标记的句子被解析成具有正常组块的组块树,但是树标签可以是代替组块短语标签的实体标签。NLTK 已经有一个预先训练好的命名实体组块器,可以在 nltk.chunk 模块中使用ne_chunk()
方法。这个方法把一个句子分成一棵树。
代码#1:在树库_组块语料库的标记句子上使用 ne-chunk()
from nltk.corpus import treebank_chunk
from nltk.chunk import ne_chunk
ne_chunk(treebank_chunk.tagged_sents()[0])
输出:
Tree('S', [Tree('PERSON', [('Pierre', 'NNP')]), Tree('ORGANIZATION',
[('Vinken', 'NNP')]), (', ', ', '), ('61', 'CD'), ('years', 'NNS'),
('old', 'JJ'), (', ', ', '), ('will', 'MD'), ('join', 'VB'), ('the', 'DT'),
('board', 'NN'), ('as', 'IN'), ('a', 'DT'), ('nonexecutive', 'JJ'),
('director', 'NN'), ('Nov.', 'NNP'), ('29', 'CD'), ('.', '.')])
找到了两个实体标签:PERSON 和 ORGANIZATION。这些子树中的每一个都包含被识别为“个人”或“组织”的单词列表。
代码#2:使用所有子树的叶子提取命名实体的方法
def sub_leaves(tree, label):
return [t.leaves()
for t in tree.subtrees(
lambda s: label() == label)]
代码#3:使用方法从树上获取所有的人或组织的叶子
tree = ne_chunk(treebank_chunk.tagged_sents()[0])
from chunkers import sub_leaves
print ("Named entities of PERSON : ",
sub_leaves(tree, 'PERSON'))
print ("\nNamed entites of ORGANIZATION : ",
sub_leaves(tree, 'ORGANIZATION'))
输出:
Named entities of PERSON : [[('Pierre', 'NNP')]]
Named entites of ORGANIZATION : [[('Vinken', 'NNP')]]
一次处理多个句子,使用chunk_ne_sents()
。在下面的代码中,来自treebank_chunk.tagged_sents()
的前 10 个句子被处理以获得组织sub_leaves()
。
代码#4:我们来了解一下chunk_ne_sents()
from nltk.chunk import chunk_ne_sents
from nltk.corpus import treebank_chunk
trees = chunk_ne_sents(treebank_chunk.tagged_sents()[:10])
[sub_leaves(t, 'ORGANIZATION') for t in trees]
输出:
[[[('Vinken', 'NNP')]], [[('Elsevier', 'NNP')]], [[('Consolidated', 'NNP'),
('Gold', 'NNP'), ('Fields', 'NNP')]], [], [], [[('Inc.', 'NNP')],
[('Micronite', 'NN')]], [[('New', 'NNP'), ('England', 'NNP'),
('Journal', 'NNP')]], [[('Lorillard', 'NNP')]], [], []]