最近在用CRF做未登录技能词识别,虽然艰难,但是感觉很爽,效率非常高。
(1)数据准备:
选取30000行精语料作为训练数据。每一个br作为一条数据。使用已有的技能词典对数据进行无标注分词。
(2)训练数据标注:
对分词后的语料进行标注。如果某分词结果在技能词典中,则该词作为技能词进行标注;如果某分词结果不在词典中,则该词作为与技能无关词进行标注。标注规则如下:
标注采用3列,4-tag方式标注:B:技能词开头字;M:技能词中间字;E:技能词结尾字;A:与技能词无关字。
(3)修改模板:
技能词查找仍属分词系列,故未修改模板。
(4)数据训练:
使用CRF++工具进行模板+训练文本的训练。
(5)测试数据准备:
采用与训练文本同样的方式进行标注。使用模板+测试文本进行测试。
(6)测试数据生成结果:
测试生成标注列与通过词典进行标注的结果进行比较,第一次测试5000条数据共有141471个特征,标注错误数为3750个,错误率为0.0265。
(7)技能词识别成果:
将测试数据中生成的B、M、E进行合成,组成技能词。新技能词采用人工过滤计算比例。
训练:
crf_learn -f 3 -c 4.0 template 4train_text.data yuanbin_crf_model
测试:
crf_test -m yuanbin_crf_model 4test_text.data >>yuanbin_crf_final
实验结果:
第一次训练(train:10w;test:all):
第一次训练(train:10w;test:all):
100000条数据共迭代826次,耗时885.93s。
标注错误率:0.0166197028394
技能词识别数:11395
字典技能词识别率:0.32576
第二次训练:(train:10w;test:all;英文单独过滤,不经过CRF;丢弃'能力','及','思维','我';丢弃'管理','能力','处理','制作';丢掉标点符号,丢掉的部分可以抑制技能词的不断扩展)
100000条数据共迭代852次,耗时1085.97s。
标注错误率:0.0258394960395
标注错误率:0.0166197028394
技能词识别数:11395
字典技能词识别率:0.32576
新词数:7683
新词中技能词比例:0.522
技能词整体识别率:((11395 * 0.32576) +(7683 * 0.522))/ 11395 = (3712 + 4011)/11395 =7722/11395 = 0.68
技能词整体识别率:((11395 * 0.32576) +(7683 * 0.522))/ 11395 = (3712 + 4011)/11395 =7722/11395 = 0.68
第二次训练:(train:10w;test:all;英文单独过滤,不经过CRF;丢弃'能力','及','思维','我';丢弃'管理','能力','处理','制作';丢掉标点符号,丢掉的部分可以抑制技能词的不断扩展)
100000条数据共迭代852次,耗时1085.97s。
标注错误率:0.0258394960395
技能词识别:7683
字典技能词识别率:0.848887153456
新词中技能词比例(汉语):306 技能词比例:0.27
技能词整体识别率:(7683 * 0.85 + 1152 * 0.31)/ 7683 = (6530.55 + 357.12)/7683 =7722/7683 = 0.90
技能词整体识别率:(7683 * 0.85 + 1152 * 0.31)/ 7683 = (6530.55 + 357.12)/7683 =7722/7683 = 0.90
提高的原因:第一遍扩展了相当大一部分词典,所以第二次遍历词典词汇识别率很高,识别的新词数量减少。新技能词识别率低可能跟语料有一定关系。
第三次训练:(train:all;test:all)
580000条数据共迭代999次,耗时2932s。
标注错误率:0.0137764605234
580000条数据共迭代999次,耗时2932s。
标注错误率:0.0137764605234
技能词识别:7192
字典技能词识别率:0.790183537264
新词数(汉语):1114
新词中技能词比例:0.93
技能词整体识别率:7192* 0.79 + 1114 * 0.93)/ 7192 = (5681.68 + 1037)/7192 =6178.68/7192 = 0.86
技能词整体识别率:7192* 0.79 + 1114 * 0.93)/ 7192 = (5681.68 + 1037)/7192 =6178.68/7192 = 0.86
下降的原因:训练语料增加,字典包含的技能词的比例会减少,新词识别增多,且新技能词识别率较高。
第四次实验:(test:all;key_word_line加入了'熟悉','精通','熟练','了解','能够','掌握','建立' ,'使用','分析','项目','页面','非常','通过','进行','运用', '负责','设计','组织','知识','深入','根据','擅长','指导' ,'拥有','懂得')
没有训练(为了保证训练的精度)
标注错误率:0.0232847543088
技能词识别:14873
字典技能词识别率:0.46836549452
新词数(汉语):7040
新词中技能词比例:0.914
技能词整体识别率:14873* 0.47 + 7040* 0.914)/ = (6990.31 + 6432)/14873=13422.31/14873=0.9024615
技能词整体识别率:14873* 0.47 + 7040* 0.914)/ = (6990.31 + 6432)/14873=13422.31/14873=0.9024615
提升的原因:相比之下,key_word_line的数量增加了三倍,所以新词量增加很多,相应字典技能词的比例就减少。新词中的真实技能词的比例依然能达到90%以上,说明标注的效果非常好。
总结:
CRF能够有效识别新的技能词,在经过两次测试以后,新词的识别率都在90%以上,说明词典的扩充提高了数据标注的准确度,从而提高了新词识别的效率。
最终结果还是存在很多意义相同但说法不同的词汇。通过词条过滤有以下两个问题:(1)词条量不够,会把很多很好的词过滤掉;(2)冗余太多,占用系统资源;(3)会存在很大比例的非词条的技能词,词频依然可观。