Kaggle比赛:Text Normalization for English银牌全程记录

问题描述

所谓“文本正则”,即将手写形式的文本转换成语音形式的文本。

例子:

  • 手写:A baby giraffe is 6ft tall and weighs 150lb.
  • 语音:A baby giraffe is six feet tall and weighs one hundred fifty pounds.

调研

目前kernel上主要以收集大辞典的方法为主流。

基于RNN的方法在paper中提到说效果不佳,paper上的实现方法是char进去,word出来。这样word的个数在训练集里就有6w多个,太多,训练效果不好。char到char的话又会丢掉很多上下文信息,比如$ 6对应的six dollars,要互换顺序,还要加复数,很难有好的效果。

token的所有类别:['PLAIN', 'PUNCT', 'DATE', 'LETTERS', 'CARDINAL', 'VERBATIM', 'DECIMAL', 'MEASURE', 'MONEY', 'ORDINAL', 'TIME', 'ELECTRONIC', 'DIGIT', 'FRACTION', 'TELEPHONE', 'ADDRESS']
其中,'PLAIN', 'PUNCT'是输出和输入相同的类别。但训练数据中,只有'PUNCT'的输出和输入完全相同,'PLAIN'的输入和输出相同的个数是:7317175,总共个数是:7353693。比例是:0.995034059757458。这里后续需要继续调查。

在训练集中,'PLAIN', 'PUNCT'所占的比例是0.931。

解决方法进化记录

2017-11-2

0.9937-198/489

使用kernel中提供的方法尝试了一下。大致上就是从训练语料中提取一个大辞典,这个词典包括所有词以及其映射。不同的方法引进了更多的额外训练语料。

2017-11-5

0.9164

用xgboost训练了一个二分类器,判别某个token是不是属于'PLAIN'+'PUNCT'。是则输入和输出相同,否则输出""。得到这个准确率。

2017-11-6

0.9835

用xgboost训练了一个三分类器,判别某个token是否属于'PLAIN', 'PUNCT'还有其他。

2017-11-8

最终发现还是要使用全分类器full_classifier,即16个类别全都分全。然后针对每个类别手动设计normalize的过程full_replacereplace_by_rule。并使用test/test_one_class.py一个一个类别调准确率。这一阶段准确率的提升主要来自对每个单独类别的normalize的优化。

准确率:0.9908->0.9921->0.9937->0.9942->0.9951->0.9954->0.9956

排名:75/554,已经进入铜牌区域,但也进入了瓶颈,单独类别的转换准确率很难找到大幅提升的改进点。

使用脚本full_replace_train.py发现所有的训练数据,如果知道其分类,那么normalize的准确率是:9913201 / 9918441 = 0.9994716911659807。也就是说,错误的数目只有5k+了,继续修改normalize上升空间有限。

2017-11-11

转换思路,继续提高分类器的准确率。

思路一:增加人为判定规则

根据对数据的分析,发现分类器有几类典型错误:

  • 1.被误认为是cardinal的实际上的date的年份。这类情况特征明显,长度是4的数字都判为date即可。
  • 2.被误认为是plain的实际上的electronic的网站,比如baidu.com之类的,写一个简单的规则判断。

上面总结的规则都集中在patch_classifier.py脚本中,在分类器给出判定结果之后再跑一遍,作为对分类器的修正。

思路二:直接提升模型准确率

  • 1.特征工程:token的长度;是否是一句话中第一个token。目前特征工程对模型准确率没有明显提升。v2
  • 2.调整权重:因为本次任务是非常unbalanced的分类任务,因此最好对于不同类别的数据,在计算loss的时候,采用不同的权重。v3
  • 3.调参:关键参数:max_depthround_numv2

比赛记录

2017-11-15

比赛第一天,新的测试数据发布。按照之前的模型跑一版,到0.9933,直接窜到第三名。也不知道可以坚挺多久。

使用大字典的方法跑了一个baseline:0.9893,用作后续提高的对比数据。

2017-11-17

寻找错误大概从两个方向上去找:1.找分类器分错的类别。2.找normalizer没有换对的情况。

分类器分错的类别可以通过分类器输出的分类信心概率来获取。比如使用xgboost中的'objective': 'multi:softprob'参数设定。检查prob值特别小的数据。

通过最终结果去找可以直接使用大字典跑出来的baseline去比较不同,但这个方法也不尽靠谱,不同的不一定错,相同的不一定对。但也可以从中观察,找到一些规律。

还可以直接在最终的结果中去找数字和特殊符号,一般是normalize失败的情况,这个方法可以查出来。

目前是0.9947。

2017-11-20

今天是比赛最后一天,发现之前xgboost的参数设置有问题: 'nthread': -1,直接删掉,因为默认值是最大值。果然重新运行之后cpu的8核满负荷运行。快了很多。

另外把之前的基于context的方法做了一下修正:之前每个token都会包括上一个token和下一个token。那么句子中的最后一个token的context会包含下一句的第一个token,句子的第一个token的context会包含上一句的最后一个token。这显然是不对的。因此在每句之间加入全0向量。忽略该向量本身,只是用于其他向量的context。

最后一天重新check所有类别的rule函数,发现还有不错的可改进空间。

还能继续改的:

  • ORDINAL: 前面有没有the的问题。
  • VERBATIM: # 是hash-tag还是number的问题。

2017-11-21

比赛结束,最终在private上的结果是0.9937,15/260,属于top6%,silver medal。

可以继续改进的是分类器的性能,以后有机会继续做。

其他信息

使用到的第三方包

  • roman:罗马数字和阿拉伯数字的转换。
  • num2words:文字和数字的转换,支持序数的数字。
  • inflect:单词复数形式的转换等。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容