@作者: 研发中心算法平台 @迪吉老农
最近被组里的老大要求,分享一些自己在微博工作中实践的一些机器学习算法。由于自己也是菜鸟,很多实验其实都是简单尝试,希望给大家提供一些启发就好了。
一. 问题的定义
“标题党”作为一个新近才出现的名词,并没有明确的定义。根据华东师范大学雷启立的观点,“标题党”是这样一些信息发布者和转发者的总称,《注意,这些都是“标题党”的套路!》。
他们在各种媒介的传播过程中,尤其是在网络媒体和娱乐报刊上,用夸张、歪曲等手段加工制作耸人听闻的、与实际内容并不相符甚至截然相反的标题,以吸引受众或阅听人的关注。
根据微博头条运营的要求,标题党是指,
标题中出现主观色彩浓厚的字眼,都视为标题党。关键词:“惊现”、“惊爆”、“竟然”、“竟”、“胆敢”、“史上”等。
由此,我们可以将标题党分为两个维度来考察。
- 耸人听闻(一期解决)
- 强烈情感(震惊,!)
- 带情绪和态度(千万别吃,深度好文)
- 促成传播(赶紧告诉,转疯了……)
- 污(睡了老板的儿子,竟然被老板逼到墙角…)
- 文不对题(二期解决)
- 标题不正经,内容很正经
二. 模型
根据同事所述,腾讯在识别标题党时利用了词向量模型。我们也采用类似的解决方案。先构建分词的词向量,再训练一个线性模型和一个循环神经网络,二选一。
1. 数据收集
运营提供了原始的标注数据,大概总量为9000篇长文库文章,包含微博,头条文章和转码新闻。其中有200篇被标记为既耸人听闻,且同时文题不对。
根据网上一篇《标题党常用套路》,收集了将近200个左右的词和标点,见conf/keyword/key
文件。通过这批关键词,搜索已入库的文章,基本可以分开标题党和正常样本,准确率大概在90%左右。
本来试图利用账号来提纯数据,找出了一批标题党大户和正常文章大户;但是,用户也并不是那么纯。检查了一下,识别到的文章确实基本是标题党,误伤也不多。很难从这个维度来提纯。
正样本方面,数据量150万,构成包括如下几个来源,
- 原生头条文章中命中关键词的部分(90万)
- 命中关键词的特定媒体新闻(61万)
- 运营标注的标题党文章(9000)
- 模型识别的色情头条文章(1万)
负样本方面,数据量205万,构成包括如下几个来源,
-
合作媒体头条文章中未命中关键词的部分(200万)
-
参考消息历史发布的新闻(4万)
如果直接使用这样的样本,会存在很严重的过拟合问题,因为基本上都是用关键词扫出来的,所以模型很容易就可以学会,只要关注这些词。事实也是这样,通过这样的样本训练出来的模型,最终在场外数据上,准确率只有80%。
其实,我们希望,通过这些关键词,来学习到其他关键词的特征。所以,在数据预处理阶段,我们对关键词进行随机剔除;比例是,忘记80%以上的感叹号,忘记10%的其他关键词。
2. 词向量
词向量模型我们采用的是最近Facebook开源的fastText模型。在初期调研时,发现网上认为此模型是主要是针对拉丁语系有较大改进,但是对于中文没有作用。
但是我认为正相反。fastText模型,主要是引入用字符的含义来表示单词的含义;对于中文来说,恰恰单词和其中的字符含义联系非常紧密,比如,
- 我们 = 我 + 们
- 脸型 = 脸 + 型
因此,fastText从理论上讲对于中文是再适合不过的了。
2.1. 词向量训练
对于词向量的训练数据,我们收集了最近半年头条文章入库数据,总量为1300万。提取了标题和摘要部分,文件combined_word
大小为16G。处理后的样本如下,
TS 机顶 闪灯 高阶 新 玩法 TE 摄影 这件 事 , 一直 无法 离开 「 硬件 」 的 讨论 。 要 拍照 , 手上 至少 要 有 一部 机身 及 一个 镜头 吧 ? 镜头 或是 机身 的 好坏 , 多少 会 影响 成像 的 质量 , 留待 下回 讨论 。 就 herman 老师 的 教学 规划 来说 , 闪灯 的 基础 玩法 , 不外乎 相机 、 镜头 , 再 加 一支 闪灯 。 闪灯 在 不 加装 任何 配件 下 , 都 属于 基础 的 应用 , 晋级 高阶 闪灯 , 可 从 「 离机 闪灯 」 或 离机 闪灯 搭配 控光 配件 开始 , 有 哪些 该 准备 的 器材 呢 ? 所谓 的 架 灯 装备 , 就是 当闪灯 从 相机 上拿开 之后 , 要 有 一个 方法 让 它 放置 在 我们 要 打光 的 地方 。 分为 「 座 」 及 「 伞座 关节 」 二项 来 讨论 。
TS luca pierro - 人像 机理 TE 也许 你 会 觉得 摄影师 luca pierro 所 拍摄 的 照片 大多 都 是 经过 了 photoshop 处理 的 , 其实不然 , luca pierro 个人 是 希望 尽可能少 地 利用 后期 软件 。 他 在 拍摄 过程 中 会 使用 大量 的 辅助工具 , 比如 牛奶 , 水 , 荧光 剂 等等 来 实现 照片 中 的 效果 , 质感 以及 光线 。 本站 所有 图片 都 来自 互联网 , 如 侵犯 了 您 的 权益 请 联系 我们 。 gao @ imgii . com 也许 你 会 觉得 摄影师 luca pierro 所 拍摄 的 照片 大多 都 是 经过 了 photoshop 处理 的 , 其实不然 , luca pierro 个人 是 希望 尽可能少 地 利用 后期 软件 。 他 在 拍摄 过程 中 会 使用 大量 的 辅助工具 , 比如 牛奶 , 水 , 荧光 剂 等等 来 实现 照片 中 的 效果 , 质感 以及 光线 。
fastText训练模型使用下面命令进行,
./fasttext skipgram -input ../data/combined_word -output ../release/fasttext/combined_result_minCount.20 -lr 0.025 -dim 200 -ws 5 -epoch 3 -minCount 20 -neg 5 -loss ns -bucket 2000000 -minn 1 -maxn 1 -thread 10 -t 1e-4 -lrUpdateRate 100
当使用10个CPU并行训练时,大概花费9个小时,生成两个模型文件,
-rw-rw-r-- 1 yandi yandi 2.6G Jan 18 05:37 combined_result_minCount.20.bin
-rw-rw-r-- 1 yandi yandi 1.2G Jan 18 05:39 combined_result_minCount.20.vec
其中.bin
文件是二进制的,仅供fastText自己用,.vec
文件含有每个词的词向量,可以被其他工具使用。我们可以控制词的最小出现次数,来控制词库的大小。当这个值设为20时,词库大小为50万;当设为10时,词库大小为100万。效果有一定差异,词库大的时候效果略好些,但需要平衡效率。
2.2. 词向量的结果
u"周杰伦" u"曝光"
周董 0.912030339241 曝出 0.768530964851
杰伦 0.810884892941 曝照 0.722024023533
林俊杰 0.77087563276 曝 0.718825936317
陈奕迅 0.7669069767 曝新照 0.702012419701
昆凌 0.758495569229 曝新图 0.694230794907
周华健 0.75665795803 曝出定 0.691053748131
汪峰 0.746971547604 曝私照 0.686150670052
庾澄庆 0.74380153417 爆光 0.682669639587
王力宏 0.74315690994 曝美照 0.681045114994
古巨基 0.72311288118 照首 0.6799736619
u"网红" u"男子"
网络红人 0.845194995403 女子 0.848182082176
网红界 0.745761871338 中年男子 0.80809813
网红们 0.741377592087 小伙 0.731711924076
网红主播 0.737845778465 小伙子 0.6797853708
红人 0.730228245258 一男 0.675637125969
网红大 0.710846602917 醉汉 0.67495149374
网红成 0.702744066715 妙龄女子 0.67301195
当网 0.697590351105 老汉 0.661506414413
网红有 0.693999826908 这名 0.65962433815
微博红人 0.692595779896 男青年 0.6569785475
u"人工智能" u"川普"
ai 0.874792337418 特朗普 0.90350252389
图像识别 0.758032798 特普朗 0.84866189956
人工智慧 0.754015564 在川普 0.84544670581
自然语言 0.749078154 希拉里 0.82735055685
吴恩达 0.74302035570 trump 0.825385510921
人机交互 0.736301541 是川普 0.81274479627
alphago 0.725706100 唐纳德 0.80151343345
智能家居 0.724472761 和川普 0.80074495077
机器人 0.72356706857 川普是 0.80059677362
神经网络 0.717823863 美国共和党 0.7959831
u"iphone" u"国务院"
iphone7 0.923178136349 国务院办公厅 0.7832772135
6s 0.887644767761 中共中央国务院 0.75425845
7plus 0.875260293484 中共中央政治局常委会 0.74
iphone6s 0.868257045746 国家能源委员会 0.73728740
plus 0.867802739143 共中央政治局 0.7286440134
iphone7plus 0.840588033 中央人民政府政务院 0.7275
macbook 0.834097862244 省政府 0.725946247578
iphone8 0.831128776073 常务会议 0.716139256954
iphone6 0.823108375072 国办 0.715759754181
iphone5s 0.815515637398 中国中央政府 0.7145972251
从这些例子中,我们可以看到一些有意思的词之间的联系,对于词的变种有很好的识别能力。这一点在之前的word2vec模型中很难看到,比如,同样是”国务院“,在word2vec中的相似词如下,
Word: 国务院 Position in vocabulary: 1625
Word Cosine distance
------------------------------------------------------------------------
国家发改委 0.753853
省政府 0.749836
中共中央 0.748351
国土资源部 0.735297
办公厅 0.717380
印发 0.707668
财政部 0.692694
国务院常务会议 0.685587
中央 0.673836
食品药品监管总局 0.666146
发改委 0.665496
工业和信息化部 0.664550
中央编办 0.660507
交通运输部 0.655486
教育部 0.651662
国家信访局 0.644417
工信部 0.642812
中办 0.640889
住建部 0.638346
国家知识产权局 0.634628
国家食品药品监督管理总局 0.632023
商务部 0.630894
全国人大 0.630677
中国政府网 0.629161
常务会 0.627901
虽然都是相似的概念,但是并不是像fastText中,出现第一直觉中应该出现的词。
此外,我们测试了词向量对于新词的泛化能力。我们比较”苹果“与”iphone“之间的相似度是0.79,”手机“与”iphone“的相似度是0.70,当我们遇到新词”苹果手机“时,可以分解为 ”苹果“ + ”手机“,这个和向量与”iphone“的相似度有所提高,达到了0.85。测试代码如下,
In [48]: w1 = np.array(model[u"苹果"])
In [49]: w2 = np.array(model[u"手机"])
In [50]: w3 = np.array(model[u"iphone"])
In [51]: cosine_similarity(w2, w3)
Out[51]: 0.70031447135100744
In [52]: cosine_similarity(w1, w3)
Out[52]: 0.79121870765700419
In [53]: cosine_similarity(w1+w2, w3)
Out[53]: 0.84891451334539081
3. 分类模型
3.1. 线性模型
fastText模型利用词向量构建了一个线性逻辑回归,它的"fast"主要体现在类目特别多的时候(并不是很适用于我们的二分类场景),但是可以作为一个baseline。
这个模型的训练的确非常迅速,250万的标题训练数据,只需要大概2分钟即可完成。
./fasttext supervised -input ../data/classify/train_title -output ../release/supervised/model -label "T" -pretrainedVectors ../release/fasttext/combined_result_minCount.20.vec -dim 200 -minCount 5 -wordNgrams 2
模型的准确率和召回率均在90%左右,
./fasttext test ../release/supervised/model.bin ../data/classify/test_title
P@1: 0.886
R@1: 0.886
P@0: 0.901
R@0: 0.901
Number of examples: 585
3.2. 循环神经网络
采用长短期记忆模型,输入层是200维的词向量构成的序列,输出200维的隐含层,并跟着一个二分类的逻辑回归。模型结构如下,
____________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
====================================================================================================
embedding_1 (Embedding) (None, 60, 200) 0 embedding_input_1[0][0]
____________________________________________________________________________________________________
lstm_1 (LSTM) (None, 200) 320800 embedding_1[0][0]
____________________________________________________________________________________________________
dense_1 (Dense) (None, 2) 402 lstm_1[0][0]
====================================================================================================
Total params: 321202
____________________________________________________________________________________________________
模型训练时间比较长,在同样的250万样本上训练,花费需要三个小时。准确率与线性模型基本没有差别。但是实际的效果需要在具体例子上看。
classification report:
precision recall f1-score support
0 0.91 0.92 0.91 331
1 0.90 0.88 0.89 254
avg / total 0.90 0.90 0.90 585
confusion_matrix
[305 26] (0) T0
[ 31 223] (1) T1
(0) (1)
4. 模型效果评估
4.1. 效率对比
对于单条文本,线性模型的预测时间为661 µs per loop,LSTM模型的预测时间为17.8 ms per loop。线性模型要快30x左右。
4.2. 具体例子比较
我们考察具体例子的预测分数是否更加符合我们的预期。
model.predict(u"猛:井陉一无牌路虎惨烈“受伤””)
lstm: 0.40669337, linear: 0.12269181
model.predict(u"残忍!姑父举起大石疯狂施暴 两幼童脑袋被砸裂")
lstm:0.99474204, linear: 0.4345918
model.predict(u"临汾市长被约谈,过山车般的空气数据仅是巧合?")
lstm: 0.96778059, linear: 0.86791497
model.predict(u"男子入室盗窃 在失主家睡觉泡脚吃泡面”)
lstm: 0.018168509, linear: 0.1410915
model.predict(u"所罗门群岛附近发生7.9级地震 已发布海啸预警")
lstm: 0.023213819, linear: 0.056683559
model.predict(u"官方预测春节易堵50个高速路段 看看你是否受影响”)
lstm: 0.65581375, linear: 0.87043881
model.predict(u"到底直20有没有山寨美军黑鹰 军事专家这个回答说得太妙了")
lstm: 0.986094, linear: 0.98718309
model.predict(u"汽车停福州一小区外半夜莫名起火 原因正在调查")
lstm: 0.102975, linear: 0.28362489
model.predict(u"蒙古国客商中国牧区卖年货")
lstm: 0.010370466, linear: 0.063880466
model.predict(u"中国海军60多年诞生8任司令员 这一位最特殊”)
lstm: 0.98017061, linear: 0.66516042
model.predict(u"上千核弹百枚洲际导弹几十万人在保卫中国!”)
lstm: 0.39319009 (bad), linear: 0.63593394
model.predict(u"武警部队举行晋升警衔仪式:苏瑞超等5人晋升少将")
lstm: 0.0059623006, linear: 0.054258645
model.predict(u"当我们谈保险行业客服转型时我们在谈什么?泰康在线的SaaS客服进化论")
lstm: 0.80259615, linear: 0.80282485
model.predict(u"评论:终于,我们还是回到了打车难的时代")
lstm: 0.42436689, linear: 0.84423429
model.predict(u"联通决定与阿里云合作,大型机构已成云厂商生死关键")
lstm: 0.28846085, linear: 0.25465807
model.predict(u"比马云还大的咖说:他根本没关注人工智能!")
lstm: 0.92135727, linear: 0.96965224
model2.predict(u"比马云还大的咖说:他根本没关注人工智能")
lstm: 0.43958077, linear: 0.87223905
model.predict(u"车臣妇女的反俄行动【1994年】 ")
lstm: 0.20256844, linear: 0.27765015
model.predict(u"姿势不对?敬业福要这么扫容易获得!2017支付宝集五福扫福福字图片!")
lstm: 0.99286544, linear: 0.90234852
model.predict(u"吴伯凡:“ABC时代”中国当从生产制造端把握机会")
lstm: 0.049107336, linear: 0.15570614
model.predict(u"全美多地爆发游行,有民众称:特朗普只是推特达人")
lstm: 0.14996453, linear: 0.30317178
model.predict(u"李易峰“调戏”易烊千玺,私下人品大曝光!")
lstm: 0.98040855, linear: 0.9235093
model.predict(u"她是黑道大小姐,半个台湾娱乐圈都是她好友,差点抢走孙俪老公!|")
lstm: 0.99323493, linear: 0.99461466
model.predict(u"小宋佳穿性感深V礼服与海清同台争艳,你更喜欢谁?")
lstm: 0.9946996, linear: 0.99238187
model.predict(u"习近平发表讲话")
lstm: 0.0031805797, linear: 0.06442067
model.predict(u"习近平发表讲话!")
lstm: 0.69417983, linear: 0.34600291
model.predict(u"习近平发表讲话!!")
lstm: 0.99408418, linear: 0.58395731
线性模型在这里可以说是全面劣势,
- 在非标题党的数据上,LSTM可以把分数压得很低,而线性模型总是有一个小值。
- 对于语序有要求的例子中,比如u"残忍!姑父举起大石",线性模型无法识别,但是LSTM做的很好。
- 对于标题党的组合特征,比如两个感叹号,线性模型的增加是缓慢的,但是LSTM增长是非线性的,比较符合预期。
综上,虽然LSTM效率比较低,但是在数据表现上的优势明显,应该选用。
4.3. 人工评估
我们筛选了一天的头条文章场外数据,包括一些识别为色情的文章,总共27836篇。其中识别分数大于0.9的标题党文章6008篇,分数小于0.1的正常文章13161篇,其余8667篇文章分布在0.1到0.9之间。这三部分的内容,各随机抽取1000篇,由人工评估效果。
我们列举一下抽样的数据,
- 标题党数据(22%)
合适的时间,合适的事情,合适的人! 0.994
春节将至你对年终奖满意吗?不少人不满意 0.964
科比是詹皇最强对手?大错特错,邓肯才是他最强宿敌 0.985
南宁街头"小黄车"会黄掉吗 如何让车辆合法上路? 0.929
过年开车回家一定要注意安全啊! 0.989
虽然没人理你这些破事,但是还是要写出来 0.996
甜品固然好,我来拔拔草! 0.984
vivo X9《真正男子汉2》节目背后的大数据解读! 0.949
《礼花》。黑爷生贺。文笔渣ooc慎入。 0.965
李溪芮的腿,迪丽热巴的脸,成娱乐圈抢着要的香饽饽 0.948
- 非标题党数据(49%)
《极限特工3》插曲《Juice》优酷首发MV 吴亦凡演绎DJ特工 0.026
中国选手包揽匈牙利乒乓球公开赛全部金牌 0.026
带彩麻将下岗 多彩文化上线(移风易俗气象新) 0.012
北京市脐血库通过AABB复审 0.012
通辽市委常委班子召开2016年度民主生活会 0.007
检察官明察秋毫 未成年不予起诉 0.019
长安:全年追回欠薪1352万元有效维护劳动者合法权益 0.002
淮河生态经济带的绿色发展思路 0.003
2017年高校毕业生将达795万人 就业任务繁重 0.003
福原爱忙于婚事半年未系统训练 东京奥运已渺茫 0.049
- 中间数据(32%)
在最美的年纪相遇,不想同你说别离 0.867
南朋友你好(1) 0.42
酷比魔方 iwork1X平板电脑体验评测:合二为一,“轻薄”只为你! 0.899
蜜糖公主的故事 0.37
驶入高速区 新手上高速注意事项全攻略 0.73
老年人养生三大误区需注意 0.101
12星座男生眼中最有魅力的星座女 0.609
全国大部今起回暖天气晴好,冷空气26日再袭 0.133
第一章 见面 0.307
父母很愿意成为孩子的手机地图 0.307
三. 小结和计划
从目前的效果上看,标题的吸引力可以被很好的捕捉到。
后续第二阶段,会考虑标题和正文的相关性,将正文与标题联系不紧密的,让人感觉受骗的文章找出来。这方面,大家如果有好的建议,欢迎告诉我~
版权声明
以上文章为本人@迪吉老农原创,首发于简书,文责自负。文中如有引用他人内容的部分(包括文字或图片),均已明文指出,或做出明确的引用标记。如需转载,请联系作者,并取得作者的明示同意。感谢。
网友评论