FaceBook: Text Tag Recommendation

Text Tag Recommendation 

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

一: 背景

Kaggle上 facebook招聘比赛III。任务要求是给定文本中抽取关键词,这里称作tag吧。

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

示例如下:



 

测试集是也是同样的文本信息,但是没有tags,这次比赛的任务就是让参赛者从文本中预测出文本的tags,比如上面的javaunit-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 分开成optlib, 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-grams1-grams,相对只用1-gramsF1在测试集上表现能提高0.02的精度。

 

去除掉一些低频词,低频tag,高频词。低频的,我们认为不可靠。

 

def is_pass_record(prob_term_1,prob_target_1,prob_term_1_target_1,):

    

    if  prob_term_1_target_1 <1e-5:            

        return 1

        

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

        return 1 

    

return 0   

 

 

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

 

(1)互信息相关得分

 

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

 

(2) z-score相关得分:

Z_Score(term, tag) = 

 

 

 

(3) Ensemble 相关得分


先对Mutual_Score Z_Score进行归一化:

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

 

4)词的权重

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

 

方法有两种: 

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

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

根据上面得到词频和词-tag频值,可以计算Wj

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


 

 

最终采用了entropy值作为词的权重。

 

 

4: 预测模型

4.1 预测样本文本信息

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

 

def extract_body(body):

    body_term = body.split()

    body_li = []

    body_li.extend(body_term[:20])

    body_li.extend(body_term[-20:-1])

    

    text = ' '.join(body_li)   

    

    return text

 

def get_ensemble_title_and_body(title, body):

    

    title_w = 5

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

return doc

 

 

4.2 预测

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


 

 

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

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

pred_tags = heapq.nlargest(5, pred_tags, key=lambda x: x[1])

 

(3)预测最终tag数目

 根据pred_tagstag得分,把低得分的tag去掉。

Threshold设定为0.7

 

def get_estimate_tags_num_by_association_prob(pred_tags):

    

    threshold = 0.7

    

    i = 0

    sum_w = 0

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

    for item in pred_tags:

        sum_w += item[1]

        i +=1

        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左右。


 

 

所以,我在比赛结束后的优化结果是cv0.50,相信leaderboard上的结果会有相对较高的提升,后续加上结果, 结果是

 

 

 

 

 

五:总结

这次kaggle比赛,对text挖掘有了比较不错的提高,在实验中,试验了很多方案,比如KNNtopic 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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
协同捆绑推荐是一种通过深度学习算法将用户与物品集进行匹配的方法。这种方法可以为用户提供个性化的捆绑推荐,准确地满足用户的需求与兴趣。 在这种方法中,使用者的行为数据被采集并存储,例如购买记录、浏览历史、评分等。利用这些数据,可以建立一个用户-物品矩阵,其中行表示用户,列表示物品,矩阵元素则表示用户对物品的行为。通过分析用户-物品矩阵的模式与关联,可以预测用户对未来物品的偏好。 深度学习模型通常由多个层次的神经网络组成,通过学习和分类大量数据样本,能够提取出潜在的用户和物品特征。这些特征可以捕捉到更多的信息,用于计算用户与物品之间的相似度或相关度。通过比较用户特征与物品特征的差异,可以得出最合适的捆绑推荐。 协同捆绑推荐算法具有以下优点: 1. 个性化推荐:该算法可以根据用户的兴趣和偏好,为每个用户提供个性化的捆绑推荐,增加用户的满意度和体验。 2. 精准的匹配:通过深度学习算法,可以准确地计算用户与每个物品之间的匹配度,从而找到最佳的匹配项。 3. 时间效率:深度学习算法能够快速处理大规模的用户-物品矩阵,实现实时的捆绑推荐。 然而,协同捆绑推荐算法也存在一些挑战: 1. 数据稀疏性:用户对物品的行为数据通常是稀疏的,某些物品可能没有足够的数据支持,导致推荐的准确性有所降低。 2. 冷启动问题:当新用户或新物品加入系统时,缺乏充分的数据进行推荐,需要设计特殊的策略来解决这个问题。 3. 模型可解释性:深度学习算法在推荐过程中产生的结果往往难以解释,这可能对用户产生疑虑,影响用户的信任度。 综上所述,协同捆绑推荐算法通过深度学习模型实现用户与物品集之间的匹配,能够提供个性化且精准的捆绑推荐。然而,需要克服数据稀疏性、冷启动问题和模型可解释性等挑战,以进一步提高算法的效果和用户的满意度。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值