V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lijinma
V2EX  ›  程序员

数据挖掘大家有思路吗:几十万个微博用户,几百万条微博,然后推荐相似用户?

  •  
  •   lijinma · 2016-07-04 15:13:44 +08:00 · 5002 次点击
    这是一个创建于 3064 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据挖掘新手,有以下需求:

    几十万个微博用户,几百万条微博
    需要给定一个用户,然后推荐相似的用户。
    

    什么是相似?

    有共同爱好
    

    不知道如果给你这样一个需求,会怎么做?

    我现在的做法特别 Low:

    使用 http://bosonnlp.com/ 分词和词云来提取一个人所有微博的关键字,然后选取低频的词汇,然后通过这些词汇去找人。

    但出现一些情况:

    1. 低频词很难找到匹配的人(但是如果可以找到的话,效果很好)
    2. 高频词匹配并不准确。

    哎,大家有什么好的思路吗?数据挖掘新手,希望大家赐教。

    29 条回复    2016-07-05 21:43:19 +08:00
    murmur
        1
    murmur  
       2016-07-04 15:18:33 +08:00
    思路就错了 兴趣相似的用户基本就粉了或者互粉了么 肯定先从互粉的人抓起
    而且以微博那个超口语化的行文分词也分不出什么来
    lijinma
        2
    lijinma  
    OP
       2016-07-04 15:24:17 +08:00
    @murmur 哈哈,谢谢你给了我另外一个思路。

    但是我的做法有没有价值?
    mayokaze
        3
    mayokaze  
       2016-07-04 15:35:27 +08:00   ❤️ 1
    从纯文本分析的话可以考虑 LDA 做主题模型,分词不准的话用 ngram 来做
    XianZaiZhuCe
        4
    XianZaiZhuCe  
       2016-07-04 15:38:14 +08:00 via iPhone
    关键字越多相似,用户相似度越高?
    mayokaze
        5
    mayokaze  
       2016-07-04 15:39:39 +08:00   ❤️ 1
    更简单点的方法是基于词做 embedding 然后对每个短文本做 bow 的 sparse encoding, 然后对每一条短文本再做一次 sparse encoding 最后用 distance 求相似度,如果维度太高用 pca 或者 sparse coder / auto encoder 降个维
    lijinma
        6
    lijinma  
    OP
       2016-07-04 15:45:03 +08:00
    @XianZaiZhuCe 对,你的思路是对的,问题是,如果我现在给定你用户 A ,难道你要把几十万用户都跑一遍,按照相似性来排序吗。。

    你还有别的思路吗?
    lijinma
        7
    lijinma  
    OP
       2016-07-04 15:45:55 +08:00
    @mayokaze 一看你就是大神,我没太看懂你的想法,但是我会好好查一下你提到的模型和方法
    manhere
        8
    manhere  
       2016-07-04 15:47:15 +08:00
    1 楼正解,不要分析内容,找共同关注。
    mayokaze
        9
    mayokaze  
       2016-07-04 15:48:00 +08:00   ❤️ 1
    @lijinma 不是大神_(:з」∠)_ ,工作是做 nlp 对这方面有点了解,你在 6 楼提到的问题可以用 knn 来算,维度在 100 以下还可以用 kd-tree 来加快检索
    lijinma
        10
    lijinma  
    OP
       2016-07-04 15:50:58 +08:00
    @mayokaze 哈哈,多谢你提供想法,我先消化下你提到的内容。。
    mayokaze
        11
    mayokaze  
       2016-07-04 15:52:02 +08:00   ❤️ 1
    最简单的思路是做一个超级大的向量,对于词表里面的词如果这个用户提过就记 1 否则记 0 ,分布到向量空间里面通过求欧氏距离来做聚类,数据用 kd-tree 来存这样每次查找都是 log 时间了。但是你这样做维度肯定非常大,可以用 kmeans 直接聚中心点,我做过的 case 聚到 300 维效果还是非常好的
    lijinma
        12
    lijinma  
    OP
       2016-07-04 15:55:58 +08:00
    @mayokaze 恩恩,我想请教下,你是怎么分词的?
    mayokaze
        13
    mayokaze  
       2016-07-04 16:00:09 +08:00   ❤️ 1
    @lijinma 我们公司语料比较特殊,为了处理多语言分词是自己定制的。一般对于分词不准的情况可以使用 2gram ,就是比如“我爱北京天安门”分成 我爱 爱北 北京 京天 天安 安门
    lijinma
        14
    lijinma  
    OP
       2016-07-04 16:16:07 +08:00
    @manhere 恩恩,我会尝试从这个维度来推荐的。
    lijinma
        15
    lijinma  
    OP
       2016-07-04 16:17:46 +08:00
    @mayokaze 恩,但是用 ngram 分词后,词确实有点多,我暂时使用 Boson 的分词来弄,继续谢谢你。
    YORYOR
        16
    YORYOR  
       2016-07-04 16:21:38 +08:00   ❤️ 1
    通过微博分词 挖掘用户兴趣,给用户打标签,分类,新浪微博就是这么做的
    lijinma
        17
    lijinma  
    OP
       2016-07-04 16:27:48 +08:00
    @YORYOR 恩,请教你个问题:

    你们的标签和分类是提前定义好的吗?

    还是根据用户的微博动态生成的?

    ————————————————

    恩,我的问题其实是:

    1. 给微博分词了,但是如何分词更合理?
    2. 分词后,哪些词应该打在用户的身上,不应该把用户所有词都打上去吧?另外如何确定分类?

    谢谢你
    murmur
        18
    murmur  
       2016-07-04 16:58:21 +08:00
    是这样的,如果你的数据是最近抓取的,而且没有经过筛选,那么可能很多都是营销号、抽奖号、僵尸号
    这样的数据是没有处理意义的
    几十万个微博用户真不多 随便一个抽奖就几万个小号转发
    lijinma
        19
    lijinma  
    OP
       2016-07-04 17:45:40 +08:00
    @murmur 恩恩,用户数据是可靠的数据,没有营销号、抽奖号、僵尸号
    menc
        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 对算力的要求成倍增加,显然不是个好方案。
    menc
        21
    menc  
       2016-07-04 17:51:47 +08:00   ❤️ 1
    就你在帖子中说的词频高低,频率不能离开逆文档频率,搜索 tf idf 查看文本赋权,然而用现成的 word embedding 结果应该会更好。
    word embedding 的结果可以找现成的 model 。
    lijinma
        22
    lijinma  
    OP
       2016-07-04 18:01:45 +08:00
    @menc 太感谢你了,确实是新手,希望不要跑偏了。

    我会按照你的建议来尝试,多谢。
    mayokaze
        23
    mayokaze  
       2016-07-04 18:15:19 +08:00   ❤️ 1
    @menc 嗯 LDA 确实不太适合短文本,实际上我们自己的短文本聚类都是用 w2v+sparse encoding 做的
    airqj
        24
    airqj  
       2016-07-04 18:19:05 +08:00 via Android   ❤️ 1
    现在都是用协同过滤吧
    9hills
        25
    9hills  
       2016-07-04 20:07:16 +08:00
    根据用户发布的微博去做用户推荐本身就是有问题的,因为很多人。。。基本不发微博,只看不发

    根据关注关系是正道
    qdk0901
        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
    lijinma
        27
    lijinma  
    OP
       2016-07-05 09:55:15 +08:00
    @airqj 对,应该很多都是用 协同过滤


    @9hills 关注关系我会考虑,多谢,嘿嘿。


    @qdk0901 谢谢你,你这个正好是我关注关系上的一个解决方案。
    lijinma
        28
    lijinma  
    OP
       2016-07-05 09:56:43 +08:00
    @qdk0901 能解释下 tsne 的数据情况吗。。

    多谢。
    qdk0901
        29
    qdk0901  
       2016-07-05 21:43:19 +08:00   ❤️ 1
    @lijinma tsne 的数据情况大概指哪方面。

    corpus 大概是 1.2 亿词量,因为 github 上活跃用户和仓库的比例不高,所以我过滤剩下 140 万向量词
    tsne 的计算比生成词向量花的时间多很多,所以实际只取 50 万做可视化,在我笔记本(i7 3610qm)上大概要算 6 个小时(显卡内存太小,用 cuda 加速做 tsne 运算老是爆内存,所以只能用 cpu 算),如果换成 gtx1080 ,大概会快 100 倍吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2776 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 13:07 · PVG 21:07 · LAX 05:07 · JFK 08:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.