pre = "0 0 B_SONG I_SONG I_SONG 0 B_SONG I_SONG I_SONG 0 0 B_SINGER I_SINGER I_SINGER 0 O O O B_ALBUM I_ALBUM I_ALBUM O O B_TAG I_TAG I_TAG O"
true = "0 0 B_SONG I_SONG I_SONG 0 0 0 0 0 0 B_SINGER I_SINGER I_SINGER 0 O O O B_ALBUM I_ALBUM I_ALBUM O O B_TAG I_TAG I_TAG O" # x = x.split()
tags = [("B_SONG","I_SONG"),("B_SINGER","I_SINGER"),("B_ALBUM","I_ALBUM"),("B_TAG","I_TAG")] def _find_tag(labels,B_label="B_SONG",I_label="I_SONG"):
result = []
if isinstance(labels,str):
labels = labels.strip().split()
labels = ["O" if label =="0" else label for label in labels]
# print(labels)
for num in range(len(labels)):
if labels[num] == B_label:
song_pos0 = num
if labels[num] == I_label and labels[num-1] == B_label:
lenth = 2
for num2 in range(num,len(labels)):
if labels[num2] == I_label and labels[num2-1] == I_label:
lenth += 1
if labels[num2] == "O":
result.append((song_pos0,lenth))
break
return result def find_all_tag(labels): result = {}
for tag in tags:
res = _find_tag(labels,B_label=tag[0],I_label=tag[1])
result[tag[0].split("_")[1]] = res
return result def precision(pre_labels,true_labels):
'''
:param pre_tags: list
:param true_tags: list
:return:
'''
pre = []
if isinstance(pre_labels,str):
pre_labels = pre_labels.strip().split()
pre_labels = ["O" if label =="0" else label for label in pre_labels]
if isinstance(true_labels,str):
true_labels = true_labels.strip().split()
true_labels = ["O" if label =="0" else label for label in true_labels] pre_result = find_all_tag(pre_labels)
for name in pre_result:
for x in pre_result[name]:
if x:
if pre_labels[x[0]:x[0]+x[1]] == true_labels[x[0]:x[0]+x[1]]:
pre.append(1)
else:
pre.append(0)
return sum(pre)/len(pre) def recall(pre_labels,true_labels):
'''
:param pre_tags: list
:param true_tags: list
:return:
'''
recall = []
if isinstance(pre_labels,str):
pre_labels = pre_labels.strip().split()
pre_labels = ["O" if label =="0" else label for label in pre_labels]
if isinstance(true_labels,str):
true_labels = true_labels.strip().split()
true_labels = ["O" if label =="0" else label for label in true_labels] true_result = find_all_tag(true_labels)
for name in true_result:
for x in true_result[name]:
if x:
if pre_labels[x[0]:x[0]+x[1]] == true_labels[x[0]:x[0]+x[1]]:
recall.append(1)
else:
recall.append(0)
return sum(recall)/len(recall) def f1_score(precision,recall): return (2*precision*recall)/(precision+recall) if __name__ == '__main__':
precision = precision(pre,true)
recall = recall(pre,true)
f1 = f1_score(precision,recall)
print(precision)
print(recall)
print(f1)

  

NER命名实体识别,实体级level的评估,精确率、召回率和F1值的更多相关文章

  1. 基于BERT预训练的中文命名实体识别TensorFlow实现

    BERT-BiLSMT-CRF-NERTensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tuni ...

  2. 神经网络结构在命名实体识别(NER)中的应用

    神经网络结构在命名实体识别(NER)中的应用 近年来,基于神经网络的深度学习方法在自然语言处理领域已经取得了不少进展.作为NLP领域的基础任务-命名实体识别(Named Entity Recognit ...

  3. NLP入门(五)用深度学习实现命名实体识别(NER)

    前言   在文章:NLP入门(四)命名实体识别(NER)中,笔者介绍了两个实现命名实体识别的工具--NLTK和Stanford NLP.在本文中,我们将会学习到如何使用深度学习工具来自己一步步地实现N ...

  4. NLP入门(四)命名实体识别(NER)

      本文将会简单介绍自然语言处理(NLP)中的命名实体识别(NER).   命名实体识别(Named Entity Recognition,简称NER)是信息提取.问答系统.句法分析.机器翻译等应用领 ...

  5. 【神经网络】神经网络结构在命名实体识别(NER)中的应用

    命名实体识别(Named Entity Recognition,NER)就是从一段自然语言文本中找出相关实体,并标注出其位置以及类型,如下图.它是NLP领域中一些复杂任务(例如关系抽取,信息检索等)的 ...

  6. 2. 知识图谱-命名实体识别(NER)详解

    1. 通俗易懂解释知识图谱(Knowledge Graph) 2. 知识图谱-命名实体识别(NER)详解 3. 哈工大LTP解析 1. 前言 在解了知识图谱的全貌之后,我们现在慢慢的开始深入的学习知识 ...

  7. 命名实体识别(NER)

    一.任务 Named Entity Recognition,简称NER.主要用于提取时间.地点.人物.组织机构名. 二.应用 知识图谱.情感分析.机器翻译.对话问答系统都有应用.比如,需要利用命名实体 ...

  8. NLP入门(八)使用CRF++实现命名实体识别(NER)

    CRF与NER简介   CRF,英文全称为conditional random field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机 ...

  9. 『深度应用』NLP命名实体识别(NER)开源实战教程

    近几年来,基于神经网络的深度学习方法在计算机视觉.语音识别等领域取得了巨大成功,另外在自然语言处理领域也取得了不少进展.在NLP的关键性基础任务—命名实体识别(Named Entity Recogni ...

随机推荐

  1. coding++ :SQLyog 最新版本12.5-64bit 破解版

    点我下载 SQLyog 12.5-64bit 版本(包含注册码)

  2. Api接口幂等设计

    1,Api接口幂等设计,也就是要保证数据的唯一性,不允许有重复. 例如:rpc 远程调用,因为网络延迟,出现了调用了2次的情况. 表单连续点击,出现了重复提交. 接口暴露之后,会被模拟请求工具(Jem ...

  3. git本地库中配置多个sshkey

    一般来说正常情况下本地库中配置一个sshkey就可以适应开发了,但是生活中总会有那么一点点的小惊喜.由于公司业务的发展,现在需要本地库中再配置一个sshkey,下面记录下配置的全过程: 生成并添加第一 ...

  4. [codeforces]Page Numbers <模拟>

    描述: «Bersoft» company is working on a new version of its most popular text editor — Bord 2010. Bord, ...

  5. Mob之社会化分享集成ShareSDK

    接着上篇顺便分享一篇自己使用 ShareSDK 的笔记,上篇我们集成了 SMSSDK 完成了短信接收验证码的功能,请参考Mob 之 短信验证集成 SMSSDK,如何在项目已经集成 SMSSDK 的情况 ...

  6. ovirt 替换自主签署证书

    需求我自己写了一个python后台,添加上了ovirt 引擎web上,如图 但第一次访问时需要,需要接受两次不安全连接,ovirt  web使用https,我往里面加http,加不进去. 只能同样使用 ...

  7. SpringBoot 使用 JSR303 自定义校验注解

    JSR303 是 Java EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是hibernate Validator,有了它,我们可以在实体类的字段上标注不同的注解实现对数 ...

  8. Func 和 Action 委托

    有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action.如下所示(下面的in表示参数,out表示返回结果): delegate TResult ...

  9. django中写分页

    1.引用函数import from django.core.paginator import Paginator 2.分页 page_obj = Paginator(Article.objects.a ...

  10. 【C#】写一个支持多人聊天的TCP程序

    碎碎念 先谈谈我们要实现的效果:客户端可以选择要聊天的对象,或者直接广播消息(类似QQ的私聊和群消息) 那么,该如何实现呢? 首先明确的是,要分客户端和服务器端两个部分(废话) 客户端:选择要发送的对 ...