Python|使用 spaCy 的命名实体识别 (NER)
命名实体识别 (NER)是一个标准的 NLP 问题,它涉及从一大块文本中发现命名实体(人、地点、组织等),并将它们分类为一组预定义的类别。 NER的一些实际应用包括:
- 扫描报道的人员、组织和地点的新闻文章。
- 为搜索优化提供简洁的功能:可以简单地搜索涉及的主要实体,而不是搜索整个内容。
- 快速检索 Twitter 帖子中讨论的地理位置。
NER 与 spaCy
spaCy 被认为是Python中最快的 NLP 框架,它为每个 NLP 任务实现了单个优化函数。由于易于学习和使用,只需几行代码即可轻松执行简单的任务。
安装 :
pip install spacy
python -m spacy download en_core_web_sm
使用 spaCy 的 NER 代码。
import spacy
nlp = spacy.load('en_core_web_sm')
sentence = "Apple is looking at buying U.K. startup for $1 billion"
doc = nlp(sentence)
for ent in doc.ents:
print(ent.text, ent.start_char, ent.end_char, ent.label_)
输出
Apple 0 5 ORG
U.K. 27 31 GPE
$1 billion 44 54 MONEY
在输出中,第一列指定实体,接下来的两列是句子/文档中的开始和结束字符,最后一列指定类别。
此外,有趣的是 spaCy 的 NER 模型使用大写作为识别命名实体的线索之一。同样的例子,在稍作修改后进行测试,会产生不同的结果。
import spacy
nlp = spacy.load('en_core_web_sm')
sentence = "apple is looking at buying U.K. startup for $1 billion"
doc = nlp(sentence)
for ent in doc.ents:
print(ent.text, ent.start_char, ent.end_char, ent.label_)
输出
U.K. 27 31 GPE
$1 billion 44 54 MONEY
“苹果”一词不再显示为命名实体。因此,在通常的标准化或词干预处理步骤之前使用 NER 很重要。
人们还可以使用他们自己的示例来训练和修改 spaCy 的内置 NER 模型。有几种方法可以做到这一点。以下代码显示了一种提供新实例和更新模型的简单方法。
import spacy
from spacy.gold import GoldParse
from spacy.language import EntityRecognizer
nlp = spacy.load('en', entity = False, parser = False)
doc_list = []
doc = nlp('Llamas make great pets.')
doc_list.append(doc)
gold_list = []
gold_list.append(GoldParse(doc, [u'ANIMAL', u'O', u'O', u'O']))
ner = EntityRecognizer(nlp.vocab, entity_types = ['ANIMAL'])
ner.update(doc_list, gold_list)
通过在 doc_list 中添加足够数量的示例,可以使用 spaCy 生成自定义的 NER。
spaCy 支持以下实体类型:
PERSON、NORP(国籍、宗教和政治团体)、FAC(建筑物、机场等)、ORG(组织)、GPE(国家、城市等)、LOC(山脉、水体等)、PRODUCT(产品) 、EVENT(事件名称)、WORK_OF_ART(书籍、歌曲名称)、LAW(法律文件名称)、LANGUAGE(命名语言)、DATE、TIME、PERCENT、MONEY、QUANTITY、ORDINAL 和 CARDINAL。
参考
- https://spacy.io/