条件随机场 python_用条件随机场做网络小说命名实体识别

一直想用统计学习方法来改善拨云搜索,这次先在命名实体上小小尝试一下。

线性链条件随机场

对于无向图中的节点,定义一组特征函数,使其状态仅受邻近节点和观测序列的影响。

在标注任务中,节点只有前后两个邻近节点,即线性链条件随机场。

按照定义,节点有两类特征函数:转移特征函数和状态特征函数。转移特征函数表示上一个节点状态及观测序列对当前节点的影响,状态特征函数表示观测序列对当前节点的影响。每个函数都有个权重,模型经过训练后,通过函数及其权重即可推算节点状态。

直观地看,对于 NER 任务,文本为观测序列,一个词对应一个节点,标签为节点状态。我们为每个节点定义一组特征函数,因为节点对应的词不一样,它们的特征函数也不一样。经过训练后,模型通过词对应的特征函数集合,即可计算出最可能的标签。

python-CRFsuite

因为要同 python 程序衔接,这里选用 CRFsuite 库。

与 CRF++晦涩的模板文件不同,CRFsuite 以键值对的形式定义特征函数。优点是灵活直观,缺点嘛就是不太好自定义转移特征了,不过对本文任务没影响。

方案设计

此次任务目标是识别小说里的地名、道具、技能、门派及特殊人名等实体。由于文本的特殊性,可以预见通用的训练语料效果不会太好。所以我用基于规则的方法来标注八本有代表性的小说,以此作为训练语料。用另外的四本小说来评测,然后与前述规则方法的结果做比较。

训练语料的八本小说:凡人修仙传, 问题妹妹恋上我, 轮回剑典, 极品家丁, 雪鹰领主, 武林半侠传, 儒道之天下霸主, 无限之高端玩家。

评测的四本小说:择天记,大道争锋,魔魂启临,俗人回档。

标签采用 BMEO 四种状态,B 实体开始,M 实体中间词,E 实体结尾词,O 无关词。

预期目标

原有的规则识别是在匹配到特殊字词后,按照特定句式、字词及词频来判定是否命名实体。CRF 在定义特征时,综合考虑了上下文内容和词性,预计泛化会更好一点。但是语料标注及分词词性本身并不靠谱,估计准确率有所降低。

实现

1. 生成训练语料

将文本分词后, 送入原识别程序。然后对结果标注,以 json 格式保存。格式如:

["这是", "r", "O"], ["清", "a", "B"], ["虚", "d", "M"], ["门", "n", "E"], ["的", "uj", "O"], ["飞行", "vn", "O"], ["法器", "n", "O"], ["雪", "n", "O"], ["虹", "n", "O"],

单元里有文字、词性和标签 3 个属性。

2. 定义特征

以当前词及前后两个词的文字和词性为特征函数。这里都是状态特征,转移特征是默认的。

def _word2features(wordlist, i):

""" 返回特征列表 """

features = [

'bias',

'word:'+wordlist[i][0],

'word_attr:'+wordlist[i][1]

]

if i > 0:

features.append('word[-1]:'+wordlist[i-1][0])

features.append('word[-1]_attr:'+wordlist[i-1][1])

if i > 1:

features.append('word[-2]:'+wordlist[i-2][0])

features.append('word[-2,-1]:'+wordlist[i-2][0]+wordlist[i-1][0])

features.append('word[-2]_attr:'+wordlist[i-2][1])

if i < len(wordlist)-1:

features.append('word[1]:'+wordlist[i+1][0])

features.append('word[1]_attr:'+wordlist[i+1][1])

if i < len(wordlist)-2:

features.append('word[2]:'+wordlist[i+2][0])

features.append('word[1,2]:'+wordlist[i+1][0]+wordlist[i+2][0])

features.append('word[2]_attr:'+wordlist[i+2][1])

return features

这里直接把特征属性组合为名称, 这样其值就是函数权重,默认为 1。

3. 训练模型

默认用 L-BFGS 算法训练。 参数也并没有调到最优。

model = pycrfsuite.Trainer(verbose=True)

model.append(train_x, train_y)

model.set_params({

'c1': 1.0, # coefficient for L1 penalty

'c2': 1e-3, # coefficient for L2 penalty

'max_iterations': 100, # stop earlier

'feature.possible_states': True,

# include transitions that are possible, but not observed

'feature.possible_transitions': True,

'feature.minfreq': 3

})

model.train("./test.crf")

4. 评测

tagger = pycrfsuite.Tagger()

tagger.open('./test.crf')

test_y = tagger.tag(test_x)

这里抽选大道争锋的标注结果,其他 3 本也差不多,如下:

'少清派', '邪派', '玄门正宗', '正宗玄门', '丹师', '魔宗', '莹云', '种法术', '蛇出来', '琴楠', '大玄门', '一玄门', '一身皮', '了莹', '大派', '丹术', '丹三', '紫眉', '丹主', '黑衣道人', '巧巧', '阵图', '喜欢道士', '

十大玄门', '玄袍道人', '小派', '铜炉', '玄功', '剑招', '十多人', '二岛', '世家玄门', '九曲溪宫', ',玄门', '派玄门', '诸多玄门', '丹成功', '剑出来', '了玄门', '责翠', '源剑', '玄门小派', '魔门', '玄门十大派', '栖鹰', '三大玄门', '丹功', '丹境', '于各个玄门', '各大派', '一杆长枪', '丹出来', '阵门', '仙派', '九转功', '丹炉', '楚玄门', '青云一', '禽鹰', '凝功', '源经', '莹莹', '半声', '祭出来', '了出来', '黑风', '玄族', '可玄门', '师出来', '主宫', '玄门大派'

规则方法结果:

'此阵', '六大魔宗', '女冠', '化形丹', '蓬远派', '桂从尧', '功德院中', '参神契', '此水', '血魄', '自思', '玄门世家', '广源派', '一观', '双翅', '闯阵', '四象阵', '沉香舟', '澜云密册', '讨争', '补天阁', '道姑', '晁掌阁',

'入山', '派中', '玄灵山', '清羽门下', '符书', '元阳派', '大门大派', '观容师妹', '入阵', '善渊观', '越真观', '幽阴重水', '水行真光', '玄光境界', '景管事', '破阵', '宝丰观中', '剑符', '修道者', '沉香教中', '管事', '万福一礼', '化

丹修士', '山河童子', 'jī动', '年轻道人', '符诌', '紫眉道人', '斩神阵', '丹鼎院', '太昊派', '败下阵', '歉然', '此丹', '剑丸', '疑 huò', '此老', '溟沧派', '张衍神色', '甫一', '砀域水国', '血衣修士', '正 sè', '少清派', '两名老道', '

魔门', '丹煞', '观中', '师徒一脉', '德修观', '候伯叙', '魔简', '入门弟子', '苍梧山', '老道', '小金丹', '宁冲玄一', '下院入门', '化丹', '小童', '符御卿', '力士', '众弟子', '中年修士', '文安', '文俊', '老魔', '熬通', '道诀', '丘老道', '手一', '玄光境', '丹鼎院中', '玄门正宗', '天阁', '血魄宗', '南华派', '年轻修士', '拿眼', '阵中', '小派', '北辰派', '太昊门', '化一', '阵门', '风师兄', '道书', '玲儿', '玄功', '琴楠', '儒雅道人', '神梭', '凝丹', '珍茗', '玄门十派', '沉香教', '张衍洒然', '无需多', '中年道人', '魔宗', '凕沧派', '清羽门', '守阵', '魔穴', '解读道书', '十六派', '九魁妖王', '秀儿', '执事道童', '了声', '化丹境界', '待张衍', '玄门大派', '陶真人门下', '两派'

统计结果:

| 项目 | CRF | 规则 |

| ---- | ---- | ---- |

| 实体数量 | 71 | 138 |

| 都有 | 9 | 9 |

| 差异数量 | 62 | 129 |

| 准确数 | 25(35%) | 105(76%) |

| 独有准确数 | 16(8) | -- |

正确的标准是组合正确,且确实为新实体。有多种组合方案的,都算正确,例如:紫眉和紫眉道人。

独有准确数括号里的数字去掉了因词频按规则方法应抛弃的实体。

可以看出几点:

规则方法识别的数量比 CRF 要多。这是因为语料偏少,CRF 只训练了 8 本小说,并没有学习到所有的规则信息。

两者的准确率都有问题。例如 CRF 里的“了出来”,“师出来”。规则方式里的“甫一”,“正 sè”。都是错误地识别了人名,其原因各有不同,但 CRF 受到了标注语料的影响,有可能将错误率放大。

CRF 识别出了超出规则的实体,这是期望的目标。

小结

在不靠谱的训练语料及不靠谱的评价标准下,CRF 仍然给出了有意义的结果。

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

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

相关文章

项目开发基础:常用测试方法介绍

1、集成测试集成测试就是把模块按照设计说明书的要求组合起来进行测试。1.1、集成测试方法&#xff1a;a、分别测试各个模块&#xff0c;再把这些模块组合起来进行整体测试&#xff0c;也就是非增量式集成。特点&#xff1a;可以对模块进行并行测试&#xff0c;能充分利用人力&…

java 多数据源处理_java – 用于处理多个数据源的Spring事务管理

这可能是一个重复的问题,但我找不到(至少我无法理解)一个满意的答案,因此再次提问.我正在使用两个数据源(MySQL和Oracle).以下是执行流程&#xff1a;主方法-A调用方法-B(写入Oracle DB)然后它(方法-A)调用方法-C(写入mySQL DB)然后它(方法-A)调用方法-D(写入Oracle DB) ).如果…

MyBatis Generator

1 <?xml version"1.0" encoding"UTF-8"?>2 <!DOCTYPE generatorConfiguration3 PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"4 "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"&g…

svd奇异值分解_NCL专辑 | 奇异值分解(SVD)

奇异值分解SVD(Singular Value Decomposition)是一种矩阵分解方法&#xff0c;在气象领域中常用来分析两个气象场场之间的关系。NCL的函数库中与SVD相关的函数包括svd_lapack&#xff0c;svdcov&#xff0c;svdcov_sv&#xff0c;svdstd&#xff0c;svdstd_sv。svd_lapack&…

项目测试基础:白盒测试相关知识笔记

1、白盒测试概念白盒测试又称为结构测试&#xff0c;主要是根据程序的内部结构和逻辑来设计测试用例&#xff0c;然后对程序的路径和过程进行测试&#xff0c;检查是否满足设计的需要。2、白盒测试常用的技术介绍白盒测试常用的技术有逻辑覆盖、循环覆盖、基本路径测试。2.1 逻…

java全局变量和局部变量

分类&#xff1a; 变量按作用范围划分分为全局变量&#xff08;成员变量&#xff09;和局部变量 成员变量按调用方式划分分为实例属性与类属性 局部变量按定义位置划分分为形参&#xff0c;方法局部变量&#xff0c;代码块局部变量 成员变量&#xff1a; 直接在类中声明的…

电脑系统知识:Windows原版系统与Ghost系统的区别,你知道吗?

经常看到有电脑小白的朋友问原版操作系统跟Ghost的区别是什么&#xff0c;该怎么选择安装哪种系统&#xff1f;今天在这里就说说它们之间的联系与区别。Windows原版系统&#xff1a;原版系统就是微软推送给用户的原始“干净”的系统。系统不含第三方的软件&#xff0c;软件补丁…

sql server update触发器_SQL Server 触发器

T-SQL 触发器触发器分为BEFORE触发器*(SQL Server不支持&#xff0c;Oracle支持)在事件发生时触发。AFTER触发器是 SQLServer生成的最初用于自动相应数据修改的机制。在 SQLServer200以前的版本中 AFTER触发器是唯一的触发器&#xff0c;因此不用指明 AFTER&#xff0c;也可以用…

iOS 公司开发者账号申请

对于独立开发者很有用,收藏起来,以备不时之需! 苹果开发者账号分三种。 个人账号&#xff1a;个人申请用于开发苹果app所使用的账号&#xff0c;仅限于个人使用&#xff0c;申请比较容易&#xff0c;$99。 公司账号&#xff1a;以公司的名义申请的开发者账号&#xff0c;用于公…

php渲染视图,Laravel 视图渲染:Blade 模板引擎

Laravel 视图渲染&#xff1a;Blade 模板引擎由 学院君 创建于3年前, 最后更新于 2年前版本号 #153378 views27 likes0 collectsBlade 简介Blade 是由 Laravel 提供的非常简单但功能强大的模板引擎&#xff0c;不同于其他流行的 PHP 模板引擎&#xff0c;Blade 在视图中并不约束…

项目管理基础:系统切换相关知识笔记

1、系统试运行主要任务对新系统进行初始化、补录各种原始数据记录记录系统运行过程中的数据和状况核对新旧系统输出结果是否正确对实际系统的输入方式进行考察主要包括是否方便、效率、可靠性、误操作保护等方面。对系统实际运行、响应速度进行实际测试&#xff0c;确定是否满足…

sql 分组统计_leetcode-sql面试题十七篇精讲合集

这可能是全网最干货的sql讲解系列文章。全系列共十七讲。做了大量的知识点的拓展&#xff0c;涵盖了sql的方方面面。欢迎关注点赞收藏&#xff0c;正在整理三年数据分析的点点滴滴。包括Excel、python、sql、power BI、各种分析模型框架。保证输出最干的干货。涉及知识点包括&a…

实时数据处理插件开发flume+kafka+storm:flume

有时间了再写。。。。转载于:https://www.cnblogs.com/wchb/p/5786582.html

项目管理基础:系统维护相关知识笔记

1、系统的可维护性系统的可维护性就是项目维护人员理解、改正、改动和改进该软件的难易程度。提高系统的可维护性是开发软件吸引所有步骤的关键目的&#xff0c;系统能否被很好地维护&#xff0c;可用系统的可维护性这一指标来衡量。1.1 系统可维护性的评价指标可理解性&#x…

java ibm 2035,C# java 连接 IBM MQ时出现 2035 或 2013认证错误的解决方法

当C# 或 java 连接 IBM MQ 是出现 2035 或 2013的错误时java的错误提示&#xff1a;com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: 为队列管理器“QM1”提供的安全性认证无效&#xff0c;连接方式为“Client”&#xff0c;主机名为“9.186.105.212(1414)”…

python给两个列表排序方法_Python连接两个字符串列表并对其元素排序的最佳方法...

假设我有两个字符串列表&#xff1a;x[a,b] and b[c,d]我需要的最终结果是&#xff1a;^{pr2}$重要的一点是&#xff0c;我希望对列表元素的字母进行排序。在这里&#xff0c;他们是建设&#xff0c;但在我的实际问题&#xff0c;这不是这样。所以如果我有“ba”&#xff0c;在…

mac搭建本地svn

1.终端&#xff0c;创建SVN资源文件库 svnadmin create /Volumes/DATA/SVNTest 2配置权限 上面的语句执行完之后在相应路径下可以找到该文件夹&#xff0c;打开之后 这里主要是修改conf里面的是三个文件&#xff1a;authz&#xff0c;passwd&#xff0c;scnserve.conf a.authz …