数据挖掘新手,有以下需求:
几十万个微博用户,几百万条微博
需要给定一个用户,然后推荐相似的用户。
什么是相似?
有共同爱好
不知道如果给你这样一个需求,会怎么做?
我现在的做法特别 Low:
使用 http://bosonnlp.com/ 分词和词云来提取一个人所有微博的关键字,然后选取低频的词汇,然后通过这些词汇去找人。
但出现一些情况:
哎,大家有什么好的思路吗?数据挖掘新手,希望大家赐教。
1
murmur 2016-07-04 15:18:33 +08:00
思路就错了 兴趣相似的用户基本就粉了或者互粉了么 肯定先从互粉的人抓起
而且以微博那个超口语化的行文分词也分不出什么来 |
3
mayokaze 2016-07-04 15:35:27 +08:00 1
从纯文本分析的话可以考虑 LDA 做主题模型,分词不准的话用 ngram 来做
|
4
XianZaiZhuCe 2016-07-04 15:38:14 +08:00 via iPhone
关键字越多相似,用户相似度越高?
|
5
mayokaze 2016-07-04 15:39:39 +08:00 1
更简单点的方法是基于词做 embedding 然后对每个短文本做 bow 的 sparse encoding, 然后对每一条短文本再做一次 sparse encoding 最后用 distance 求相似度,如果维度太高用 pca 或者 sparse coder / auto encoder 降个维
|
6
lijinma OP |
8
manhere 2016-07-04 15:47:15 +08:00
1 楼正解,不要分析内容,找共同关注。
|
9
mayokaze 2016-07-04 15:48:00 +08:00 1
@lijinma 不是大神_(:з」∠)_ ,工作是做 nlp 对这方面有点了解,你在 6 楼提到的问题可以用 knn 来算,维度在 100 以下还可以用 kd-tree 来加快检索
|
11
mayokaze 2016-07-04 15:52:02 +08:00 1
最简单的思路是做一个超级大的向量,对于词表里面的词如果这个用户提过就记 1 否则记 0 ,分布到向量空间里面通过求欧氏距离来做聚类,数据用 kd-tree 来存这样每次查找都是 log 时间了。但是你这样做维度肯定非常大,可以用 kmeans 直接聚中心点,我做过的 case 聚到 300 维效果还是非常好的
|
13
mayokaze 2016-07-04 16:00:09 +08:00 1
@lijinma 我们公司语料比较特殊,为了处理多语言分词是自己定制的。一般对于分词不准的情况可以使用 2gram ,就是比如“我爱北京天安门”分成 我爱 爱北 北京 京天 天安 安门
|
16
YORYOR 2016-07-04 16:21:38 +08:00 1
通过微博分词 挖掘用户兴趣,给用户打标签,分类,新浪微博就是这么做的
|
17
lijinma OP @YORYOR 恩,请教你个问题:
你们的标签和分类是提前定义好的吗? 还是根据用户的微博动态生成的? ———————————————— 恩,我的问题其实是: 1. 给微博分词了,但是如何分词更合理? 2. 分词后,哪些词应该打在用户的身上,不应该把用户所有词都打上去吧?另外如何确定分类? 谢谢你 |
18
murmur 2016-07-04 16:58:21 +08:00
是这样的,如果你的数据是最近抓取的,而且没有经过筛选,那么可能很多都是营销号、抽奖号、僵尸号
这样的数据是没有处理意义的 几十万个微博用户真不多 随便一个抽奖就几万个小号转发 |
20
menc 2016-07-04 17:47:59 +08:00 1
@mayokaze 短文本用 LDA 并不好用,尤其对于微博这种口语化的新词众多的文本来说。
劝楼主, recommending system 就按照 recommending system 的套路来搞,好好学习机器学习,@mayokaze 提的至少是一个上道的建议,帖子里面其他人的土方法大多数不值得一试。 几个点: 1. 构建用户向量,所有的用户都抽象成向量 2. 协同过滤是推荐系统的常用方法 3. 想办法使用合适的主题模型, LDA 对于短文本显然还是不太够用,如果有主题了可以拿来做用户聚类 4. 尝试各种算法来衡量向量的相似度,包括 pmi ,包括 pearson 系数,包括各种距离公式, cosine distance 或者 hamming distance 等等 5. 现有分词足够使用了, n gram 对算力的要求成倍增加,显然不是个好方案。 |
21
menc 2016-07-04 17:51:47 +08:00 1
就你在帖子中说的词频高低,频率不能离开逆文档频率,搜索 tf idf 查看文本赋权,然而用现成的 word embedding 结果应该会更好。
word embedding 的结果可以找现成的 model 。 |
23
mayokaze 2016-07-04 18:15:19 +08:00 1
@menc 嗯 LDA 确实不太适合短文本,实际上我们自己的短文本聚类都是用 w2v+sparse encoding 做的
|
24
airqj 2016-07-04 18:19:05 +08:00 via Android 1
现在都是用协同过滤吧
|
25
9hills 2016-07-04 20:07:16 +08:00
根据用户发布的微博去做用户推荐本身就是有问题的,因为很多人。。。基本不发微博,只看不发
根据关注关系是正道 |
26
qdk0901 2016-07-05 07:34:28 +08:00 1
把用户以及用户发出的信息、用户关注的人、关注用户的人,这些信息组装成一条 sentence
每个用户一条 sentence 然后扫描所有用户,得到的所有的 sentence 作为 corpus 一起扔给 word2vec 处理,得到一堆向量词 求用户的相似度,就通过计算用户对应的向量词之间的夹角(也就是归一化的欧几里德距离)得到 求与用户最相近的一组用户,也就是求离用户对应的向量词最近的一组向量词所对应的用户 我之前爬了一下 github ,收集了一部分数据,按照这个方法,得到一堆向量词后,用 tnse 进行可视化 秀一下效果,加载会有点慢,这里只挂 5000 个点的 tsne 数据 http://transing.xyz/codeatlas.html |
27
lijinma OP |