命名实体识别 (NER)
介绍
在本指南中,您将了解一种称为命名实体识别(或“NER”)的高级自然语言处理技术。
NER 是一项 NLP 任务,用于识别文本中的重要命名实体,例如人物、地点、组织、日期或任何其他类别。它可以单独使用,也可以与主题识别一起使用,并为内容添加大量语义知识,使我们能够理解任何给定文本的主题。
让我们开始加载所需的库和模块。
加载所需的库和模块
import nltk
from nltk.tokenize import word_tokenize
from collections import Counter
nltk.download('wordnet') #download if using this module for the first time
from nltk.stem import WordNetLemmatizer
from nltk.corpus import stopwords
nltk.download('stopwords') #download if using this module for the first time
from nltk.tokenize import word_tokenize
from nltk import word_tokenize, pos_tag, ne_chunk
nltk.download('words')
nltk.download('averaged_perceptron_tagger')
nltk.download('punkt')
nltk.download('maxent_ne_chunker')
我们将在本指南中使用以下文本:
textexample = "Avengers: Endgame is a 2019 American superhero film based on the Marvel Comics superhero team the Avengers, produced by Marvel Studios and distributed by Walt Disney Studios Motion Pictures. The movie features an ensemble cast including Robert Downey Jr., Chris Evans, Mark Ruffalo, Chris Hemsworth, and others. (Source: wikipedia)."
print(textexample)
输出:
Avengers: Endgame is a 2019 American superhero film based on the Marvel Comics superhero team the Avengers, produced by Marvel Studios and distributed by Walt Disney Studios Motion Pictures. The movie features an ensemble cast including Robert Downey Jr., Chris Evans, Mark Ruffalo, Chris Hemsworth, and others. (Source: wikipedia).
词语标记
第一步是将文本标记为句子,这在下面的第一行代码中完成。第二行对句子进行单词标记,而第三行打印标记后的句子。
sentences = nltk.sent_tokenize(textexample)
tokenized_sentence = [nltk.word_tokenize(sent) for sent in sentences]
tokenized_sentence
输出:
['Avengers'
词性 (POS) 标记
词性标注,也称为语法标注,是根据单词的定义和上下文,将文本中的单词标记为与特定词性相对应的过程。下面的代码行获取标记化的文本并将其传递给“nltk.pos_tag”函数以创建其 POS 标注。
pos_tagging_sentences = [nltk.pos_tag(sent) for sent in tokenized_sentence]
让我们将这两个步骤合并为一个函数并分析输出。下面的第一到第四行代码创建了对文本进行标记并执行 POS 标记的函数。第五行代码将该函数运行到我们的文本中,而第六行打印输出。
def preprocess(text):
text = nltk.word_tokenize(text)
text = nltk.pos_tag(text)
return text
processed_text = preprocess(textexample)
processed_text
输出:
('Avengers'
上面的输出显示每个标记都已标记为其词性。下面解释了一些常见的缩写:
- DT:限定词
- IN: 介词/从属连词
- JJ:形容词‘大’
- JJR:形容词,比较级‘更大’
- JJS:形容词,最高级‘最大’
- LS:列表标记
- NN:名词,单数‘desk’
- NNS:名词复数‘desks’
- NNP:专有名词,单数“Harrison”
- NNPS:专有名词,复数“美国人”
- PRP:人称代词“我”、“他”、“她”
- RB:副词非常、默默地,
- UH:感叹词
- VB:动词,基本形式为
- VBD:动词,过去式
分块
完成词性标注后,我们将进行分块。简单来说,分块的作用是在标注的基础上为句子添加更多结构。输出结果是将单词分组,称为“块”。
我们将对处理后的文本进行分块,这在下面的第一行代码中完成。第二到第四行代码进行分块,在我们的示例中,我们将只查看名词进行 NER 标记。
res_chunk = ne_chunk(processed_text)
for x in str(res_chunk).split('\n'):
if '/NN' in x:
print(x)
输出:
Avengers/NNS
Endgame/NN
superhero/NN
film/NN
(ORGANIZATION Marvel/NNP Comics/NNP)
superhero/NN
team/NN
(ORGANIZATION Avengers/NNPS)
(PERSON Marvel/NNP Studios/NNP)
(PERSON Walt/NNP Disney/NNP Studios/NNP)
Motion/NNP
Pictures/NNP
movie/NN
cast/NN
(PERSON Robert/NNP Downey/NNP Jr./NNP)
(PERSON Chris/NNP Evans/NNP)
(PERSON Mark/NNP Ruffalo/NNP)
(PERSON Chris/NNP Hemsworth/NNP)
others/NNS
(PERSON Source/NN)
wikipedia/NN
让我们探索一下上述输出。我们观察到单词标记“Endgame”、“film”和“Source”被标记为单数名词“NN”,而“Avengers”和“others”等标记被标记为复数名词“NNS”。另外,请注意,演员的名字“Robert”、“Evans”等已被标记为专有名词“NNP”。
结论
在本指南中,您了解了如何使用 nltk 执行命名实体识别。您了解了执行 NER 分析所需的三个重要阶段:词标记化、词性标记和分块。
要了解有关使用 Python 进行自然语言处理的更多信息,请参阅以下指南:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~