天天看点

微博用户标签自动生成算法

1. 问题描述

现有每个用户发送、评论、转发的微博内容, 要求从这些微博中为每个用户抽取适合的标签。 例如我的微博中经常提到“SVM”,“文本分类”,“协同过滤”等, 则给我打上标签“数据挖掘”。 要求算法尽量自动化, 不需要或需要很少人工干预。

2. 解决方案

有三种计算方法可尝试, 个人由于工作原因暂时不能一一实现,有兴趣的读者可进行实现比较

2.1 借助百度百科的开放分类

百度百科有个比较好的特性是在词条释义下面会列出该词条隶属的开放分类, 如词条“SVM”隶属的开放分类有数据挖掘, 机器学习等。

微博用户标签自动生成算法

可以利用这个特性, 为用户相关微博中含有的词,抓取开放分类当做用户的标签。 具体流程:

微博用户标签自动生成算法

1)维护一个词条->相关百度百科开放分类列表的缓存池

2)将用户相关微博分词,统计词频,过滤停用词,取较高频的有效词

3)取分词后的每个有效词条

4)若该词条在百度百科开放分类缓存池中,从缓存中取得该词条相关分类

5)若该词条不在百度百科开放分类缓存池中,以该词条为检索词抓取百度百科,得到相关开放分类列表返回,同时将结果放进缓存

6)重复3-5直到为用户的相关词条都生成开放分类列表

7)合并分类列表,取开放分类中较高频的K个分类作为该用户标签

2.2 利用概念层次结构图计算

假设把人的知识结构分成概念层次,越高的层次上概念越宽泛,如“计算机”,“汽车”,“电视剧”等, 越低的层次概念越细化,如“贝叶斯信任网络”,“奔驰600商务型”,“潜伏”等。  本算法的核心在于抽取出概念层次“不高不低”的词作为标签, 也就是说抽取的词概念既不要太宽泛,也不要太细化, 例如上述例子中,“计算机”,“汽车”,“电视剧”等词过于宽泛; 而“贝叶斯信任网络”,“奔驰600商务型”,“潜伏”又过于细化, 理想情况下, 抽取出“数据挖掘”,“奔驰”,“谍战剧”是最合适的。那么如何做到这一点呢?

可以利用词和词之间的相关性, 构建由词到词的关联图, 图中每个节点代表一个词, 每条边代表由词A到词B的一个关联,说明词A和词B在概念上有一定相关性。 具体构建方法可应用类似于apriori的关联规则挖掘算法, 利用不同词在同一用户微博中的共现频率,结合置信度、支持度、提升度等限制条件计算出这样的图。

当上述关联图计算完成后, 会有如下规律: 对于概念层次较高的词, 该词在图中节点的出度会很大(即该词会和很多词相关联),如“电视剧”可能关联到众多电视剧名, 电视剧类型; 对于概念层次较低的词,该词在图中节点的出度会很小(即该词会和很少词相关联),如“潜伏”可能只关联到几个相似的电视剧名和“谍战片”等少数电视剧类型。

于是可以按照所有词节点的出度进行排序统计, 结合人工review, 选出出度不高不低的词节点,作为合法标签存储。

有了合法标签, 根据用户相关微博计算他的标签就容易了, 第一步分词统计词频, 第二步遍历用户微博中的原始词,如果是合法标签,则为用户打上标签。 如果遍历过后发现为这个用户打的标签太少, 则搜索词条相关图中和用户相关原始词相关,并且是合法标签的词作为标签。

2.3 利用协同过滤思想进行计算

如果系统中已有较多用户打上了一些标签, 则可以根据他们的标签相似性、相关微博相似性进行协同过滤计算标签,具体流程如下:

根据用户已有标签和相关微博生成代表这个用户的关键词向量

计算和该用户有相似向量的有标签用户

统计该用户的相似用户都打了什么标签,按照频率高低排序,选择K个高频标签

refer to: http://www.itongji.cn/article/04031ZR013.html