📜  自然语言处理 |专有名词提取

📅  最后修改于: 2022-05-13 01:54:51.505000             🧑  作者: Mango

自然语言处理 |专有名词提取

分块所有专有名词(用 NNP 标记)是执行命名实体提取的一种非常简单的方法。可以使用 RegexpParser 类创建将所有专有名词组合成 NAME 块的简单语法。

然后,我们可以在treebank_chunk的第一个标记句子上进行测试,以将结果与之前的配方进行比较:

代码 #1:在 treebank_chunk 的第一个标记句子上测试它

from nltk.corpus import treebank_chunk
from nltk.chunk import RegexpParser
from chunkers import sub_leaves
  
chunker = RegexpParser(r'''  
                       NAME:
                       {+}
                       ''')
      
print ("Named Entities : \n", 
       sub_leaves(chunker.parse(
               treebank_chunk.tagged_sents()[0]), 'NAME'))

输出 :

Named Entities : 
[[('Pierre', 'NNP'), ('Vinken', 'NNP')], [('Nov.', 'NNP')]]

注意:上面的代码返回所有专有名词——'Pierre'、'Vinken'、'Nov.'
NAME chunker 是 RegexpParser 类的简单用法。所有 NNP 标记词序列都被组合成 NAME 块。
如果只想分块人名,可以使用PersonChunker class代码 #2:PersonChunker 类

from nltk.chunk import ChunkParserI
from nltk.chunk.util import conlltags2tree
from nltk.corpus import names
  
class PersonChunker(ChunkParserI):
    def __init__(self):
        self.name_set = set(names.words())
          
    def parse(self, tagged_sent):
          
        iobs = []
        in_person = False
        for word, tag in tagged_sent:
            if word in self.name_set and in_person:
                iobs.append((word, tag, 'I-PERSON'))
            elif word in self.name_set:
                iobs.append((word, tag, 'B-PERSON'))
                in_person = True
            else:
                iobs.append((word, tag, 'O'))
                in_person = False
                  
        return conlltags2tree(iobs)

PersonChunker class通过遍历标记的句子来检查每个单词是否在其 names_set(从名称语料库构造)中。如果当前单词在 names_set 中,它使用 B-PERSON 或 I-PERSON IOB 标签,这取决于前一个单词是否也在 names_set 中。 O IOB 标记分配给不在 names_set 参数中的单词。 IOB 标签列表在完成后使用conlltags2tree()转换为 Tree。代码#3:在同一个标记句子上使用 PersonChunker 类

from nltk.corpus import treebank_chunk
from nltk.chunk import RegexpParser
from chunkers import sub_leaves
  
from chunkers import PersonChunker
chunker = PersonChunker()
print ("Person name  : ", 
       sub_leaves(chunker.parse(
               treebank_chunk.tagged_sents()[0]), 'PERSON'))

输出 :

Person name  : [[('Pierre', 'NNP')]]