命名实体识别代码阅读

article/2025/9/19 6:00:02

中文命名实体识别 BERT中文任务实战 18分钟快速实战_哔哩哔哩_bilibili

注意注释

from transformers import AutoTokenizer
import time  # 时间start = time.time()
#加载分词器
tokenizer = AutoTokenizer.from_pretrained('hfl/rbt6')  #中文bertprint(tokenizer)#分词测试,并没有输入数据集,这行是在jupyterbook上查看分词是否运行的
tokenizer.batch_encode_plus([['海', '钓', '比', '赛', '地', '点', '在', '厦', '门', '与', '金', '门', '之', '间','的', '海', '域', '。'],['这', '座', '依', '山', '傍', '水', '的', '博', '物', '馆', '由', '国', '内', '一','流', '的', '设', '计', '师', '主', '持', '设', '计', ',', '整', '个', '建', '筑','群', '精', '美', '而', '恢', '宏', '。']],         #输入两个句子做测试truncation=True,padding=True,return_tensors='pt',   #转为tensoris_split_into_words=True)  #告诉编码器句子已经分词

数据集

import torch
from datasets import load_dataset, load_from_diskclass Dataset(torch.utils.data.Dataset):def __init__(self, split):#names=['O', 'B-PER', 'I-PER', 'B-ORG', 'I-ORG', 'B-LOC', 'I-LOC'],用记事本打开文件看到的,如果文本中有个人名,则label为122,三个字的名字#在线加载数据集#dataset = load_dataset(path='peoples_daily_ner', split=split)#离线加载数据集dataset = load_from_disk(dataset_path='./data')[split]#过滤掉太长的句子def f(data):return len(data['tokens']) <= 512 - 2dataset = dataset.filter(f)self.dataset = datasetdef __len__(self):return len(self.dataset)def __getitem__(self, i):tokens = self.dataset[i]['tokens']labels = self.dataset[i]['ner_tags']   #这两个标签应该是命名实体数据集默认的,因为people数据集只有那几个实体标签,o,b,ireturn tokens, labelsdataset = Dataset('train')tokens, labels = dataset[0]  #label是有实体就标注,比如5,6,无实体就0len(dataset), tokens, labels

 分别对应形态

数据整理(注释)

#数据整理函数
def collate_fn(data):tokens = [i[0] for i in data]  #由batch_size决定labels = [i[1] for i in data]  #i[1]是因为第一个label是clsinputs = tokenizer.batch_encode_plus(tokens,truncation=True,padding=True,return_tensors='pt',is_split_into_words=True) #对句子分词#print(tokenizer.decode(inputs['input_ids'][0]))#print(labels[0])#print(tokenizer.decode(inputs['input_ids'][0]))lens = inputs['input_ids'].shape[1]  #找出这一批次句子中最长的那句,lens代表当前句子加上cls,pad,sep的词个数#print(lens)for i in range(len(labels)):   #用7 代表补充的部分labels[i] = [7] + labels[i] #每个label的头部补充7,[7]是加在label[0]上,即cls变为7,【7, 0, 3, 4, 4, 4,。。。】#print('头',labels[i])labels[i] += [7] * lens     #每个label的尾部补充lens个数的7#print('尾',labels[i])labels[i] = labels[i][:lens] #所有句子统一裁剪到最长句子的长度return inputs, torch.LongTensor(labels)
labels = [i[1]:这里为i[1]是因为label的第一个是cls,可看下图

#查看数据样例
for i, (inputs, labels) in enumerate(loader):breakprint(len(loader))
print(tokenizer.decode(inputs['input_ids'][0]))
print(labels[0])for k, v in inputs.items():  #input_ids torch.Size([16, 95]),16是batch_size,95是不定的,是lensprint(k, v.shape)from transformers import AutoModel#加载预训练模型
pretrained = AutoModel.from_pretrained('hfl/rbt6')
pretrained = pretrained.cuda()  #预训练也要在gpu上运行,重点
#统计参数量
print(sum(i.numel() for i in pretrained.parameters()) / 10000)#模型试算
#[b, lens] -> [b, lens, 768]
for k, v in inputs.data.items():   #这里因为inputs属于字典形式,data数据是有三个,都是tensor形式,被inputs包裹,所以需要分别放在gpu上inputs.data[k] = v.cuda()
pretrained(**inputs).last_hidden_state.shape

pretrained = pretrained.cuda():预训练模型也放在CUDA上。

然后底下的inputs数据放cuda上,下面train()有解释

模型定义 

【python】——Python中的*和**的作用和含义_Kadima°的博客-CSDN博客_python * **

理解‘*‘,‘*args‘,‘**‘,‘**kwargs‘_callinglove的博客-CSDN博客

#定义下游模型
class Model(torch.nn.Module):def __init__(self):super().__init__()self.tuneing = False #fineturn预设为0self.pretrained = None #默认情况下,预训练模型不属于下游任务的一部分#下游任务self.rnn = torch.nn.GRU(768, 768,batch_first=True)self.fc = torch.nn.Linear(768, 8)def forward(self, inputs):if self.tuneing: #如果tuning,则认为自己的预训练模型也要训练out = self.pretrained(**inputs).last_hidden_stateelse:            #如果不tuning,则使用外部的预训练模型with torch.no_grad():out = pretrained(**inputs).last_hidden_stateout, _ = self.rnn(out)  #这个,_可看lstm示例代码#print('前',out.shape)out = self.fc(out).softmax(dim=2) #前 torch.Size([128, 157, 768]),fc层降为8,所以dim=2#print(out.shape)return outdef fine_tuneing(self, tuneing):self.tuneing = tuneing  #tuning模式下,预训练模型参数更新if tuneing:for i in pretrained.parameters():i.requires_grad = Truepretrained.train() #预训练模型训练模式self.pretrained = pretrained  #预训练模型属于自己模型的一部分else:for i in pretrained.parameters():i.requires_grad_(False)pretrained.eval()self.pretrained = Nonemodel = Model()model(inputs).shape

工具函数

#对计算结果和label变形,并且自注意力机制移除pad
def reshape_and_remove_pad(outs, labels, attention_mask):#变形,便于计算loss#[b, lens, 8] -> [b*lens, 8],把n句话合并在一起outs = outs.reshape(-1, 8)#[b, lens] -> [b*lens],n句话的label拼合在一起labels = labels.reshape(-1)#忽略对pad的计算结果,自注意力筛选#[b, lens] -> [b*lens - pad]select = attention_mask.reshape(-1) == 1outs = outs[select]labels = labels[select]return outs, labels#获取正确数量和总数
def get_correct_and_total_count(labels, outs):#[b*lens, 8] -> [b*lens]outs = outs.argmax(dim=1) #实体标签,筛选出概率最大的那个值correct = (outs == labels).sum().item()total = len(labels)#计算除了0以外元素的正确率,因为0太多了,包括的话,正确率很容易虚高select = labels != 0outs = outs[select]labels = labels[select]correct_content = (outs == labels).sum().item()total_content = len(labels)return correct, total, correct_content, total_content

train函数

from transformers import AdamW# setting device on GPU if available, else CPU,检查是否GPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print('Using device:', device)#Additional Info when using cuda
if device.type == 'cuda':print(torch.cuda.get_device_name(0))print('Memory Usage:')print('Allocated:', round(torch.cuda.memory_allocated(0) / 1024 ** 3, 1), 'GB')print('Cached:   ', round(torch.cuda.memory_reserved(0) / 1024 ** 3, 1), 'GB')#训练
def train(epochs):lr = 2e-5 if model.tuneing else 5e-4    #这里model.tuneing的值由下面model.fine_tuneing(True)决定device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#训练optimizer = AdamW(model.parameters(), lr=lr)criterion = torch.nn.CrossEntropyLoss()print('开始训练  ')model.train()for epoch in range(epochs):for step, (inputs, labels) in enumerate(loader):#模型计算s#[b, lens] -> [b, lens, 8]#inputs = inputs.to(device)for k, v in inputs.data.items():  #与上面一样inputs.data[k] = v.cuda()outs = model(inputs)  #out没必要放在gpu中,labels和inputs需要labels = labels.to(device)#print('是否  ',outs.is_cuda, labels.is_cuda)#对outs和label变形,并且移除pad#outs -> [b, lens, 8] -> [c, 8]#labels -> [b, lens] -> [c]outs, labels = reshape_and_remove_pad(outs, labels,inputs['attention_mask'])#梯度下降loss = criterion(outs, labels).to(device)loss.backward()optimizer.step()optimizer.zero_grad()if step % 50 == 0:counts = get_correct_and_total_count(labels, outs)accuracy = counts[0] / counts[1]accuracy_content = counts[2] / counts[3]print(epoch, step, loss.item(), accuracy, accuracy_content)torch.save(model, 'model/命名实体识别_中文.model')

这里头一段是检查是否能使用GPU,输出现在使用的显卡

for k, v in inputs.data.items():  inputs.data[k] = v.cuda()

因为要想使用GPU来训练,要把输入数据放在GPU上 ,但因为这里的inputs数据类型不是tensor,在前面**inputs时是dict字典形式,在inputs内部的数据是tensor形式,所以这里把inputs内部的数据通过循环都放在cuda上。

执行过程为通过 itmes() 方法将字典数据转化为 元组对 的形式,然后通过for 语句将 key 值赋给变量 k ,将 value 值赋给变量 v ,直至遍历结束

labels = labels.to(device)  标签也放在cuda上

至于outs其实不用 

训练和测试

#model.fine_tuneing(False)
#train(500)
print('参数量  ',sum(p.numel() for p in model.parameters()) / 10000)
#train(1)model.fine_tuneing(True)
train(200)
print(sum(p.numel() for p in model.parameters()) / 10000)
#train(2)#测试
def test():model_load = torch.load('model/命名实体识别_中文.model')model_load.eval()loader_test = torch.utils.data.DataLoader(dataset=Dataset('validation'),batch_size=128,collate_fn=collate_fn,shuffle=True,drop_last=True)correct = 0total = 0correct_content = 0total_content = 0for step, (inputs, labels) in enumerate(loader_test):if step == 5:breakprint(step)with torch.no_grad():#[b, lens] -> [b, lens, 8] -> [b, lens]for k, v in inputs.data.items():  #与上面一样,都放进cudainputs.data[k] = v.cuda()labels = labels.cuda()outs = model_load(inputs)#对outs和label变形,并且移除pad#outs -> [b, lens, 8] -> [c, 8]#labels -> [b, lens] -> [c]outs, labels = reshape_and_remove_pad(outs, labels,inputs['attention_mask'])counts = get_correct_and_total_count(labels, outs)correct += counts[0]total += counts[1]correct_content += counts[2]total_content += counts[3]print(correct / total, correct_content / total_content)test()# 测试
def predict():model_load = torch.load('model/命名实体识别_中文.model')model_load.eval()loader_test = torch.utils.data.DataLoader(dataset=Dataset('validation'),batch_size=32,collate_fn=collate_fn,shuffle=True,drop_last=True)for i, (inputs, labels) in enumerate(loader_test):breakwith torch.no_grad():# [b, lens] -> [b, lens, 8] -> [b, lens]for k, v in inputs.data.items():  # 与上面一样,都放进cudainputs.data[k] = v.cuda()labels = labels.cuda()outs = model_load(inputs).argmax(dim=2)for i in range(32):# 移除padselect = inputs['attention_mask'][i] == 1input_id = inputs['input_ids'][i, select]out = outs[i, select]label = labels[i, select]# 输出原句子print(tokenizer.decode(input_id).replace(' ', ''))# 输出tagfor tag in [label, out]:s = ''for j in range(len(tag)):if tag[j] == 0:s += '·'continues += tokenizer.decode(input_id[j])s += str(tag[j].item())print(s)print('==========================')predict()
end=time.time()
print('Running time: %s Seconds'%(end-start))

完整代码(使用GPU加速的bert命名实体识别),后面再加CRF

from transformers import AutoTokenizer
import time  # 时间
import torch
from datasets import load_dataset, load_from_disk
start = time.time()
#加载分词器
tokenizer = AutoTokenizer.from_pretrained('hfl/rbt6')  #中文bertprint(tokenizer)#分词测试,并没有输入数据集,这行是在jupyterbook上查看分词是否运行的
tokenizer.batch_encode_plus([['海', '钓', '比', '赛', '地', '点', '在', '厦', '门', '与', '金', '门', '之', '间','的', '海', '域', '。'],['这', '座', '依', '山', '傍', '水', '的', '博', '物', '馆', '由', '国', '内', '一','流', '的', '设', '计', '师', '主', '持', '设', '计', ',', '整', '个', '建', '筑','群', '精', '美', '而', '恢', '宏', '。']],         #输入两个句子做测试truncation=True,padding=True,return_tensors='pt',   #转为tensoris_split_into_words=True)  #告诉编码器句子已经分词class Dataset(torch.utils.data.Dataset):def __init__(self, split):#names=['O', 'B-PER', 'I-PER', 'B-ORG', 'I-ORG', 'B-LOC', 'I-LOC'],用记事本打开文件看到的,如果文本中有个人名,则label为122,三个字的名字#在线加载数据集#dataset = load_dataset(path='peoples_daily_ner', split=split)#离线加载数据集dataset = load_from_disk(dataset_path='./data')[split]#过滤掉太长的句子def f(data):return len(data['tokens']) <= 512 - 2dataset = dataset.filter(f)self.dataset = datasetdef __len__(self):return len(self.dataset)def __getitem__(self, i):tokens = self.dataset[i]['tokens']labels = self.dataset[i]['ner_tags']   #这两个标签应该是命名实体数据集默认的,因为people数据集只有那几个实体标签,o,b,ireturn tokens, labelsdataset = Dataset('train')tokens, labels = dataset[0]  #label是有实体就标注,比如5,6,无实体就0len(dataset), tokens, labels#数据整理函数
def collate_fn(data):tokens = [i[0] for i in data]  #由batch_size决定labels = [i[1] for i in data]  #i[1]是因为第一个label是clsinputs = tokenizer.batch_encode_plus(tokens,truncation=True,padding=True,return_tensors='pt',is_split_into_words=True) #对句子分词#print(tokenizer.decode(inputs['input_ids'][0]))#print(labels[0])#print(tokenizer.decode(inputs['input_ids'][0]))lens = inputs['input_ids'].shape[1]  #找出这一批次句子中最长的那句,lens代表当前句子加上cls,pad,sep的词个数#print(lens)for i in range(len(labels)):   #用7 代表补充的部分labels[i] = [7] + labels[i] #每个label的头部补充7,[7]是加在label[0]上,即cls变为7,【7, 0, 3, 4, 4, 4,。。。】#print('头',labels[i])labels[i] += [7] * lens     #每个label的尾部补充lens个数的7#print('尾',labels[i])labels[i] = labels[i][:lens] #所有句子统一裁剪到最长句子的长度return inputs, torch.LongTensor(labels)#数据加载器
loader = torch.utils.data.DataLoader(dataset=dataset,batch_size=8, #batch_size如果是16,则在tuning=true时gpu显存不足collate_fn=collate_fn,shuffle=True,drop_last=True)#查看数据样例
for i, (inputs, labels) in enumerate(loader):breakprint(len(loader))
print(tokenizer.decode(inputs['input_ids'][0]))
print(labels[0])for k, v in inputs.items():  #input_ids torch.Size([16, 95]),16是batch_size,95是不定的,是lensprint(k, v.shape)from transformers import AutoModel#加载预训练模型
pretrained = AutoModel.from_pretrained('hfl/rbt6')
pretrained = pretrained.cuda()  #预训练也要在gpu上运行,重点
#统计参数量
print(sum(i.numel() for i in pretrained.parameters()) / 10000)#模型试算
#[b, lens] -> [b, lens, 768]
for k, v in inputs.data.items():   #这里因为inputs属于字典形式,data数据是有三个,都是tensor形式,被inputs包裹,所以需要分别放在gpu上inputs.data[k] = v.cuda()
pretrained(**inputs).last_hidden_state.shape#定义下游模型
class Model(torch.nn.Module):def __init__(self):super().__init__()self.tuneing = False #fineturn预设为0self.pretrained = None #默认情况下,预训练模型不属于下游任务的一部分#下游任务self.rnn = torch.nn.GRU(768, 768,batch_first=True)self.fc = torch.nn.Linear(768, 8)def forward(self, inputs):if self.tuneing: #如果tuning,则认为自己的预训练模型也要训练out = self.pretrained(**inputs).last_hidden_stateelse:            #如果不tuning,则使用外部的预训练模型with torch.no_grad():out = pretrained(**inputs).last_hidden_state  #inputs是字典形式,dictout, _ = self.rnn(out)  #这个,_可看lstm示例代码#print('前',out.shape)out = self.fc(out).softmax(dim=2) #前 torch.Size([128, 157, 768]),fc层降为8,所以dim=2#print(out.shape)return outdef fine_tuneing(self, tuneing):self.tuneing = tuneing  #tuning模式下,预训练模型参数更新if tuneing:for i in pretrained.parameters():i.requires_grad = Truepretrained.train() #预训练模型训练模式self.pretrained = pretrained  #预训练模型属于自己模型的一部分else:for i in pretrained.parameters():i.requires_grad_(False)pretrained.eval()self.pretrained = Nonemodel = Model().cuda()#对计算结果和label变形,并且自注意力机制移除pad
def reshape_and_remove_pad(outs, labels, attention_mask):#变形,便于计算loss#[b, lens, 8] -> [b*lens, 8],把n句话合并在一起outs = outs.reshape(-1, 8)#[b, lens] -> [b*lens],n句话的label拼合在一起labels = labels.reshape(-1)#忽略对pad的计算结果,自注意力筛选#[b, lens] -> [b*lens - pad]select = attention_mask.reshape(-1) == 1outs = outs[select]labels = labels[select]return outs, labels#获取正确数量和总数
def get_correct_and_total_count(labels, outs):#[b*lens, 8] -> [b*lens]outs = outs.argmax(dim=1) #实体标签,筛选出概率最大的那个值correct = (outs == labels).sum().item()total = len(labels)#计算除了0以外元素的正确率,因为0太多了,包括的话,正确率很容易虚高select = labels != 0outs = outs[select]labels = labels[select]correct_content = (outs == labels).sum().item()total_content = len(labels)return correct, total, correct_content, total_contentfrom transformers import AdamW# setting device on GPU if available, else CPU,检查是否GPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print('Using device:', device)#Additional Info when using cuda
if device.type == 'cuda':print(torch.cuda.get_device_name(0))print('Memory Usage:')print('Allocated:', round(torch.cuda.memory_allocated(0) / 1024 ** 3, 1), 'GB')print('Cached:   ', round(torch.cuda.memory_reserved(0) / 1024 ** 3, 1), 'GB')#训练
def train(epochs):lr = 2e-5 if model.tuneing else 5e-4    #这里model.tuneing的值由下面model.fine_tuneing(True)决定device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#训练optimizer = AdamW(model.parameters(), lr=lr)criterion = torch.nn.CrossEntropyLoss()print('开始训练  ')model.train()for epoch in range(epochs):for step, (inputs, labels) in enumerate(loader):#模型计算s#[b, lens] -> [b, lens, 8]#inputs = inputs.to(device)for k, v in inputs.data.items():  #与上面一样inputs.data[k] = v.cuda()outs = model(inputs)  #out没必要放在gpu中,labels和inputs需要labels = labels.to(device)#print('是否  ',outs.is_cuda, labels.is_cuda)#对outs和label变形,并且移除pad#outs -> [b, lens, 8] -> [c, 8]#labels -> [b, lens] -> [c]outs, labels = reshape_and_remove_pad(outs, labels,inputs['attention_mask'])#梯度下降loss = criterion(outs, labels).to(device)loss.backward()optimizer.step()optimizer.zero_grad()if step % 50 == 0:counts = get_correct_and_total_count(labels, outs)accuracy = counts[0] / counts[1]accuracy_content = counts[2] / counts[3]print(epoch, step, loss.item(), accuracy, accuracy_content)torch.save(model, 'model/命名实体识别_中文.model')#model.fine_tuneing(False)
#train(500)
print('参数量  ',sum(p.numel() for p in model.parameters()) / 10000)
#train(1)model.fine_tuneing(True)
train(200)
print(sum(p.numel() for p in model.parameters()) / 10000)
#train(2)#测试
def test():model_load = torch.load('model/命名实体识别_中文.model')model_load.eval()loader_test = torch.utils.data.DataLoader(dataset=Dataset('validation'),batch_size=128,collate_fn=collate_fn,shuffle=True,drop_last=True)correct = 0total = 0correct_content = 0total_content = 0for step, (inputs, labels) in enumerate(loader_test):if step == 5:breakprint(step)with torch.no_grad():#[b, lens] -> [b, lens, 8] -> [b, lens]for k, v in inputs.data.items():  #与上面一样,都放进cudainputs.data[k] = v.cuda()

改成GPU版本后训练效果不太好:


http://chatgpt.dhexx.cn/article/3sWaMTnK.shtml

相关文章

命名实体识别详解

1.命名实体识别定义 例如&#xff1a; 2.常用开源的中英文NER工具 这些工具的缺点是&#xff1a;只提供通用型的实体类别如 人名&#xff0c;地方&#xff0c;组织&#xff0c;时间等&#xff0c;对于特定领域&#xff0c;可能很难提取出你需要的实体。 2.1 代码实践 代码来…

命名实体识别(NER – Named-entity recognition) 总结

1. 什么是命名实体识别&#xff1f; 命名实体识别&#xff08;Named Entity Recognition&#xff0c;简称NER&#xff09;&#xff0c;又称作“专名识别”&#xff0c;是指识别文本中具有特定意义的实体&#xff0c;主要包括人名、地名、机构名、专有名词等。简单的讲&#xf…

命名实体识别学习笔记

1 命名实体识别概述 1.1 定义 命名实体识别&#xff08;Name Entity Recognition&#xff0c;NER&#xff09;&#xff0c;也称作“专名识别”&#xff0c;是指识别文本中具有特定意义的实体&#xff0c;包括人名、地名、机构名、专有名词等。 1.2 形式化定义 给定标识符集…

命名实体识别的难点与现状

https://baijiahao.baidu.com/s?id1566811969925699&wfrspider&forpc 命名实体识别(Named Entities Recognition, NER)是自然语言处理(Natural Language Processing, NLP)的一个基础任务&#xff0c;其目的是识别语料中人名、地名、组织机构名等命名实体&…

命名实体识别研究综述

命名实体识别研究进展综述 1 引 言 命名实体识别(Named Entity Recognition,NER)的主要任务是识别出文本中的人名、地名等专有名称和有意义的时间、日期等数量短语并加以归类[ 1]。命名实体识别技术是信息抽取、信息检索、机器翻译、问答系统等多种自然语言处理技术必不可少的…

命名实体识别(基于规则-无监督学习-机器学习-深度学习)

文章目录 1 简介2 NER标注语料库3 NER工具库4 序列标注标签方案5 四类NER方法&#xff08;规则-无监督学习-机器学习-深度学习&#xff09;5.1 基于规则的NER5.2 基于无监督学习方法5.2 基于机器学习&#xff08;含特征的有监督学习&#xff09;5.3 基于深度学习方法1、输入层2…

【论文笔记】命名实体识别论文

其实实体识别这块看了挺久了的&#xff0c;今天就来好好聊一聊它。实体识别(Name Entity Recognition)是属于NLP任务中的序列标注问题&#xff1a;给定一个输入句子&#xff0c;要求为句子中的每一个token做实体标注&#xff08;如人名、组织/机构、地名、日期等等&#xff09;…

一文了解命名实体识别

导读&#xff1a;从1991年开始&#xff0c;命名实体识别逐渐开始走进人们的视野&#xff0c;在各评测会议的推动下&#xff0c;命名实体识别技术得到了极大地发展&#xff0c;从最初的基于规则和字典的方法&#xff0c;到现在热门的注意力机制、图神经网络等方法&#xff0c;命…

命名实体识别(NER)知识汇总

介绍 命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER&#xff09;是NLP领域中一项基础的信息抽取任务&#xff0c;NER 是关系抽取、知识图谱、问答系统等其他诸多NLP任务的基础。NER从给定的非结构化文本中识别命名实体&#xff0c;并对实体分类&#xff0c…

基于深度学习的命名实体识别与关系抽取

基于深度学习的命名实体识别与关系抽取 作者&#xff1a;王嘉宁 QQ&#xff1a;851019059 Email&#xff1a;lygwjn126.com 个人网站&#xff1a;http://www.wjn1996.cn 【备注&#xff1a;此博文初次编辑为2018年11月23日&#xff0c;最新编辑为2019年10月24日】 夏栀的博…

NLP案例——命名实体识别(Named Entity Recongition)

NLP案例——命名实体识别&#xff08;Named Entity Recongition&#xff09; 命名实体识别是NLP里的一项很基础的任务&#xff0c;就是指从文本中识别出命名性指称项&#xff0c;为关系抽取等任务做铺垫。狭义上&#xff0c;是识别出人命、地名和组织机构名这三类命名实体&…

【命名实体识别(NER)】(1):命名实体识别综述

什么是命名实体识别&#xff1f; 命名实体识别&#xff08;Named Entity Recognition&#xff0c;简称NER&#xff09;&#xff0c;又称作“专名识别”&#xff0c;是自然语言处理中的一项基础任务&#xff0c;应用范围非常广泛。命名实体一般指的是文本中具有特定意义或者指代…

一文读懂命名实体识别

本文对自然语言基础技术之命名实体识别进行了相对全面的介绍&#xff0c;包括定义、发展历史、常见方法、以及相关数据集&#xff0c;最后推荐一大波 Python 实战利器&#xff0c;并且包括工具的用法。 01 定义 先来看看维基百科上的定义&#xff1a;Named-entity recognition …

自然语言处理——命名实体识别

命名实体识别 命名实体识别(Named Entity Recognition,NER)&#xff0c;指识别文本中具有特定意义的实体&#xff0c;包括人名、地名、机构名、专有名词等。 常用的方法如下。 数据集一览 数据集下载地址 提取码&#xff1a;s249 看一下我们的数据集&#xff0c;分为句子…

NLP算法-命名实体识别

命名实体识别 什么是命名实体识别&#xff1f;NER 研究的命名实体NER研究目前所遇到的问题命名实体识别的主要方法&#xff1a; 基于条件随机场的命名实体识别常用的NER模型1、Spacy NER 模型2、斯坦福命名实体识别器 中文人名识别中文姓名的构成规律姓名的上下文环境分析Hanlp…

命名实体识别(NER)综述

本文是中文信息处理课程的期末考核大作业&#xff0c;对于自然语言处理主流任务的调研报告 ———————————————— 版权声明&#xff1a;本文为CSDN博主「<Running Snail>」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接…

命名实体识别

转载https://blog.csdn.net/fendouaini/article/details/81137424 link 作者&#xff1a;Walker 目录 一&#xff0e;什么是命名实体识别 二&#xff0e;基于NLTK的命名实体识别 三&#xff0e;基于Stanford的NER 四&#xff0e;总结 一 、什么是命名实体识别&#xff1f; 命名…

NER入门:命名实体识别介绍及经验分享

每天给你送来NLP技术干货&#xff01; 来自&#xff1a;AI有温度 大家好&#xff0c;我是泰哥。本篇文章从什么是命名实体讲到为什么要做命名实体&#xff0c;然后讲到了NER数据处理及建模经验&#xff0c;对于做NER的同学&#xff0c;不论你是新手还是老手都非常值得一看&…

命名实体识别主要方法

命名实体识别主要方法 命名实体识别&#xff08;Named Entity Recognition&#xff0c;简称NER&#xff09;&#xff0c;又称作“专名识别”&#xff0c;是自然语言处理中的一项基础任务&#xff0c;应用范围非常广泛。命名实体一般指的是文本中具有特定意义或者指代性强的实体…

【实体识别】深入浅出讲解命名实体识别(介绍、常用算法)

本文收录于《深入浅出讲解自然语言处理》专栏&#xff0c;此专栏聚焦于自然语言处理领域的各大经典算法&#xff0c;将持续更新&#xff0c;欢迎大家订阅&#xff01;个人主页&#xff1a;有梦想的程序星空个人介绍&#xff1a;小编是人工智能领域硕士&#xff0c;全栈工程师&a…