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方法的缺点解读一些改进方法的文章。
标签:入门,模型,实体,context,ORG,识别,NER,标注 From: https://blog.csdn.net/weixin_72032564/article/details/142771188