加入用户自定义词典后,分词效果下降

问题描述
我在SIGHAN2005-PKU语料库上测试分词器的效果,但出现分词效果不一致的情况。(问题1)
同时把pku_training_words.txt作为自定义词典加入后,效果反而变差了。(问题2)
请问怎样加入自定义词典才能提升分词效果?

问题1
HanLP主页提供了两种方式配置HanLP,但两种方式下分别使用标准分词器对同一句子分词效果不一致?
配置maven的方式一,倾向于把词拆分,如 改革开放 分词为 改革开放
而下载jar包的方式二,倾向于把词合并,如 改革开放 分词为 改革开放
请问这是为什么?

以下是使用 StandardTokenizer.segment() 对三个句子的分词结果

         * pom portable-1.8.0
         * [共同/d, 创造/v, 美好/a, 的/uj, 新/a, 世纪/n, ——/w, 二○○一/m, 年/q, 新年贺词/nz]
         * [改革/vn, 开放/v, 较/d, 快/a, 的/uj, 基础/n, 上/f, ,/w, 开展/v, 新/a, 的/uj, 努力/ad, 奋斗/v]
         * [女士/n, 们/k, ,/w, 先生/n, 们/k, ,/w, 同志/n, 们/k, ,/w, 朋友/n, 们/k]
         *
         * jar release-1.8.0
         * [共同/n, 创造/n, 美好/n, 的/n, 新世纪/n, ——/n, 二○○一/m, 年/n, 新年贺词/nz]
         * [改革开放/v, 较快/d, 的/n, 基础上/nz, ,/n, 开展/n, 新的/a, 努力奋斗/v]
         * [女士们/nz, ,/n, 先生/n, 们/n, ,/n, 同志们/nz, ,/n, 朋友们/nz]

问题2
在release-1.8.0版本下,使用 StandardTokenizer 分词器进行分词,我把 pku_training_words.txt 作为用户词典加入后,分词各指标均下降了约2%。

我检查了一些分词错误的情况,如下。词典里是没有 不具全人 等词的,为什么加入用户词典后会这么切分?加入自定义词典的正确方式应该是怎样的?

case standardTokenizer分词 加入用户词典后
二○○一年 二○○一 / 年 二 / ○ / ○ / 一 / 年
不 / 具备 / ,/ 时刻 / 面临 不具备 / ,/ 时刻 / 面临 不具 / 备 / ,/ 时 / 刻面 / 临
全人类 全人类 全人 / 类
本 / 民族 本 / 民族 本民 / 族

自定义词典:

# pku_training_words.txt
打头阵
夏普吐勒乡
黎明
宣
19980118-04-005-004
19980114-05-005-004
预应力
...
1 Like

除非做迁移学习,当用来训练模型的语料库标注标准不一样时,拿到同一个语料库上跑分的做法没有任何意义。想不到《自然语言处理入门》出版两年了,这种错误认知还是没有被消灭。

词典会改变模型中的词频,进而影响Viterbi的打分结果。挂不挂载词典,挂什么样的词语,都需要理解算法才能达到最佳效果。

首先感谢回复。

对于问题1,我想知道的是,portable-1.8.0release-1.8.0两个版本的同一个api(如: StandardTokenizer.segment())对同一个词,分词结果不一致的原因。我原来的推测是代码有变动或词典不一样,但从您的回复我好像没有获得答案。

至于您说的 跑分 ,只是我在学习nlp和使用hanlp过程中,想看下测试效果而已。比较也只是控制变量在同一个api之间察看变化,不知有何不妥。

对于问题2,原因可能较复杂,本来也只是想获取一个思路。我看了下代码,分词时Viterbi打分好像依赖的是核心词典词频和bigram。“词典会改变模型中的词频”,自定义词典也影响?

两个版本用了不同的模型,而且是从不同的语料库训练而来的。非portable版用的语料颗粒度更大,有很多实体,更加符合信息抽取的需求。举个例子,该语料姓名是合并的,而你用的sighan pku的姓与名是分开的。假如HanLP能100%准确地将姓名分为整体,那就意味着HanLP在sighan pku标准下100%犯错,这就是绝大多数人没有意识到的问题。

不谈迁移学习时,你控制变量没有考虑数据和目标领域是否匹配,就像控制一个美国人参加中国语文高考然后用分数衡量别人的英文水平一样,虽然是同一个人,但结果毫无意义。一个空白的大脑就是空白的模型,你往里面填入英文知识就应该用英文评判他的语言水平。同样,一个模型,你要评判它PKU标准的分词能力,就应该用PKU语料训练它。这在paper里是不值一提的前提,可惜的是,网络上绝大多数人都没意识到。

同样依赖unigram。当自定义词典与unigram冲突的时候,前者会overwrite后者。

感谢解答,关于自定义词典的使用我再学习下。

关于您说的语料库差别,在您之前的github文档我已经看到过,是知道的。我也有在新语料库上重新训练模型。

测试的出发点不是您比方的样子。并不是夸张地说用语言模型去做图片的任务这样。分词不是从零开始,并不完全"空白";新的语料库标准存在差异但大同小异。我控制变量,是改变条件看对结果的改变,重点不在分数,关注的是条件改变对结果是正还是负影响。也可能确有不妥,下次再严谨些,感谢您的指出。

再次感谢回复,向您学习。

1 Like

你的自定义词典质量不行吧,我最近做了个新词发现实验,取最终结果的前50k作为词典,采用jieba,关闭新词发现,在pku那个数据集上测试结果f1有0.76