【NLP competition】中文信息学会 文本溯源技术评测(SMP ETST)

此次的文本溯源项目我们以n-gram为核心思想,构建候选句子对的评测标准。
用TF-IDF和词袋模型的的思想来预筛选候选句子对,大大提升算法效率。
最后用了两种切词方式的模型融合和规则后处理(提升很小)。
Final-Leaderboard Ranking First

原文发布于个人博客(好望角),那里有更好的阅读体验。


2018.07.24更新
经过组委会测试算法的高效性和原创性,我们最终获得了SMP-ETSE测评的第一名。
最终获奖名单
评测任务介绍
测评代码开源


以前没有参加过NLP类型的比赛和测评,每天看论文想idea的日子有些许的枯燥和单调。
就和一个同学趁着期末考试复习期间(实力作死)的空闲时间,抽出时间玩了玩这个比赛。
SMP 2018 测评地址

题目分析

本次的文本溯源题目和同期的另外两个比赛其实很相似。
蚂蚁金服计算句子相似度
拍拍贷识别相似的问题句子
但文本溯源又和另外两个题有着本质的不同,因为主办方放出的数据并没有任何标签。很明显,我们需要一个无监督的算法来找到句子之间的潜在语义关系,红的发紫的深度学习在此没有用武之地。
恐怕这也是为什么这个测评的参加人数如此之少的主要原因吧。

  • 验证集
    • 待溯源句子1000
    • 候选句子约10W
  • 测试集
    • 待溯源句子4000
    • 候选句子约500W

思路一

根据我们之前的一些经验,探讨两个句子之前的相似性的时候,n-gram就是一个简单,并且行之有效的方法。这也是我们最早的想法。

思路二

另一个想法,传统的NLP parsing技术在理论上会比简单的n-gram 方法更好的分析句子结构,从而帮助计算机理解句子语义,找到对应的句子。
但是,整个代码构建工程量大,实现难度较高。

我们的当然要从简单的第一种思路入手尝试。(也是我们最后采用的方案)

预处理

按照思路一构建一个简单的baseline,在没有调参和仔细预处理之前,在验证集上取得了0.8737 的成绩,这也给了我们继续这一方法的信心。

随后我们反过头来仔细进行预处理。

  • 处理影响分词效果的杂乱字符
    • 直接删除
    • 将他们替换为空格
  • 对于数据进行全半角格式转换(计算机并不认为相同字符的全半角格式是一样的字符)

符号预处理之后,在验证集获得了0.9008的表现 ,
然后又轻微调参(根据不等式,我们知道,P、R相等的时候,F值表现会是最好的),验证集表现上涨到了0.9087

切词

在预处理方面,切词是最令人头疼的第一个地方。
我们有了很多开源的切词工具,最终选了用了thulacjieba两种。

我们发现这两种切词方法的本身都有一定的局限性,但是又有一定的互补性。
虽然用两种切词工具在时间上会对花费很多,但是为了更好的算法效果,我们采用两种切词方式(后来想想好像有点亏,这样的处理大约只能带来一个点的提升,但花费了大量的时间)。

python 代码运行效率的低效众所周知,对于测试集500W句子的数据量来说,可谓是十分头疼。

解决方式也很简单,直接调用两种切词方法的c++接口就好了。就可以体验飞一般的速度。

值得注意的是,thulac 的切词包在大数据量的情况下,会有崩溃的情况,原因未知。我们的处理方式是将500W数据切分成了四份,调用四次thulac的c++接口(多了三次的model载入时间),切词后再将所有数据合并起来。

TF-IDF

n-gram 方法固然简单高效,但也很容易想到一个缺陷。我们不应该对于所有的gram“一视同仁”!

所以我们建立了TF-IDF,根据每个词语在文档中的几个句子中出现,设立TF。
并且设立反向的IDF,为了不同频次的词语反向加权。

这使我们的验证集F值表现达到了0.9356

优化目标

对于深度学习,大家都知道。当我们的loss和最后的评价指标越相近的时候,模型的训练效果也往往是更好的。

一个简单的n-gram 通常是仅仅考虑精确率,我们为什么不进一步的考虑召回率呢?甚至直接对于F值进行优化?
这里有一篇ACL2014的文章作为参考

这样的优化操作之后,我们的验证集表现达到了0.9430

倒排索引(词袋模型)

以上主要是在算法精度上的优化,并且没有可以的优化算法效率。导致我们在每一次对齐的时候都要对10W数据做遍历比较……

为了使算法快点出结果,我们用了多进程的方法,但这显然不是长久之计。

经过观察发现。10W句子中的绝大多数句子,算法评价两个句子的相关性,都极低,对于我们的溯源任务造不成任何干扰,那么如何去掉他们呢?

不难想到,我们的算法基于n-gram,而对齐表现差的句子显然和目标句子重合的n-gram非常少。那么,我们为什么不讲这样的句子直接过滤掉呢?可以减少句子对的评价次数几百倍,大大提升算法运行效率!

具体的,我们首先用one gram对句子进行过滤(候选句子中连一个词语都没有出现在目标句子中,全部去掉不考虑);进一步的,还可以对 two gram 设定一定的阈值。让我们在算法精度和运行速度上进行权衡。

最终,我们算法经过此处理后。在10W验证集上的表现,从单进程500min缩短为了40s 以下,还没有损失精度!

模型融合 & 后处理

以上提到了两种切词方式,以及两种预处理方式。为了取得更好的算法效果。我们从它们排列组合后的四种方法中挑取了两个互补性较强的model进行模型融合。
验证集达到了0.9549的数值水准。

然后我们肉眼观察一些阈值附近的“疑似”对齐错误的句子。建立几个规则性的后处理操作。
验证集达到了0.96036的数值水准。

最终测试集结果

  1. 硬件环境

    • Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz
    • 内存 188 GB
    • Linux version 3.10.0-514.el7.x86_64 ,
    • gcc version 4.8.5 20150623 (Red Hat 4.8.5-11)
    • Python 3.4.5 ,numpy
  2. 运行时间参考

    • 预处理时间共 1267秒 (21.1分钟)
      • 符号处理 & 编码格式转换:218秒
      • THULAC分词(c++版本):272秒
      • jieba分词(c++版本):112秒
      • 计算TF-IDF 164秒
      • 建立倒排索引表 501秒
    • 核心算法:115秒 (1.9分钟)
  3. 最后数值表现

    • F1-Measure : 0.801258108905052
    • Precision: 0.7133356667833392
    • Recall : 0.9139013452914798
    • Ranking: First

尾声

虽然时间紧迫,经验不足。在比赛中和队友都有一些失误,但最终侥幸排名第一。

  • 做的不够好的地方:

    • 预处理不够精细
    • 切词处理没有去增加一个字典
    • 懒得去寻找同义词源,或者训练一个词语级别的翻译模型。理论上可以进一步提高算法表现。
    • 由于留给测试集出结果的时间只有24h,事先准备的代码不够充分。
    • 在测试集阈值设定的时候陷入了思维误区,算法最终的F值结果损失精度百分之三以上。
  • 做得比较好的地方:

    • 基本的n-gram 思路简单而高效。
    • TF-IDF使算法的评价方式更加合理。
    • 倒排索引是使算法高效,简洁。
    • 艰苦卓绝的后处理和肉眼调参……

最后:感谢队友这些天的付出,也感谢努力的自己。

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

推荐阅读更多精彩内容

  • 文本关键词抽取,是对文本信息进行高度凝练的一种有效手段,通过3-5个词语准确概括文本的主题,帮助读者快速理解文本信...
    atLee阅读 21,617评论 8 46
  • 常用概念: 自然语言处理(NLP) 数据挖掘 推荐算法 用户画像 知识图谱 信息检索 文本分类 常用技术: 词级别...
    御风之星阅读 9,003评论 1 24
  • 前面的文章主要从理论的角度介绍了自然语言人机对话系统所可能涉及到的多个领域的经典模型和基础知识。这篇文章,甚至之后...
    我偏笑_NSNirvana阅读 13,648评论 2 64
  • 关注和概要用神经注意的共同学习 摘要 询问相关排序和句子显著排序是两个主要的任务在提取询问专注概要。 之前的监督概...
    __子不语__阅读 944评论 0 0
  • 一声啼哭 为降生 一声饥饿 为需求 一声尊称 为感恩 爱同样也安抚了我三次 一次孤独无依的时候 一次彷徨无措的时候...
    鹿宥宥阅读 310评论 2 12