【Python机器学习】条件随机场模型CRF及在中文分词中实战(附源码和数据集)

news2024/11/18 13:35:11

需要源码请点赞关注收藏后评论区留言私信~~~

基本思想

假如有另一个标注序列(代词 动词 名词 动词 动词),如何来评价哪个序列更合理呢?

条件随机场的做法是给两个序列“打分”,得分高的序列被认为是更合理的。既然要打分,那就要有“评价标准”,称为特征函数。例如,可以定义相邻两个词的词性的关系为一个特征函数,那么对于“语言 处理”来说,上文提到的两个序列分别标注为“名词 动词”和“动词 动词”。从语言学的知识可知,“动词”一般不与“动词”相邻,因此,对该特征函数来说,第一个标注序列可以得分,而后一个标注序列则不得分。

假如定义了很多这样的特征函数,那么就可以用这些特征函数的评分结果转化的概率值来衡量哪个标注序列更合理。

在条件随机场的应用中,特征函数需要用户自己定义。特征函数分为刻画相邻变量相互影响和变量自身影响两类。

不同的特征函数刻画的特征有不同的重要性,在条件随机场里是用特征函数的权重系数来刻画它们的重要性,因此,条件随机场学习的目标就是得到每个特征函数的合理权重系数。

一般条件随机场的计算很复杂,简化为线性链结构的条件随机场计算相对简单,在标注问题中有广泛的应用。

在所谓的线性链条件随机场(linear chain conditional random field)中,定义转移特征函数t和状态特征函数s用来刻画相邻变量相互影响和变量自身影响。

设观测序列为x=(x^(1),x^(2),…,x^(n)),待预测的标签序列为y=(y^(1),y^(2),…,y^(n)),也称为隐变量状态序列。假定x和y具有相同的结构。条件随机场学习的目标是从训练集中得到条件概率模型P(y|x)=P(y^(1),y^(2),…,y^(n)|x^(1),x^(2),…,x^(n))。

转移特征函数(transition feature function)用于刻画相邻标签变量之间的相关关系以及观测序列对它们的影响,对于观测序列x的第i个位置,转移特征函数t标记为:

状态特征函数(status feature function)用于刻画观测序列对标签变量的影响,对于观测序列x的第i个位置,状态特征函数s标记为:

 

 

定义一个状态特征函数s:

 

它表示在句子的第i个位置,当输入为“处理”时,如果对应的标签变量值为“动词”时,特征函数值为1,否则为0。

定义一个转移特征函数t:

 它表示在句子的第i个位置,当输入为“处理”时,如果对应的标签变量值为“动词”且前一个标签变量值为“名词”时,特征函数值为1,否则为0。

可以将条件概率模型P(y|x)写为: P(y|x)

下标j表示转移特征函数的序号,λ_j表示该转移特征函数的权重系数,下标k表示状态特征函数的序号,μ_k表示该状态特征函数的权重系数,Z(x)是转化为概率的归一化因子:

 

条件随机场的概率计算问题是给定条件随机场P(y|x),输入序列x和输出序列y,计算条件概率P(y^(i)|x),P(y^(i),y^(i+1)|x)以及相应的数学期望的问题。

学习问题是在给定训练集时,估计条件随机场模型的参数,即特征函数的权重系数。

预测问题是在给定条件随机场和观测序列的条件下,求条件概率最大的标注序列,即对观测序列进行标注。 

中文分词应用示例

在实际应用中,特征函数的数量可能会很大,一般不是由用户逐个来定义,而是通过工具提供的模板来批量定义。

CRF++工具是一个简单、可定制、开源的条件随机场工具,可用于序列数据的标注任务,广泛应用于自然语言处理任务中。CRF++用C++语言实现,在Windows平台上,使用工具包中的crf_learn.exe、crf_test.exe、libcrfpp.dll三个文件即可完成模型的训练和预测。

在使用工具之前,要将训练语料和测试语句转换成符合CRF++要求的格式。

操作步骤如下

将crf_learn.exe、crf_test.exe、libcrfpp.dll文件拷贝到工作目录下,定义一个模板文件“template” 。

在控制台环境下,执行“crf_learn template crf_train_file crf_model”命令进行训练,得到模型文件“crf_model”。

在控制台环境下,执行“crf_test -m crf_model crf_test_file > crf_test_output”命令得到测试语句的输出文件“crf_test_output”。

CRF++中的一元模板(Unigram template)的形式为:%x[row,col],其中row指定行的相对位置,col指定列的绝对位置。

示例用的模板文件内容如下:
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]

 实际上,U02:%x[0,0]模板产生的特征函数类似于状态特征函数。func1、func2、func3将返回值0,func4将返回值1。特征函数的返回值会用于调整它们的权重系数。 对于转移特征函数,可以用U01:%x[-1,0]模板来产生。 CRF++用所谓的二元模板(Bigram template)扩展了条件随机场的传统特征函数。二元模板是在一元模板的基础上引入了前一个输出标签作为特征函数的元素,从而产生了能反映前后标签关系的特征函数。

输出结果如下 能非常精确的对输入句子进行分词

 

 

# 将训练语料改成crf++的格式,并写入文件crf_train_file
crf_train_file = "crf_train_file"
output_file = open(crf_train_file, 'w', encoding='utf-8')
for i in range(len(new_sents)):
    for j in range(len(new_sents[i][0])):
        output_file.write(new_sents[i][0][j] + ' ' + sents_labels[i][0][j] + '\n')
    output_file.write('\n')
output_file.close()

# 将测试文本改成crf++的格式,并写入文件crf_test_file
crf_test_file = "crf_test_file"
output_file = open(crf_test_file, 'w', encoding='utf-8')
for i in range(len(test_str)):
    output_file.write(test_str[i] + '\n')
output_file.close()
# 将测试语句的分词输出改写方便观看的格式。
crf_test_output = "crf_test_output"
input_file = open(crf_test_output, encoding='utf-8')
str = ""
for line in input_file.readlines():
    line = line.split()
    if len(line) == 2:
        if line[1] == 'E' or line[1] == 'S':
            str += line[0] + ' '
        else:
            str += line[0]
input_file.close()
print(str)

创作不易 觉得有帮助请点赞关注收藏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动设备软件开发-Shape详解

Spape详解 1.自定义背景shape 1.1gradient 1.简介 定义渐变色,可以定义两色渐变和三色渐变,及渐变样式,它的属性有下面几个2.属性 angle,只对线性渐变是有效的放射性渐变必须指定放射性的半径,gradientRadiouscentetX和…

STM32的ST-link调试下载,各种调试接口硬件介绍

调试原理 STM32F-10X使用M3内核,该内核支持复杂的同i傲视操作,硬件调试模块允许在取指令(指令单步运行)或访问数据(数据断电时)使得内核停止。在内核停止时,内核状态都可被查询,完成…

JS基于编码方式实现加密解密文本

JS基于编码方式实现加密解密文本 严格来讲这是一种简单的编码方式:加密,将明文【注】转成编码。解密则是编码转码为明文本。 【注:明文是指没有加密的文字(或者字符串),一般人都能看懂。】 下面源码用到 这个fromCharCode() 方…

年底了,感谢大家2022年的支持,虚竹哥送10本JAVA好书

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主&#x1f3…

碧兴物联IPO过会:拟募资4亿 预计年净利降幅超10%

雷递网 雷建平 12月21日碧兴物联科技(深圳)股份有限公司(简称:“碧兴物联”)日前IPO过会,准备在科创板上市。碧兴物联计划募资4.13亿元。其中,1.92亿元用于智慧生态环境大数据服务项目&#xff…

【MySQL】JDBC编程重点知识汇总

文章目录1. JDBC (API):2. JDBC代码编写:2.1 创建数据源对象:2.2 建立连接:2.3 构造SQL语句:2.4 执行SQL:2.5 释放资源:1. JDBC (API): 前面学过很多的SQL, 实际开发中大多数的SQL都不是手敲的, 都是通过程序来执行的. 各种的数据库都会提供API方便编程语言来控制; API (Appli…

【JavaEE】网络初识

初识网络协议 OSI七层和TCP/IP五层(四层) 应用层 应用程序 代码实现 传输层 端到端传输 (如玩家对玩家) 操作系统内核实现 网络层 点到点传输 操作系统内核实现 数据链路层 相邻节点之间的传输 (如集散点…

ChatGPT能接入微信了

前两天还看到不少人讨论,要是ChatGPT接入微信是啥感觉? 这不,想你所想,项目已经来了~ 来看效果,ChatGPT就出现在普通的微信对话框里,有问必答: 甚至还能拉入群聊,大家共用&#xf…

Adobe Premiere Pro 2020 系统兼容性报告:不支持的视频驱动程序

Adobe Premiere Pro 2020 系统兼容性报告:不支持的视频驱动程序 1. 问题 打开Adobe Premiere Pro 2020,看见系统兼容性报告:不支持的视频驱动程序。如下图: 点击修复,进入安装 Intel 图形驱动程序教程页面&#xff0…

DQL查询数据

文章目录DQL指定查询字段where条件子句联表查询分页和排序子查询DQL (Data Query Language:数据查询语言) 所有的查询操作都要用到它 select简单的查询,复杂的查询都要用到它数据库最核心的语言,最重要的语言使用频率…

python写个网页,使用flask显示时间登陆注册

用python写个网页。显示当前时间 可以使用 Python 的 datetime 模块来获取当前时间,然后使用 Python 的 Flask 框架来创建网页。 首先,需要安装 Flask: pip install flask 然后,可以使用以下代码创建一个 Flask 应用程序&#…

【Numpy基础知识】字节交换

字节交换 来源:Numpy官网:https://numpy.org/doc/stable/user/basics.html 文章目录字节交换导包【1】字节排序和ndarrays 简介【2】更改字节顺序导包 import numpy as np【1】字节排序和ndarrays 简介 ndarray 是一个对象,它为内存中的数据…

2023年,我的儿子刚从美国名校毕业,就失业了...

前不久,朋友圈里一篇名为《2023年,我的儿子刚从美国名校毕业,就失业了…》的文章火爆全网。 故事里的男孩出生于一个中产阶级家庭,从每年12万的幼儿园开始一路接受了优质教育,最终不负众望从美国前50名校的商学院毕业…

Ubuntu20.04LTS环境docker+cephadm方式部署Ceph 17.2.5

Ubuntu20.04LTS环境dockercephadm方式部署Ceph 17.2.51. 前言2. 环境准备2.1. 主机信息2.2. NTP时间同步2.3. 关闭 iptable 和 firewalld2.4. 关闭 SElinux2.5. 生成SSH证书,并分发到其他节点2.6. 依赖安装3. 安装部署Ceph17.2.53.1. 安装cephadm,拉取ce…

玩转ast- 手写babel插件篇

AST抽象语法树是什么?抽象语法树(Abstract Syntax Tree,AST)是源代码语法结构的一种抽象表示它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构每个包含type属性的数据结构,都…

基于Amlogic T972:结合DTS、驱动、Datasheet,解析Pinctrl子系统、GPIO脚的复用方法

文章目录前言一、概念1.1 Pinctrl devices1.2 Pinctrl client devices二、例(1)GPIOZ_9/10 复用为 i2c2_z2.1 Pin controller devices2.1.1 设备树配置: dts2.1.2 源码:驱动配置2.1.3 Datasheet2.2 Pinctrl client devices2.2.1 设备树配置&a…

华为云桌面,开启云上高效办公之旅!

在传统办公模式中,企业必须自己购买服务器和数据库软件才能进行日常管理,部署繁琐,还需要日常运维。而云桌面办公系统通过将传统的计算机终端与云计算平台有机地结合起来,使企业能够轻松应对各种变化带来的威胁和压力。 其中华为云…

用户与技术双向推动,小游戏赛道迎来新一轮增长机会

2017 年 12 月 28 日,微信小游戏正式上线。“跳一跳”刷爆了微信朋友圈,随后欢乐斗地主、坦克大战、纪念碑谷、拳皇等经典游戏纷纷出现在小游戏平台上。在过去的5年间,各大平台纷纷紧跟微信的步伐,纷纷入局小游戏,当前…

回调函数的基本使用

🏖️作者:malloc不出对象 ⛺专栏:《初识C语言》 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一、什么是回调函数二、为什么要…

打开新世界大门,测试人可以用Chrome插件干什么?

什么是Chrome插件 这篇文章所说的Chrome插件,也就是我们通常说的Chrome扩展 (Chrome Extension),是一个用Web技术开发、用来增强浏览器功能的软件,它其实就是一个由 HTML、CSS、JS、图片等资源组成的一个 .crx 后缀的压缩包。 让我们来看看…