NER-命名实体识别 入门解读

NER在NLP领域算一个非常基础的问题,可以广泛应用于信息抽取、搜索引擎优化、情感分析、问答系统、推荐系统、市场营销等领域。主要方法有sequence labeling(序列标注)、interval prediction(区间预测)和question answering(问答)三种方法。

写在前面:刚入门NER时,读一些顶会的最新文章存在困难,在学习基础知识时整理了一些内容并加上了个人理解,可能也只适合初学者,如有不对之处,欢迎批评指正。

一、序列标注

        将NER任务转换为序列标注问题,首先需要有一个数据集定义输入输出的格式,例如输入分词后的结果【“张三”,“在”,“北京”,“大学”,“读书”】,采用BIO序列标注法输出标签为【“B-PER”,"O","B-ORG","I-ORG","O"】,B代表实体的开始,I代表实体的一部分,O表示非实体部分。其余还有BIOES等标注方法。

        然后采用词向量嵌入作为选择的特征输入给模型,词向量因为具有语义相关性,例如“国王”和“王后”的词向量更相近,而和“苹果”的向量相距较远,因此能帮助识别实体类型,且和独热编码比起来拥有稠密的分布,能节省计算资源而广泛使用。

        词向量的训练方式主要有Word2Vec和GloVe,由于有些词具有多种语义因此还可以融合上下文信息。最后选择模型,之前的主要是统计模型:HMM(隐马尔可夫模型)和CRF(条件随机场),后来发展为深度学习模型:CNN、LSTM,再后来是预训练模型例如BERT,最后将词向量和标签喂给模型训练,就能实现输入一个句子模型输出其中的实体和实体类型。

        By the way,说下为什么需要标注"B-PER"而不能直接写“PER”(这是我当时的疑惑),这样做主要是为了区分什么是同一实体,什么是不同实体,例如【“清华”,“大学”,“在”,“北京”,“大学”,“旁边”】,如果正常的话我们标注为【“B-ORG”,“I-ORG”,"O","B-ORG","I-ORG","O"】,如果追求方便直接标实体类型的话就成了【“ORG”,“ORG”,“O”,“ORG”,“ORG”,“O”】不知道前两个实体是一个实体,后两个实体是另一个实体。

        序列标注的关键就是为输入文本的每一个token分配一个标签。

二、区间预测

        区间预测方法和序列标注方法在流程上具有很多的相似之处,最大的不同是在数据集标注上,区间预测给出了实体的区间范围,下面是一个例子

输入文本:"Barack Obama was born in Hawaii."

输出标签:

{
  "Barack Obama": {"type": "PERSON", "span": ["0", "12"]},
  "Hawaii": {"type": "LOCATION", "span": ["25", "31"]}
}

        标注方法是两种方法的主要不同,在词向量嵌入和模型训练方面基本一致,在输出和损失函数选择方面根据情况可能略有不同。序列标注的方法更适合一些细粒度的标注,而区间方法对于一些重叠实体更灵活

三、问答方法

        使用问答(QA)方法解决命名实体识别(NER)任务是一种新颖的思路,提出问题的个数是N*T,N个句子,T种实体类型。

文本问题答案
"Barack Obama was born in Hawaii.""文本中提到的是什么人名?""Barack Obama"
"Barack Obama was born in Hawaii.""文本中提到的是什么地点?""Hawaii"

        输入表示:question+text,另外[CLS] 和 [SEP] 是在许多基于 Transformer 的自然语言处理模型(如 BERT)中使用的特殊标记。它们的作用分别是提示整体的开始以及分隔中间文本。在具体使用中可以这样使用:[CLS]文本中提到的人名是什么[SEP]张三在北京大学读书。

        模型选择:可以使用预训练的问答模型,如BERT、RoBERTa、ALBERT等,或构建一个新的QA模型。模型的选择应根据具体任务和数据集的特点来定。

        个人实际上感觉就是加了个prompt,向训练好的LLM直接提问得到答案,自己需要做的就是一些微调,严格来说不能是一个独立的方法,下面是一个demo。

import os

# 设置模型缓存路径,默认在C盘Users/用户名/.cache
os.environ["TRANSFORMERS_CACHE"] = "D:\\transformers_cache"  # Windows

from transformers import pipeline

# 现在可以使用 pipeline加载问答模型
qa_pipeline = pipeline("question-answering")

# 输入文本
context = """
Tom has lived in Canada for three years.
"""

# 需要识别的实体
questions = [
    "What is the preson name in the context",
    "What is the location in the context",
    "What is the time in the context"

]
# 执行问答
for question in questions:
    result = qa_pipeline(question=question, context=context)
    print(f"Q: {question}\nA: {result['answer']}\n")

执行代码前,确保安装了pytorch和transformers库

输出结果

Q: What is the preson name in the context
A: Tom

Q: What is the location in the context
A: Canada

Q: What is the time in the context
A: three years

以上就是今天要讲的内容,本文仅仅简单介绍了解决NER任务的三种传统重要方法,后续会针对这三种传统NER方法的缺点解读一些改进方法的文章。

BiLSTM是一种循环神经网络模型,用于处理序列数据,如文本。它通过同时考虑前向和后向的上下文信息,能够更好地捕捉序列中的依赖关系。而命名实体识别NER)是指在文本中识别出具有特定意义的实体,如人名、地名、机构名等。BiLSTM+CRF是一种经典的NER模型方案,其中CRF(条件随机场)用于对BiLSTM的输出进行标签解码,从而得到最终的实体识别结果。这种模型在NER任务中取得了很好的效果,并且在后续的模型改进中也提供了启发。如果你对NER任务或者CRF感兴趣,可以阅读相关的文献和资料,深入了解这个领域的研究进展。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [BERT-BiLSTM-CRF命名实体识别应用](https://blog.csdn.net/xyisv/article/details/106191763)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [实体识别(3) -命名实体识别实践 BiLSTM-CRF](https://blog.csdn.net/yanqianglifei/article/details/123367111)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值