利用huggingface-transformers进行命名实体识别

2023-11-01

利用huggingface-transformers进行命名实体识别

项目地址:https://github.com/huggingface/transformers

文档地址:https://huggingface.co/docs/transformers/pipeline_tutorial

寻找你要的模型

Transformers 提供了数以千计的预训练模型,支持 100 多种语言的文本分类、信息抽取、问答、摘要、翻译、文本生成。

从这里:https://huggingface.co/models 可以查找你要的模型,可以根据任务、语言、框架、数据集等筛选。

这里我们想要进行基于中文的ner任务,筛选出这个模型: bert-base-chinese-ner

打开之后,通过介绍我们发现这是一个基于繁体中文的模型,对应的github地址是:

https://github.com/ckiplab/ckip-transformers

有需要的小伙伴可以尝试。

我们继续筛选,找到了这个模型:uer/roberta-base-finetuned-cluener2020-chinese

模型使用

方法一:运行时下载模型
from transformers import AutoModelForTokenClassification,AutoTokenizer,pipeline

model = AutoModelForTokenClassification.from_pretrained('uer/roberta-base-finetuned-cluener2020-chinese')
tokenizer = AutoTokenizer.from_pretrained('uer/roberta-base-finetuned-cluener2020-chinese')

ner_pipe = pipeline('ner', model=model, tokenizer=tokenizer)
print(ner_pipe("江苏警方通报特斯拉冲进店铺"))

第一次执行时,会下载模型权重文件,默认保存到的路径是

C:\Users\用户名\.cache\torch\transformers\

我们可以把相应的权重文件从这里复制到别的地方,然后从指定目录加载模型(也可以在一开始时直接下载至指定目录)

model = AutoModelForTokenClassification.from_pretrained(
    'uer/roberta-base-finetuned-cluener2020-chinese',
    cache_dir='./data/transformers')

上面运行下载的模型文件名称不太友好,当模型多了不好管理,还可以用下面这种方法加载模型

方法二:下载原项目,然后加载
git lfs install
git clone https://huggingface.co/uer/roberta-base-finetuned-cluener2020-chinese
# 从下载的原项目路径加载
model = AutoModelForTokenClassification.from_pretrained(
    'D:/python_project/git/roberta-base-finetuned-cluener2020-chinese'
)
tokenizer = AutoTokenizer.from_pretrained(
    'D:/python_project/git/roberta-base-finetuned-cluener2020-chinese'
)

实体抽取

model = AutoModelForTokenClassification.from_pretrained(
    'uer/roberta-base-finetuned-cluener2020-chinese',
    cache_dir='./data/transformers')
tokenizer = AutoTokenizer.from_pretrained(
    'uer/roberta-base-finetuned-cluener2020-chinese',
    cache_dir='./data/transformers')

ner_pipe = pipeline('ner', model=model, tokenizer=tokenizer)
print(ner_pipe("江苏警方通报特斯拉冲进店铺"))

[
    {'entity': 'B-address', 'score': 0.66190094, 'index': 1, 'word': '江', 'start': 0, 'end': 1}, 
    {'entity': 'I-address', 'score': 0.554456, 'index': 2, 'word': '苏', 'start': 1, 'end': 2}, 
    {'entity': 'B-company', 'score': 0.42272708, 'index': 7, 'word': '特', 'start': 6, 'end': 7}, 
    {'entity': 'I-company', 'score': 0.4546979, 'index': 8, 'word': '斯', 'start': 7, 'end': 8},
    {'entity': 'I-company', 'score': 0.52078307, 'index': 9, 'word': '拉', 'start': 8, 'end': 9}
]

实体抽取的结果是一个列表,列表中每个元素为字典类型,但是并非每个字典为一个实体,而是实体的一部分,“江”的entity为“B-address”表示,表示其为一个address实体的开始(beginning),相应地“苏”就是address实体的Inside部分。可以参考BIO的标注规则

再来做一个测试

content = """本院定于2022年6月1日 上午09时00分在普洱市中级人民法院第三法庭公开开庭审理原告中国音像著作权集体管理协会与被告普洱帝都娱乐有限公司著作权权属、侵权纠纷一案。"""
print(ner_pipe(content))


[
    {'entity': 'B-government', 'score': 0.94568264, 'index': 18, 'word': '普', 'start': 23, 'end': 24},
    {'entity': 'I-government', 'score': 0.9213542, 'index': 19, 'word': '洱', 'start': 24, 'end': 25}, 
    {'entity': 'I-government', 'score': 0.96393627, 'index': 20, 'word': '市', 'start': 25, 'end': 26}, 
    {'entity': 'I-government', 'score': 0.97218406, 'index': 21, 'word': '中', 'start': 26, 'end': 27}, 
    {'entity': 'I-government', 'score': 0.9750988, 'index': 22, 'word': '级', 'start': 27, 'end': 28},
    {'entity': 'I-government', 'score': 0.9764756, 'index': 23, 'word': '人', 'start': 28, 'end': 29},
    {'entity': 'I-government', 'score': 0.9742114, 'index': 24, 'word': '民', 'start': 29, 'end': 30},
    {'entity': 'I-government', 'score': 0.96489114, 'index': 25, 'word': '法', 'start': 30, 'end': 31},
    {'entity': 'I-government', 'score': 0.9691787, 'index': 26, 'word': '院', 'start': 31, 'end': 32},
    {'entity': 'I-government', 'score': 0.65080214, 'index': 27, 'word': '第', 'start': 32, 'end': 33},
    {'entity': 'I-government', 'score': 0.9060895, 'index': 28, 'word': '三', 'start': 33, 'end': 34},
    {'entity': 'I-government', 'score': 0.8860891, 'index': 29, 'word': '法', 'start': 34, 'end': 35},
    {'entity': 'I-government', 'score': 0.90334916, 'index': 30, 'word': '庭', 'start': 35, 'end': 36},
    {'entity': 'B-organization', 'score': 0.9363663, 'index': 39, 'word': '中', 'start': 44, 'end': 45},
    {'entity': 'I-organization', 'score': 0.9424646, 'index': 40, 'word': '国', 'start': 45, 'end': 46},
    {'entity': 'I-organization', 'score': 0.8929043, 'index': 41, 'word': '音', 'start': 46, 'end': 47},
    {'entity': 'I-organization', 'score': 0.90582854, 'index': 42, 'word': '像', 'start': 47, 'end': 48},
    {'entity': 'I-organization', 'score': 0.8805796, 'index': 43, 'word': '著', 'start': 48, 'end': 49},
    {'entity': 'I-organization', 'score': 0.79649234, 'index': 44, 'word': '作', 'start': 49, 'end': 50},
    {'entity': 'I-organization', 'score': 0.92722464, 'index': 45, 'word': '权', 'start': 50, 'end': 51},
    {'entity': 'I-organization', 'score': 0.95748276, 'index': 46, 'word': '集', 'start': 51, 'end': 52},
    {'entity': 'I-organization', 'score': 0.96203715, 'index': 47, 'word': '体', 'start': 52, 'end': 53},
    {'entity': 'I-organization', 'score': 0.9557828, 'index': 48, 'word': '管', 'start': 53, 'end': 54},
    {'entity': 'I-organization', 'score': 0.96434724, 'index': 49, 'word': '理', 'start': 54, 'end': 55},
    {'entity': 'I-organization', 'score': 0.9720231, 'index': 50, 'word': '协', 'start': 55, 'end': 56},
    {'entity': 'I-organization', 'score': 0.9506598, 'index': 51, 'word': '会', 'start': 56, 'end': 57},
    {'entity': 'B-company', 'score': 0.9608379, 'index': 55, 'word': '普', 'start': 60, 'end': 61},
    {'entity': 'I-company', 'score': 0.9295836, 'index': 56, 'word': '洱', 'start': 61, 'end': 62},
    {'entity': 'I-company', 'score': 0.9206439, 'index': 57, 'word': '帝', 'start': 62, 'end': 63},
    {'entity': 'I-company', 'score': 0.9737558, 'index': 58, 'word': '都', 'start': 63, 'end': 64}, 
    {'entity': 'I-company', 'score': 0.98576665, 'index': 59, 'word': '娱', 'start': 64, 'end': 65},
    {'entity': 'I-company', 'score': 0.9775351, 'index': 60, 'word': '乐', 'start': 65, 'end': 66},
    {'entity': 'I-company', 'score': 0.98828006, 'index': 61, 'word': '有', 'start': 66, 'end': 67},
    {'entity': 'I-company', 'score': 0.9860963, 'index': 62, 'word': '限', 'start': 67, 'end': 68}, 
    {'entity': 'I-company', 'score': 0.9872212, 'index': 63, 'word': '公', 'start': 68, 'end': 69}, 
    {'entity': 'I-company', 'score': 0.9746289, 'index': 64, 'word': '司', 'start': 69, 'end': 70}]


可以看到其抽取到了三个实体,分别为:

{'government': '普洱市中级人民法院第三法庭', 'organization': '中国音像著作权集体管理协会',
'company': '普洱帝都娱乐有限公司'}

通过以下方式还可以查看分词结果

print(tokenizer.tokenize(content))

['本', '院', '定', '于', '2022', '年', '6', '月', '1', '日', '上', '午', '09', '时', '00', '分', '在', '普', '洱', '市', '中', '级', '人', '民', '法', '院', '第', '三', '法', '庭', '公', '开', '开', '庭', '审', '理', '原', '告', '中', '国', '音', '像', '著', '作', '权', '集', '体', '管', '理', '协', '会', '与', '被', '告', '普', '洱', '帝', '都', '娱', '乐', '有', '限', '公', '司', '著', '作', '权', '权', '属', '、', '侵', '权', '纠', '纷', '一', '案', '。']

看起来并没有“词”,都是单个的字,与HanLP是不一样的,不过实际上可以理解,因为BERT本身在训练的时候就是把单个的字作为输入进行训练,没有去做真正的中文分词。

训练自己的实体抽取任务

上面的模型已经可以做到一个不错的中文实体抽取效果,但是应用到特定领域,不可避免地会有一些领域实体抽取不出来,例如在司法领域,案由著作权权属、侵权纠纷就无法抽取出来,如果我们想训练自己的实体抽取任务应该怎么做呢?其实通过查看uer/roberta-base-finetuned-cluener2020-chinese这个模型的文档可以知道,该模型是通过UER-py的GitHub项目训练得到一个中文命名实体模型,UER-py项目地址为:

https://github.com/dbiir/UER-py

对应中文文档为:https://github.com/dbiir/UER-py/blob/master/README_ZH.md

在文档中可以看到:“UER-py(Universal Encoder Representations)是一个用于对通用语料进行预训练并对下游任务进行微调的工具包。UER-py遵循模块化的设计原则。通过模块的组合,用户能迅速精准的复现已有的预训练模型,并利用已有的接口进一步开发更多的预训练模型”

所以,如果我们想要在训练自己的实体抽取任务,可以借助UER-py来帮助我们实现,下面我也会记录学习使用这个工具包的过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用huggingface-transformers进行命名实体识别 的相关文章

  • [ MySQL ] — 常见函数的使用

    目录 日期函数 current date 获取当前日期 current time 获取当前时间 current timestamp 获取当前时间戳 date 获取参数的日期部分 编辑 date add 在日期或时间的基础上进行增加 date
  • python期末考试之判断题(含部分解析)

    列表对象的排序方法sort 只能按元素从小到大排列 不支持别的排序方式 X sort方法可升序 可降序 形参可以看做是函数内部的局部变量 函数运行结束之后形参就不可访问了 一个函数如果带有默认值参数 那么必须所有参数都设置默认值 表达式 a
  • 全连接神经网络实现MNIST手写数字识别

    在对全连接神经网络的基本知识 全连接神经网络详解 学习之后 通过MNIST手写数字识别这个小项目来学习如何实现全连接神经网络 MNIST数据集 对于深度学习的任何项目来说 数据集是其中最为关键的部分 MNIST数据集是美国国家标准与技术研究
  • 云计算的三个主要服务模型:IaaS、PaaS 和 SaaS

    文章目录 介绍 基础设施即服务 Infrastructure as a Service IaaS 平台即服务 Platform as a Service PaaS 软件即服务 Software as a Service SaaS 区别 基础
  • 物理服务器、虚拟服务器、虚拟主机、云服务器的区别

    物理服务器 一台实实在在物理机 服务器性能和稳定性比普通PC强 但是价格昂贵 一般有钱的大佬才会使用独立的物理服务器 就是需要自己实实在在买一台设备放在那里 性能强 但是无论用还是不用 机器和网络等成本都在那里 虚拟专用服务器 Virtua
  • 2021年计算机保研-假211真双非三无的失败保研经历(武大/复旦/计算所/华科/同济/上交)

    从知乎 吵鸡凶鸭OvO转过来啦 文章目录 一 个人情况 二 投递情况 1 夏令营 2 预推免 3 前车之鉴 三 复试经历 1 武汉大学 测绘遥感信息工程国家重点实验室 2 复旦大学 工程与应用技术研究院 3 中科院计算所 网络数据科学实验室
  • Linux的远程访问操作遇到的问题

    1 使用命令 ifconfig出现错误 原因是没有安装相关工具 输入命令sudo apt install net tools 提示为E 无法下载 http dk archive ubantu com ubantu dists xenial

随机推荐

  • 【通览一百个大模型】UL2(Google)

    通览一百个大模型 UL2 Google 作者 王嘉宁 本文章内容为转载或整理 仓库链接 https github com wjn1996 LLMs NLP Algo 订阅专栏 大模型 NLP 算法 可获得博主多年积累的全部NLP 大模型和算
  • mysql中的declare_sql中declare是什么意思

    展开全部 sql中declare是声明的意思32313133353236313431303231363533e58685e5aeb931333365653236 就是声明变量的 这个一般是用在函数和存储过程中的 比如说 这个存储过程是 只要
  • python数组的操作(访问)

    Python 自带的list print python自带的list集合 list1 list range 20 print list1 list2 list1 1 10 2 从开始下标1开始截取 下标到10结束 间隔2个 print li
  • 快速创建ES集群

    win10 中docker 设置 快速创建集群 访问 官网 elasticsearch docs reference setup install docker at main elastic elasticsearch GitHub 负责上
  • 上海控安成功举办普陀区科普创新专项智能网联车学术活动

    12月25日 由上海控安主办的上海市普陀区科普创新专项 智能网联汽车不神秘 学术交流活动顺利举办 活动现场座无虚席 齐聚汽车从业人员 汽车爱好者 青年学生近百人 共同探究未来汽车产业的变革 普陀区科委相关代表列席活动 上海工程技术大学电子电
  • Python学习基础系列----了解python

    了解python 1 了解Python Python是一种解释型 这意味着开发过程中没有了编译这个环节 面向对象 支持面向对象的风格或代码封装在对象的编程技术 动态数据类型的交互式 可在命令行中通过Python提示符及直接代码执行程序 高级
  • MATLAB 正则表达式

    MATLAB 正则表达式 文章目录 MATLAB 正则表达式 与正则表达式相关的函数 regexp 用法 输出类型 如何构建 exp 元字符 字符转义 重复限定符 重复限定符的三种模式 分组运算符 锚点 选项 option 例子 与正则表达
  • JS求数组中最大值

    法一 function getArrMax arr var max arr 0 for var i 1 i lt arr length i if arr i gt max max arr i return max getArrMax 1 2
  • angular总结-my

    angular知识点 1 Component 装饰器 这表明它下面的类是一个组件 它提供了有关该组件的元数据 包括它的模板 样式和选择器 在 Component 的元数据中指定的样式只会对该组件的模板生效 2 Angular 只会绑定到组件
  • sideload刷机

    官方Recovery自带了sideload刷机选项 方便了手机出故障的机友自行恢复 转载请标明出处IUNI官方论坛 bbs iunios com http bbs iunios com thread 28244 1 1 html 一 刷前准
  • [Python图像处理] 二十四.图像特效处理之毛玻璃、浮雕和油漆特效

    该系列文章是讲解Python OpenCV图像处理知识 前期主要讲解图像入门 OpenCV基础用法 中期讲解图像处理的各种算法 包括图像锐化算子 图像增强技术 图像分割等 后期结合深度学习研究图像识别 图像分类应用 希望文章对您有所帮助 如
  • Python Web系列学习3-Tornado

    1 Tornado常被用作大型站点的接口服务框架 协程是Tornado推荐的编程方式 Tornado集成了丰富的用户身份验证功能 2 同步I O可以理解为被调用的I O函数会阻塞调用函数的执行 而异步I O则不会 tornado httpc
  • 【python爬虫】js逆向分析及AES解密

    一 原理简述 1 首先查看需要获取的数据即热门评论是否在源代码中 如果在源代码中就可以直接xpath等方式进行抓取 2 但是发现在网页和框架源代码里面都无法搜到评论内容 此时 使用网络抓包工具即 查看network中的XHD 在js代码中
  • vue2 vue3父子组件传参

    vue3 父子组件传参 父组件
  • Chatgpt私有化部署(全流程)

    前言 当下使用chatgpt来帮助完成工作已然成为主流 但想访问必须先面对地区的封锁 所以使用openai官方提供的API来部署至本地服务器从而更加便利的使用chatgpt 本文章主要介绍如何部署私有聊天机器人 条件准备 公网服务器一台 可
  • Unity 屏幕坐标鼠位置 Input.mousePosition 转为UI物体的坐标

    方式一 使用 RectTransformUtility ScreenPointToLocalPointInRectangle
  • [1158]微信小程序字段配置

    文章目录 微信小程序之permission字段 微信开发者工具 project config json配置详情 项目配置文件 一级字段 compileType setting useCompilerPlugins babelSetting
  • django连接mysql数据库报错_Django 连接 MySQL 数据库及常见报错解决

    Django 连接 MySQL数据库及常见报错解决 MySQL 的安装以及设置远程访问权限 不属于本笔记的重点 此处不做多余赘述 前提 MySQL 安装成功 且已配置远程访问权限 如在本地测试的忽略此项 终端或者数据库管理工具连接 MySQ
  • pyinstaller打包 .py 文件为可执行的 .exe程序

    有疑问的地方 参考博文 一 环境搭建 Python GUI图形化小工具编程学习 PySide2 环境搭建 一 二 实例演示 Python GUI图形化小工具编程学习 Demo 实例演示 二 三 打包失败 pyinstall 打包 exe 文
  • 利用huggingface-transformers进行命名实体识别

    利用huggingface transformers进行命名实体识别 项目地址 https github com huggingface transformers 文档地址 https huggingface co docs transfo