Text Tag Recommendation 

--------2013/12/20

一: 背景

Kaggle上 facebook招聘比赛III。

任务要求是给定文本中抽取关键词。这里称作tag吧。

训练集是Stack Exchange sites上面的大量问答文本,每一个post上面有网页的title ,body, 用户打的tags。

示比例如以下:

 

測试集是也是相同的文本信息,可是没有tags,这次比赛的任务就是让參赛者从文本中预測出文本的tags,比方上面的java,unit-testing....

 

二: 评估指标

F1-score= 2*(precision *recall)/(precision+ recall)

这里的问题是 任务是没有告诉你文本的tags数量。假设你预測tags数量过多,precision就会非常低,可是,recall相对高点。这里的任务,预測tags数量也是非常重要的一方面。

 

三:训练集和測试集数据分布

训练集有600w+的文本,tags数量1-5,训练集合中tags数量是4w+。

測试集合大约200w+。

 

 

 

 

 

 

四: tag 预測推荐算法

1: 数据预处理

最開始时候我从文本中剔除掉停用词和对词进行词干提取。可是效果没有提升。后来,我放弃停止词和词干的处理。

在progamming中有一些停止词还是有价值的。

同一时候我把类似这种词: opt/lib/unix 分开成opt,lib, unix等等。

Title所有信息。body是抽取当中text信息。

 

2: cross-validation

从600w+训练样本中抽取前100w样本做cv训练集。接着从取10w样本作为cv 測试集(事实上从取1w cv測试集和10w測试集评估结果区别不大)。

 

3:训练模型

 

3.1  文本语料

从训练样本中计算词term的词频字典,term-tag共同出现频率词典。

训练样本的文本信息仅仅包括title信息,没有body信息,一方面大量训练样本已包括足够

多的文本语料,而body含有非常多噪音数据。增加训练样本中。会造成预測F1值减少。

文本语料中採用2-grams和1-grams。相对仅仅用1-grams,F1在測试集上表现能提高0.02的精度。

 

去除掉一些低频词,低频tag,高频词。

低频的,我们觉得不可靠。

 

def is_pass_record(prob_term_1,prob_target_1,prob_term_1_target_1,):

    

    :            

        

        

    if prob_term_1 < 0.00001 or prob_target_1< 0.00001 or prob_term_1 > 0.1 :

         

    

   

 

 

3.2 计算单词和tag的相关性得分

 

(1)互信息相关得分

 

Mutual_Score(term,.tag)  =  P(tag| term) -P(tag)

 

(2) z-score相关得分:

Z_Score(term, tag) = 

 

 

 

(3) Ensemble 相关得分

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVyb19mYW50YW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

先对Mutual_Score 和Z_Score进行归一化:

Ensemble过程中mutual score 的权重分配是0.7 和 z-score的权重是0.3。

 

(4)词的权重

依据训练样本。计算词的权重。不同单词,它关联的tags是否是终于预測的tag的重要程度不一样。

 

方法有两种: 

方法1:tf-idf值作为单词的重要性值。

方法2: entropy值作为词重要性

依据上面得到词频和词-tag频值,能够计算Wj值

同一时候归一化中分母换成norm-2 :

 

 

终于採用了entropy值作为词的权重。

 

 

4: 预測模型

4.1 预測样本文本信息

预測文本信息主要是通过get_ensemble_title_and_body(title, body)函数得到的。综合利用title和body文本信息。

 

def extract_body(body):

    body_term = body.split()

    body_li = []

    body_li.extend(body_term[:])

    body_li.extend(body_term[-:-])

    

    text = ' '.join(body_li)   

    

    return text

 

def get_ensemble_title_and_body(title, body):

    

    title_w = 

    doc = (title + ' ') * title_w + body

return doc

 

 

4.2 预測

(1)通过4.1获得每一个post的文本信息,根本文本中单词的权重和单词-tag关联性预測tags:

 

 

(2)获取得分最高的前5个tags。

pred_tags = [[tag ,w] for tag, w in pred_tags_dict.iteritems()]        

pred_tags = heapq.nlargest(, pred_tags, key=])

 

(3)预測终于tag数目

 依据pred_tags的tag得分。把低得分的tag去掉。

Threshold设定为0.7

 

def get_estimate_tags_num_by_association_prob(pred_tags):

    

    threshold = 0.7

    

    i = 

    sum_w = 

    total = np.sum([item[] for item in pred_tags])

    for item in pred_tags:

        sum_w += item[]

        i +=

        if sum_w > threshold * total:

            break

    

    return i

这一步提升非常明显,提升0.03左右。

 

(4)cv结果

cv 10w结果大约在0.508。

precision:  0.505054166667

recall:  0.511442333333

F1-Score:  0.508228176801

 

 

(5)最后提交

这次比赛的的測试集中大约有119w的測试样本在训练集合中出现。约占整体样本的60%。

所以,第一步从測试集中把这119w样本找出来,用训练集中相应的tag预測。剩下40%的样本用上面的说的关联预測算法来做。

找相同文档的算法:

给每一个训练集单词建立倒排索引(这次把训练样本中去除停用词和词干处理。且是binary索引,不考虑tf-idf)。

 

Kaggle 上leaderboard上。我是最后2周才增加的(2013/12/08提交第一次结果。2013/12/20 比赛结束)。提交了7个结果,结果为0.72,(最高是0.81)

排名是 93, 总的队伍数目是367. 大约25% 左右。这里说明下,0.72相应的的cv结果仅仅有0.39左右。

 

 

所以,我在比赛结束后的优化结果是cv是0.50,相信leaderboard上的结果会有相对较高的提升,兴许加上结果, 结果是

 

 

 

 

 

五:总结

这次kaggle比赛。对text挖掘有了比較不错的提高,在实验中,试验了非常多方案。比方KNN,topic model。

 KNN的速度太慢,即使在建立tf-idf倒排索引的情况下。依旧满足不了需求,同一时候在这次比赛中knn精度也没什么好的表现,值得提到的是,对于类似文本的寻找算法,能够借鉴Wand算法来提升速度,这也是这个数据集兴许能够再做的地方,text去重性能计算。Topic model是一个组粒度的预測方法。对于本次样本中基本上都是program 文本,所以这种粗粒度的预測方法效果非常差。

能够总结一句话:通过实验,我们才干知道什么方法才是可行的。什么是不可行的。

 

 

 

六 : 參考文献:

[1]  http://www.kaggle.com/c/facebook-recruiting-iii-keyword-extraction

[2]  Stanley C, Byrne M D. Predicting Tags for StackOverflow Posts[J].

[3]  司宪策. 基于内容的社会标签推荐与分析研究 [D][D]. 北京: 清华大学计算机科学与技术系, 2010.

[4]  Eisterlehner F, Hotho A, Jäschke R. ECML PKDD Discovery Challenge 2009 (DC09)[J]. CEUR-WS. org, 2009, 497.

FaceBook: Text Tag Recommendation的更多相关文章

  1. Easy Tag Write(1)

    package skyseraph.easytagwrite; import skyseraph.android.util.CustomDialog; import skyseraph.android ...

  2. ActionSupport.getText()方法 以及 js中:<s:text name="" />

    下面略述com.opensymphony.xwork2.ActionSupport.getText()方法 public String getText(String aTextName) 说明:Get ...

  3. 笔记:Sublime Text 3

    http://www.sublimetext.com/3 Sublime Text官网 http://www.sublimetextcn.com/3/ Sublime Text中文官网 http:// ...

  4. ZedGraph的曲线的LineItem对象的Tag属性存储信息进而在鼠标悬浮时进行显示

    场景 Winform中设置ZedGraph鼠标悬浮显示距离最近曲线上的点的坐标值和X轴与Y轴的标题: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...

  5. struts2 自定义tag标签

    在项目中可能有很多相同的jsp页面表示功能,这时可以使用自定义的tag进行定义,渐少重复的工作量便于日后维护! 下面就基于struts2进行自定义标签的定义与实现: 首先:自定义类MyTag继承str ...

  6. awesome-RecSys

    https://github.com/jihoo-kim/awesome-RecSys?fbclid=IwAR1m6OebmqO9mfLV1ta4OTihQc9Phw8WNS4zdr5IeT1X1OL ...

  7. web2.0最全的国外API应用集合

    web2.0最全的国外API应用集合 原文地址:http://www.buguat.com/post/98.html 2.0时代,越来越多的API被大家广泛应用,如果你还不了解API是何物,请看这里的 ...

  8. DLRS(近三年深度学习应用于推荐系统论文汇总)

    Recommender Systems with Deep Learning Improving Scalability of Personalized Recommendation Systems ...

  9. 关于LDA的文章

    转:http://www.zhizhihu.com/html/y2011/3228.html l  Theory n  Introduction u  Unsupervised learning by ...

随机推荐

  1. android--------微信 Tinker 热修复 (一)

    什么是热修复 热修复补丁(hotfix),又称为patch,指能够修复软件漏洞的一些代码,是一种快速.低成本修复产品软件版本缺陷的方式. 热修复有多种,如:Tinker ,QZone,Andfix, ...

  2. Android设计模式之工厂模式

    定义 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相当于创建实例 ...

  3. 『OpenCV3』简单图片处理

    cv2和numpy深度契合,其图片读入后就是numpy.array,只不过dtype比较不常用而已,支持全部数组方法 数组既图片 import numpy as np import cv2 img = ...

  4. 最全面的mac下的android studio快捷键

    Action Mac OSX Win/Linux 注释代码(//) Cmd + / Ctrl + / 注释代码(/**/) Cmd + Option + / Ctrl + Alt + / 格式化代码 ...

  5. Xshell如何设置,当连接断开时保留Session,保留原文字

    Xshell [1]  是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议.Xshell 通过互联网到远程主机的安全连接以及它 ...

  6. memory prefix vice ,with out 1

    1● vice 副的   2● with 向后,相反  

  7. vs2012 怎样解决 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包的问题

    今天用vs2012打开项目总是报这个错误,在网上找到解决方法 1.问题描述: 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPac ...

  8. substr和substring,slice和splice的区别,js字符串截取和数组截取

    本文参考了文章:https://blog.csdn.net/kenberkeley/article/details/50983734 博主已经总结得很好了,看完之后也能明白,不过还是觉得要自己动手敲一 ...

  9. jenkins+git+docker实验环境的搭建

    持续集成(c/i)的实验环境 git/harbor服务器    ip 192.168.200.132 docker服务器          ip 192.168.200.149 Jenkins服务器 ...

  10. 《Python》 面向对象初识(组合)

    一.面向对象(组合): 定义:给一个类的对象封装一个属性,这个属性是另一个类的对象. 意义:让类的对象与另一个类的对象产生关系,类与类之间产生关系. 人物使用武器攻击另一个人物: class Game ...