精华内容
下载资源
问答
  • 常用的wiki系统

    2011-05-31 10:38:27
    mediawiki系统 ,XWiki http://www.oschina.net/project/tag/69/wiki ...社会网络分析:探索人人网好友推荐系统 http://cos.name/2011/04/exploring-renren-social-network/?replytocom=2027...
    mediawiki系统 ,XWiki  

    http://www.oschina.net/project/tag/69/wiki


    社会网络分析:探索人人网好友推荐系统
    http://cos.name/2011/04/exploring-renren-social-network/?replytocom=2027
    展开全文
  • 企业知识整理(项目管理)的常见方式为搭建内部的wiki系统,Wiki 是一个协同著作平台或称开放编辑系统。我们可以用Wiki来建设帮助系统,知识库系统。国内公共wiki最著名的就是百度百科。 企业团队搭建wiki的作用 ...

    之前小编就撰写过一篇文章“打造自己的知识中台,凡事别再问百度!附带工具推荐 ”,想要传达的观念是只有将零散的知识进行系统话的整理后,便于查阅便于利用才能真正的发挥知识的作用。个人都理应如此,那作为企业团队是不是更应意识到知识系统化整理的作用呢?

    什么是wiki

    企业知识整理(项目管理)的常见方式为搭建内部的wiki系统,Wiki 是一个协同著作平台或称开放编辑系统。我们可以用Wiki来建设帮助系统,知识库系统。国内公共wiki最著名的就是百度百科。

    企业团队搭建wiki的作用

    能够将公司的所有知识集中在一个位置,成为公司内部的百度

    • 通过在 wiki 中整理知识,可以让公司的知识体系化,规范化。
    • 通过 wiki 可发现知识缺口,和公司流程的薄弱环节。
    • 即使员工离开公司,有价值的信息也会留存在 wiki 中。
    • 公司流程和基础资料可以放在公共可读 wiki 中,入职培训十分简单。
    • wiki 可以实现文件协同,降低沟通成本,不再需要文件传来传去。

    如何在公司内部推广wiki系统?

    wiki对于企业和团队来说十分重要,如果你的企业还没有建设是否想想应该如何推广呢?小编收集了在企业团队内推广wiki思路的好方法,希望你的团队也能早点用上wiki系统,让知识流通更加顺畅。文章末尾附带搭建wiki的好用工具推荐,记得收藏哦!

    1、以身作则,先将wiki系统运用起来

    比如说把你手里的所有文档传到 wiki 上面,当同事让你给他发文件的时候,直接把 wiki 库地址甩给他,或是让他去 wiki 里面搜索。一次、两次可能大家还会私敲你要文件,但是久而久之大家会发现你的用法很方便。

    2. 从功能层面,教团队善用搜索框和版本控制功能

    对于员工来说,企业 wiki 比 SVN 库好用的一点就在于,很容易就能找到自己需要的、最新版本的文件。不需要在文件库里翻来翻去,不需要在微信群里传来传去,把 wiki 当作自己公司内部的百度来用,是能够帮到大家工作的。

    3. 选择一款交互友好的 wiki

    ToB 类产品在交互和设计上往往弱于to C产品,无论是 Mediawiki 还是 dokuwiki,都像是上个年代的产物,对于习惯使用 toC 产品的年轻人来说相当不友好。现在企业级软件也在逐步简化操作界面,提高体验。国内的Baklib则是一款交互性十分友好的工具。

    4. 选择一款入手简单的wiki

    wiki是企业/团队对内部知识非常好用一种管理手段,之所以没有被大面积的推广开来,其实和学习成本过高有着很大的关系,选择一款简单易上手的wiki工具,才能使得wiki在企业内部的推广更轻松。

    5.选择一款带有权限控制的wiki

    企业 wiki 和个人笔记毕竟不同,如果所有人都有全部读写权限,很容易造成信息丢失、被竞争对手窃取全部知识等等恶劣的后果。所以基本的分部门权限、读写分离权限、管理员权限是必备的。

    选对了wiki搭建的工具就已经成功一大半了,小编推荐一款好用的wiki工具搭建神器,Baklib!

    Baklib在线文档/wiki工具介绍

    Baklib是一款在线的帮助文档/wiki制作工具,对于企业/团队来说做在线的产品说明书、FAQ、帮助中心、知识库,员工培训手册来说都非常不错,可做到随时编辑随时更新发布。对内可以做到知识协同与内部培训,对外用户可以在售前售后都能更快捷、方便地了解产品。

    如何在企业间有效推广wiki系统,提高团队效率少加班

     

    产品在wiki建设上的优势

    • 零上手难度:这款工具与传统的wiki来说无需任何语言基础、不需要搭建数据库,所有的框架都是搭建好的,只需要往里面添加内容即可。
    • 编辑流畅:Baklib采用块状的编辑器不再依赖传统的顶部工具栏。所有的内容包括文本、图片、视频、表格、Markdown等皆为模块,可以自由拖拽重组。使得用户的编辑体验更专注。
    • 界面交互友好:作为在线帮助文档/wiki效果展示的好坏,将极大的影响读者的阅读效果,这款工具有15+可自定义页眉页脚的简约结构化主题,在设计上有点篇日式的清爽风格,视觉上会做到很好的辅助效果。
    • 编辑权限的管控:Baklib在线帮助文档/wiki工具,将读写权利进行划分,同时也对整个wiki站点进行访问权限的管控,控制阅读人员画像。
    • 丰富的插件:这款工具提供了很多实用的插件包括独立域名、全局搜索、用户反馈功能、文章导读、站点的访问统计、站点导航...

    企业/团队wiki案例展示

    下图为Baklib建设wiki站点的真实案例。

    如何在企业间有效推广wiki系统,提高团队效率少加班

     

    产品使用地址:https://www.baklib.com/?utm_content=6&utm_source=CSDN

    总结

    以上就是我分享的关于如何帮助企业/团队快速搭建wiki的方法,wiki的建设将极大的提高员工的工作效率,希望每个企业/团队都能建设起来。

    展开全文
  • 推荐系统

    2017-07-15 11:40:00
    最近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature、LibMF、LibFM等,也有重量级的适用于工业系统的Mahout、Oryx、EasyRecd等,供大家参考。PS:这里的top ...

    最近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature、LibMF、LibFM等,也有重量级的适用于工业系统的Mahout、Oryx、EasyRecd等,供大家参考。PS:这里的top 10仅代表个人观点。

    #1.SVDFeature

    主页:http://svdfeature.apexlab.org/wiki/Main_Page 语言:C++
    一个feature-based协同过滤和排序工具,由上海交大Apex实验室开发,代码质量较高。在KDD Cup 2012中获得第一名,KDD Cup 2011中获得第三名,相关论文发表在2012的JMLR中,这足以说明它的高大上。
    SVDFeature包含一个很灵活的Matrix Factorization推荐框架,能方便的实现SVD、SVD++等方法, 是单模型推荐算法中精度最高的一种。SVDFeature代码精炼,可以用相对较少的内存实现较大规模的单机版矩阵分解运算。另外含有Logistic regression的model,可以很方便的用来进行ensemble。

    #2.LibMF

    主页:http://www.csie.ntu.edu.tw/~cjlin/libmf/ 语言:C++
    作者Chih-Jen Lin来自大名鼎鼎的台湾国立大学,他们在机器学习领域享有盛名,近年连续多届KDD Cup竞赛上均获得优异成绩,并曾连续多年获得冠军。台湾大学的风格非常务实,业界常用的LibSVM, Liblinear等都是他们开发的,开源代码的效率和质量都非常高。
    LibMF在矩阵分解的并行化方面作出了很好的贡献,针对SGD(随即梯度下降)优化方法在并行计算中存在的locking problem和memory discontinuity问题,提出了一种矩阵分解的高效算法FPSGD(Fast Parallel SGD),根据计算节点的个数来划分评分矩阵block,并分配计算节点。系统介绍可以见这篇论文(ACM Recsys 2013的 Best paper Award)。

    #3.LibFM

    主页:http://www.libfm.org/ 语言:C++
    作者是德国Konstanz大学的Steffen Rendle,他用LibFM同时玩转KDD Cup 2012 Track1和Track2两个子竞赛单元,都取得了很好的成绩,说明LibFM是非常管用的利器。
    LibFM是专门用于矩阵分解的利器,尤其是其中实现了MCMC(Markov Chain Monte Carlo)优化算法,比常见的SGD优化方法精度要高,但运算速度要慢一些。当然LibFM中还实现了SGD、SGDA(Adaptive SGD)、ALS(Alternating Least Squares)等算法。

    #4.Lenskit

    主页:http://lenskit.grouplens.org/ 语言Java

    这个Java开发的开源推荐系统,来自美国的明尼苏达大学的GroupLens团队,也是推荐领域知名的测试数据集Movielens的作者。
    该源码托管在GitHub上,https://github.com/grouplens/lenskit。主要包含lenskit-api,lenskit-core,lenskit-knn,lenskit-svd,lenskit-slopone,lenskit-parent,lenskit-data-structures,lenskit-eval,lenskit-test等模块,主要实现了k-NN,SVD,Slope-One等典型的推荐系统算法。

    #5.GraphLab

    主页:GraphLab - Collaborative Filtering 语言:C++
    Graphlab是基于C++开发的一个高性能分布式graph处理挖掘系统,特点是对迭代的并行计算处理能力强(这方面是hadoop的弱项),由于功能独到,GraphLab在业界名声很响。用GraphLab来进行大数据量的random walk或graph-based的推荐算法非常有效。Graphlab虽然名气比较响亮(CMU开发),但是对一般数据量的应用来说可能还用不上。
    GraphLab主要实现了ALS,CCD++,SGD,Bias-SGD,SVD++,Weighted-ALS,Sparse-ALS,Non-negative Matrix Factorization,Restarted Lanczos Algorithm等算法。

    #6.Mahout

    主页:http://mahout.apache.org/ 语言:Java
    Mahout 是 Apache Software Foundation (ASF) 开发的一个全新的开源项目,其主要目标是创建一些可伸缩的机器学习算法,供开发人员在 Apache 在许可下免费使用。Mahout项目是由 Apache Lucene社区中对机器学习感兴趣的一些成员发起的,他们希望建立一个可靠、文档翔实、可伸缩的项目,在其中实现一些常见的用于聚类和分类的机器学习算法。该社区最初基于 Ngetal. 的文章 “Map-Reduce for Machine Learning on Multicore”,但此后在发展中又并入了更多广泛的机器学习方法,包括Collaborative Filtering(CF),Dimensionality Reduction,Topic Models等。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。
    在Mahout的Recommendation类算法中,主要有User-Based CF,Item-Based CF,ALS,ALS on Implicit Feedback,Weighted MF,SVD++,Parallel SGD等。

    #7.Myrrix

    主页:http://myrrix.com/ 语言:Java
    Myrrix最初是Mahout的作者之一Sean Owen基于Mahout开发的一个试验性质的推荐系统。目前Myrrix已经是一个完整的、实时的、可扩展的集群和推荐系统,主要架构分为两部分:服务层:在线服务,响应请求、数据读入、提供实时推荐;计算层:用于分布式离线计算,在后台使用分布式机器学习算法为服务层更新机器学习模型。Myrrix使用这两个层构建了一个完整的推荐系统,服务层是一个HTTP服务器,能够接收更新,并在毫秒级别内计算出更新结果。服务层可以单独使用,无需计算层,它会在本地运行机器学习算法。计算层也可以单独使用,其本质是一系列的Hadoop jobs。目前Myrrix以被 Cloudera 并入Oryx项目。

    #8.EasyRec

    主页:http://easyrec.org/ 语言:Java
    EasyRec是一个易集成、易扩展、功能强大且具有可视化管理的推荐系统,更像一个完整的推荐产品,包括了数据录入模块、管理模块、推荐挖掘、离线分析等。EasyRec可以同时给多个不同的网站提供推荐服务,通过tenant来区分不同的网站。架设EasyRec服务器,为网站申请tenant,通过tenant就可以很方便的集成到网站中。通过各种不同的数据收集(view,buy.rating)API收集到网站的用户行为,EasyRec通过离线分析,就可以产生推荐信息,您的网站就可以通过Recommendations和Community Rankings来进行推荐业务的实现。

    #9.Waffles

    主页:http://waffles.sourceforge.net/ 语言:C++
    Waffles英文原意是蜂蜜甜饼,在这里却指代一个非常强大的机器学习的开源工具包。Waffles里包含的算法特别多,涉及机器学习的方方面面,推荐系统位于其中的Waffles_recommend tool,大概只占整个Waffles的1/10的内容,其它还有分类、聚类、采样、降维、数据可视化、音频处理等许许多多工具包,估计能与之媲美的也就数Weka了。

    #10.RapidMiner

    主页:http://rapidminer.com/ 语言:Java
    RapidMiner(前身是Yale)是一个比较成熟的数据挖掘解决方案,包括常见的机器学习、NLP、推荐、预测等方法(推荐只占其中很小一部分),而且带有GUI的数据分析环境,数据ETL、预处理、可视化、评估、部署等整套系统都有。另外RapidMiner提供commercial license,提供R语言接口,感觉在向着一个商用的数据挖掘公司的方向在前进。
    ======================================分割线======================================

    开源的推荐系统大大小小的还有很多,以上只是介绍了一些在学术界和工业界比较流行的TOP 10,而且基本上都是用C++/Java实现的,在参考资料[1]、[2]中还提到的有Crab(Python)、CofiRank(C++)、MyMediaLite(.NET/C#)、PREA(Java)、Python-recsys(Python)、Recommendable(Ruby)、Recommenderlab(R)、Oryx(Java)、recommendify(Ruby)、RecDB(SQL)等等,当然GitHub上还有更多。。。即有适合单机运行的,也有适合集群的。虽然使用的编程语言不同,但实现的算法都大同小异,主要是SVD、SGD、ALS、MF、CF及其改进算法等。

    转载于:https://www.cnblogs.com/haore147/p/7182133.html

    展开全文
  • 推荐系统》基于标签的用户推荐系统

    万次阅读 多人点赞 2016-06-16 11:17:30
    打开微信扫一扫,关注微信公众号【搜索与推荐Wiki】 转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thinkg...

                                                                打开微信扫一扫,关注微信公众号【搜索与推荐Wiki】

     

    转载请注明出处:http://blog.csdn.net/gamer_gyt 

    博主微博:http://weibo.com/234654758 

    Github:https://github.com/thinkgamer


    1:联系用户兴趣和物品的方式

    2:标签系统的典型代表

    3:用户如何打标签

    4:基于标签的推荐系统

    5:算法的改进

    6:标签推荐

    源代码查看地址:github查看

    一:联系用户兴趣和物品的方式

        推荐系统的目的是联系用户的兴趣和物品,这种联系方式需要依赖不同的媒介。目前流行的推荐系统基本上是通过三种方式联系用户兴趣和物品。

                                      

           1:利用用户喜欢过的物品,给用户推荐与他喜欢过的物品相似的物品,即基于item的系统过滤推荐算法(算法分析可参考:点击阅读

           2:利用用户和兴趣用户兴趣相似的其他用户,给用户推荐哪些和他们兴趣爱好相似的其他用户喜欢的物品,即基于User的协同过滤推荐算法(算法分析可参考:点击阅读

           3:通过一些特征联系用户和物品,给用户推荐那些具有用户喜欢的特征的物品,这里的特征有不同的表现形式,比如可以表现为物品的属性集合,也可以表现为隐语义向量,而下面我们要讨论的是一种重要的特征表现形式——标签

     

    二:标签系统的典型代表

           pass掉那些国外网站,比如说豆瓣图书(左),网易云音乐(右)

                    

        标签系统确实能够帮助用户发现他们喜欢和感兴趣的物品

     

    三:用户如何打标签

           在互联网中每个人的行为都是随机的,但其实这些表面的行为隐藏着很多规律,那么我们对用户打的标签进行统计呢,便引入了标签流行度,我们定义的一个标签被一个用户使用在一个物品上,他的流行度就加1,可以如下代码实现:

     

    #统计标签流行度
    def TagPopularity(records):
        tagfreq = dict()
        for user, item ,tag in records:
            if tag not in tagfreq:
                tagfreq[tag] = 1
            else:
                tagfreq[tag] +=1
        return tagfreq
    

          下面的是一个标签流行度分布图(横坐标是标签流行度K,纵坐标是流行度K对应的标签数目),其也是符合典型的长尾分布,他的双对数曲线几乎是一条直线

     

                                        

     

                在用户看到一个物品时,我们希望他打的标签是能够准确的描述物品内容属性的关键词,但用户往往不是按照我们的想法操作,而是可能给物品打上各种各样奇奇怪怪的标签,此时便需要我们人工编辑一些特定的标签供用户选择,Scott A. Golder 总结了Delicious上的标签,将它们分为如下几类。

     

     表明物品是什么 比如是一只鸟,就会有“鸟”这个词的标签;是豆瓣的首页,就有一个标签叫“豆瓣”;是乔布斯的首页,就会有个标签叫“乔布斯”。
     表明物品的种类 比如在Delicious的书签中,表示一个网页类别的标签包括 article(文章)、blog(博客)、 book(图书)等。
     表明谁拥有物品 比如很多博客的标签中会包括博客的作者等信息。
     表达用户的观点 比如用户认为网页很有趣,就会打上标签funny(有趣),认为很无聊,就会打上标签boring(无聊)。
     用户相关的标签 比如 my favorite(我最喜欢的)、my comment(我的评论)等。
     用户的任务 比如 to read(即将阅读)、job search(找工作)

    比如在豆瓣上,标签便被分为如下几个类别

                                                                         

     

    四:基于标签的推荐系统

           用户用标签来描述对物品的看法,因此标签是联系用户和物品的纽带,也是反应用户兴趣的重要数据源,如何利用用户的标签数据提高个性化推荐结果的质量是推荐系统研究的重要课题。

           豆瓣很好地利用了标签数据,它将标签系统融入到了整个产品线中。

           首先,在每本书的页面上,豆瓣都提供了一个叫做“豆瓣成员常用标签”的应用,它给出了这本书上用户最常打的标签。

           同时,在用户给书做评价时,豆瓣也会让用户给图书打标签。

           最后,在最终的个性化推荐结果里,豆瓣利用标签将用户的推荐结果做了聚类,显示了对不同标签下用户的推荐结果,从而增加了推荐的多样性和可解释性。

            一个用户标签行为的数据集一般由一个三元组的集合表示,其中记录(u, i, b) 表示用户u给物品i打上了标签b。当然,用户的真实标签行为数据远远比三元组表示的要复杂,比如用户打标签的时间、用户的属性数据、物品的属性数据等。但是为了集中讨论标签数据,只考虑上面定义的三元组形式的数据,即用户的每一次打标签行为都用一个三元组(用户、物品、标签)表示。

           1:试验设置

            本节将数据集随机分成10份。这里分割的键值是用户和物品,不包括标签。也就是说,用户对物品的多个标签记录要么都被分进训练集,要么都被分进测试集,不会一部分在训练集,另一部分在测试集中。然后,我们挑选1份作为测试集,剩下的9份作为训练集,通过学习训练集中的用户标签数据预测测试集上用户会给什么物品打标签。对于用户u,令R(u)为给用户u的长度为N的推荐列表,里面包含我们认为用户会打标签的物品。令T(u)是测试集中用户u实际上打过标签的物品集合。然后,我们利用准确率(precision)和召回率(recall)评测个性化推荐算法的精度。

                                                                 

             将上面的实验进行10次,每次选择不同的测试集,然后将每次实验的准确率和召回率的平均值作为最终的评测结果。为了全面评测个性化推荐的性能,我们同时评测了推荐结果的覆盖率(coverage)、多样性(diversity)和新颖度。覆盖率的计算公式如下:

                                                                            

    接下来我们用物品标签向量的余弦相似度度量物品之间的相似度。对于每个物品i,item_tags[i]存储了物品i的标签向量,其中item_tags[i][b]是对物品i打标签b的次数,那么物品i和j的余弦相似度可以通过如下程序计算。

     

    #计算余弦相似度
    def CosineSim(item_tags,i,j):
        ret = 0
        for b,wib in item_tags[i].items():     #求物品i,j的标签交集数目
            if b in item_tags[j]:
                ret += wib * item_tags[j][b]
        ni = 0
        nj = 0
        for b, w in item_tags[i].items():      #统计 i 的标签数目
            ni += w * w
        for b, w in item_tags[j].items():      #统计 j 的标签数目
            nj += w * w
        if ret == 0:
            return 0
        return ret/math.sqrt(ni * nj)          #返回余弦值

           在得到物品之间的相似度度量后,我们可以用如下公式计算一个推荐列表的多样性:

     

                                                

          Python实现为:

     

    #计算推荐列表多样性
    def Diversity(item_tags,recommend_items):
        ret = 0
        n = 0
        for i in recommend_items.keys():
            for j in recommend_items.keys():
                if i == j:
                    continue
                ret += CosineSim(item_tags,i,j)
                n += 1
        return ret/(n * 1.0)

     

         推荐系统的多样性为所有用户推荐列表多样性的平均值。
         至于推荐结果的新颖性,我们简单地用推荐结果的平均热门程度(AveragePopularity)度量。对于物品i,定义它的流行度item_pop(i)为给这个物品打过标签的用户数。而对推荐系统,我们定义它的平均热门度如下:

                                                       

           2:一个简单的算法

           拿到了用户标签行为数据,相信大家都可以想到一个最简单的个性化推荐算法。这个算法的
           描述如下所示。
            统计每个用户最常用的标签。
            对于每个标签,统计被打过这个标签次数最多的物品。
            对于一个用户,首先找到他常用的标签,然后找到具有这些标签的最热门物品推荐给这个用户。
           对于上面的算法,用户u对物品i的兴趣公式如下:

                                                                        

            这里,B(u)是用户u打过的标签集合,B(i)是物品i被打过的标签集合,nu,b是用户u打过标签b的次数,nb,i是物品i被打过标签b的次数。本章用SimpleTagBased标记这个算法。
            在Python中,我们遵循如下约定:
             用 records 存储标签数据的三元组,其中records[i] = [user, item, tag];
             用 user_tags 存储nu,b,其中user_tags[u][b] = nu,b;
             用 tag_items存储nb,i,其中tag_items[b][i] = nb,i。
            如下程序可以从records中统计出user_tags和tag_items:

     

    <span style="font-family:Microsoft YaHei;">#从records中统计出user_tags和tag_items
    def InitStat(records):
        user_tags = dict()
        tag_items = dict()
        user_items = dict()
        for user, item, tag in records.items():
            addValueToMat(user_tags, user, tag, 1)
            addValueToMat(tag_items, tag, item, 1)
            addValueToMat(user_items, user, item, 1)</span>

     

           统计出user_tags和tag_items之后,我们可以通过如下程序对用户进行个性化推荐:

     

    <span style="font-family:Microsoft YaHei;">#对用户进行个性化推荐
    def Recommend(user):
        recommend_items = dict()
        tagged_items = user_items[user]
        for tag, wut in user_tags[user].items():
            for item, wti in tag_items[tag].items():
                #if items have been tagged, do not recommend them
                if item in tagged_items:
                    continue
                if item not in recommend_items:
                    recommend_items[item] = wut * wti
                else:
                    recommend_items[item] += wut * wti
        return recommend_items
    </span>

     

    五:算法的改进

     

     

          再次回顾四中提出的简单算法

                                                                       

         该算法存在许多缺点,比如说对于热门商品的处理,数据洗漱性的处理等,这也是在推荐系统中经常会遇见的问题

          1:TF-IDF

          前面这个公式倾向于给热门标签对应的热门物品很大的权重,因此会造成推荐热门的物品给用户,从而降低推荐结果的新颖性。另外,这个公式利用用户的标签向量对用户兴趣建模,其中每个标签都是用户使用过的标签,而标签的权重是用户使用该标签的次数。这种建模方法的缺点是给热门标签过大的权重,从而不能反应用户个性化的兴趣。这里我们可以借鉴TF-IDF的思想,对这一公式进行改进:

                                                                       

             这里,记录了标签b被多少个不同的用户使用过。这个算法记为TagBasedTFIDF。

             同理,我们也可以借鉴TF-IDF的思想对热门物品进行惩罚,从而得到如下公式:

                                                                      

             其中, 记录了物品i被多少个不同的用户打过标签。这个算法记为TagBasedTFIDF++。

             2:数据稀疏性

              在前边的算法中,用户兴趣和物品的联系是通过B(u) B(i)交集得到的,但是对于新用户,这个交集的结果将会非常小,为了提高推荐结果的可靠性,这里我们要对标签进行扩展,,比如若用户曾经用过“推荐系统”这个标签,我们可以将这个标签的相似标签也加入到用户标签集合中,比如“个性化”、“协同过滤”等标签。

              进行标签扩展的方法有很多,比如说话题模型(参考博客),这里遵循简单原则介绍一种基于邻域的方法。

              标签扩展的本质是找到与他相似的标签,也就是计算标签之间的相似度。最简单的相似度可以是同义词。如果有一个同义词词典,就可以根据这个词典进行标签扩展。如果没有这个词典,我们可以从数据中统计出标签的相似度。

              如果认为同一个物品上的不同标签具有某种相似度,那么当两个标签同时出现在很多物品的标签集合中时,我们就可以认为这两个标签具有较大的相似度。对于标签b,令N(b)为有标签b的物品的集合,n_{b,i}为给物品i打上标签b的用户数,我们可以通过如下余弦相似度公式计算标签b和标签b'的相似度:

                                                                     

            3:标签清理

              不是所有标签都能反应用户的兴趣。比如,在一个视频网站中,用户可能对一个视频打了一个表示情绪的标签,比如“不好笑”,但我们不能因此认为用户对“不好笑”有兴趣,并且给用户推荐其他具有“不好笑”这个标签的视频。相反,如果用户对视频打过“成龙”这个标签,我们可以据此认为用户对成龙的电影感兴趣,从而给用户推荐成龙其他的电影。同时,标签系统里经常出现词形不同、词义相同的标签,比如recommender system和recommendation engine就是两个同义词。
              标签清理的另一个重要意义在于将标签作为推荐解释。如果我们要把标签呈现给用户,将其作为给用户推荐某一个物品的解释,对标签的质量要求就很高。首先,这些标签不能包含没有意义的停止词或者表示情绪的词,其次这些推荐解释里不能包含很多意义相同的词语。
              一般来说有如下标签清理方法:
              去除词频很高的停止词;
              去除因词根不同造成的同义词,比如 recommender system和recommendation system;
              去除因分隔符造成的同义词,比如 collaborative_filtering和collaborative-filtering。

            为了控制标签的质量,很多网站也采用了让用户进行反馈的思想,即让用户告诉系统某个标签是否合适。

    推荐程序(更新查看地址:github   //  数据集下载):

    #!/usr/bin/env python
    #-*-coding:utf-8-*-
    import random  
    #统计各类数量  
    def addValueToMat(theMat,key,value,incr):  
        if key not in theMat: #如果key没出先在theMat中  
            theMat[key]=dict();  
            theMat[key][value]=incr;  
        else:  
            if value not in theMat[key]:  
                theMat[key][value]=incr;  
            else:  
                theMat[key][value]+=incr;#若有值,则递增  
      
    user_tags = dict();  
    tag_items = dict();  
    user_items = dict();  
    user_items_test = dict();#测试集数据字典  
      
    #初始化,进行各种统计  
    def InitStat():  
        data_file = open('delicious.dat')  
        line = data_file.readline();   
        while line:  
            if random.random()>0.1:#将90%的数据作为训练集,剩下10%的数据作为测试集  
                terms = line.split("\t");#训练集的数据结构是[user, item, tag]形式  
                user=terms[0];  
                item=terms[1];  
                tag=terms[2];  
                addValueToMat(user_tags,user,tag,1)  
                addValueToMat(tag_items,tag,item,1)  
                addValueToMat(user_items,user,item,1)  
                line = data_file.readline();  
            else:  
                addValueToMat(user_items_test,user,item,1)  
        data_file.close();     
        
    #推荐算法  
    def Recommend(usr):  
        recommend_list = dict();  
        tagged_item = user_items[usr];#得到该用户所有推荐过的物品  
        for tag_,wut in user_tags[usr].items():#用户打过的标签及次数  
            for item_,wit in tag_items[tag_].items():#物品被打过的标签及被打过的次数  
                if item_ not in tagged_item:#已经推荐过的不再推荐  
                    if item_ not in recommend_list:  
                        recommend_list[item_]=wut*wit;#根据公式  
                    else:  
                        recommend_list[item_]+=wut*wit;  
        return sorted(recommend_list.iteritems(), key=lambda a:a[1],reverse=True)
    
    InitStat()
    recommend_list = Recommend("48411")
    # print recommend_list
    for recommend in recommend_list[:10]:  #兴趣度最高的十个itemid
        print recommend

    运行结果:
    ('912', 610)
    ('3763', 394)
    ('52503', 238)
    ('39051', 154)
    ('45647', 147)
    ('21832', 144)
    ('1963', 143)
    ('1237', 140)
    ('33815', 140)
    ('5136', 138)

     

    六:标签推荐

            当用户浏览某个物品时,标签系统非常希望用户能够给这个物品打上高质量的标签,这样才能促进标签系统的良性循环。因此,很多标签系统都设计了标签推荐模块给用户推荐标签。

           1:为什么给用户推荐标签

                 方便用户输入标签 让用户从键盘输入标签无疑会增加用户打标签的难度,这样很多用户不愿意给物品打标签,因此我们需要一个辅助工具来减小用户打标签的难度,从而提高用户打标签的参与度。
                提高标签质量 同一个语义不同的用户可能用不同的词语来表示。这些同义词会使标签的词表变得很庞大,而且会使计算相似度不太准确。而使用推荐标签时,我们可以对词表进行选择,首先保证词表不出现太多的同义词,同时保证出现的词都是一些比较热门的、有代表性的词。

          2:标签推荐的四种简单算法

           a:给用户u推荐整个系统里最热门的标签(这里将这个算法称为PopularTags)令tags[b]为标签b的热门程度,那么这个算法的实现如下:

     

    <span style="font-family:Microsoft YaHei;font-size:14px;">def RecommendPopularTags(user,item, tags, N):
        return sorted(tags.items(), key=itemgetter(1), reverse=True)[0:N]    </span>

           b:给用户u推荐物品i上最热门的标签(这里将这个算法称为ItemPopularTags)。令item_tags[i][b]为物品i被打上标签b的次数

    <span style="font-family:Microsoft YaHei;font-size:14px;">def RecommendItemPopularTags(user,item, item_tags, N):
        return sorted(item_tags[item].items(), key=itemgetter(1), reverse=True)[0:N]</span>

           c:是给用户u推荐他自己经常使用的标签(这里将这个算法称为UserPopularTags)。令user_tags[u][b]为用户u使用标签b的次数

    <span style="font-family:Microsoft YaHei;font-size:14px;">def RecommendUserPopularTags(user,item, user_tags, N):
        return sorted(user_tags[user].items(), key=itemgetter(1), reverse=True)[0:N]</span>

           d:前面两种的融合(这里记为HybridPopularTags),该方法通过一个系数将上面的推荐结果线性加权,然后生成最终的推荐结果。

    <span style="font-family:Microsoft YaHei;font-size:14px;">def RecommendHybridPopularTags(user,item, user_tags, item_tags, alpha, N):
        max_user_tag_weight = max(user_tags[user].values())
        for tag, weight in user_tags[user].items():
            ret[tag] = (1 – alpha) * weight / max_user_tag_weight
        </span>
    <span style="font-family:Microsoft YaHei;font-size:14px;">    max_item_tag_weight = max(item_tags[item].values())
        for tag, weight in item_tags[item].items():
            if tag not in ret:
                ret[tag] = alpha * weight / max_item_tag_weight
            else:
                ret[tag] += alpha * weight / max_item_tag_weight
        return sorted(ret[user].items(), key=itemgetter(1), reverse=True)[0:N]</span>

    注意在上面的实现中,我们在将两个列表线性相加时都将两个列表按最大值做了归一化,这样的好处是便于控制两个列表对最终结果的影响,而不至于因为物品非常热门而淹没用户对推荐结果的影响,或者因为用户非常活跃而淹没物品对推荐结果的影响。


                

    展开全文
  • 初识推荐系统

    2018-06-03 17:21:00
    推荐系统是一种信息过滤系统,用于预测用户对物品的「评分」或「偏好」。 精彩推荐: 《推荐系统实战》- 笔记与思考 Surprise——Python的推荐系统库(1) 存在问题(背景) 关键词的信息量不足,基于关键词的...
  • 转载请注明出处:http://blog.csdn.net/gamer_gyt ...公众号:搜索与推荐Wiki 个人网站:http://thinkgamer.github.io 不管是电商网站,还是新闻资讯类网站,推荐系统都扮演着十分重要的角色。一个优秀的推荐系统...
  • 转载请注明出处:http://blog.csdn.net/gamer_gyt ...公众号:搜索与推荐Wiki 个人网站:http://thinkgamer.github.io 接下来将会用10篇文章介绍下推荐系统的起源,应用,算法和案例,并带领大家从0到1实现属...
  • 前面两篇说了一下 Wiki 系统的选择和 docsify 的部署和配置,这一篇说一下「我的 Wiki」。 我的 Wiki 只写自己用到的,用不到的写了用处也不大,而且只有用得到的东西才能学会。 掘墓人的 Wiki:...
  • 个人wiki网站:dokuwiki的搭建

    万次阅读 2017-02-20 18:51:49
    dokuwiki是一个简单的wiki网站系统,利用它可以搭建个人的wiki知识管理网站,它的词条内容是保存在一个个.txt文档中的,不需要安装数据库下载地址 http://download.dokuwiki.org/ 中文帮助站,...
  • 推荐系统——开源代码

    千次阅读 2018-05-04 16:01:53
    本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature、LibMF、LibFM等,也有重量级的适用于工业系统的 Mahout、Oryx、EasyRecd等#1.SVDFeature主页:...语言:C++ 一个feature-based协同...
  • 推荐系统源码

    千次阅读 2016-12-06 15:44:55
    1. LibFM 项目主页:http://www.libfm.org/ ...项目主页:http://apex.sjtu.edu.cn/apex_wiki/svdfeature 3. Libsvm和Liblinear libsvm项目主页:http://www.csie.ntu.edu.tw/~cjlin/libsvm
  • 开源的推荐系统简介

    2019-01-17 18:39:22
    最 近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature、LibMF、LibFM等,也有重 量级的适用于工业系统的 Mahout、Oryx、EasyRecd等,供大家参考。PS:这里的...
  • 转载请注明出处:http://blog.csdn.net/gamer_gyt ...公众号:搜索与推荐Wiki 个人网站:http://thinkgamer.github.io 个性化推荐是数据挖掘(Data Mining)中的一个目的明确的应用场景,所以,可以利...
  • 推荐系统开源软件

    2017-05-23 14:14:40
    SVDFeature 由上海交大的同学开发的,C++语言,代码质量很高 。...http://svdfeature.apexlab.org/wiki/Main_Page SVDFeature包含一个很灵活的Matrix Factorization推荐框架,能方便的实现SVD、SV
  • WiKi程序

    千次阅读 2006-04-30 10:48:00
    Wiki 是一个协同著作平台或称开放编辑系统。... ……相信很多的站长都需要WiKi,我们可以用Wiki来建设帮助系统,知识系统,松散的讨论平台,甚至收藏夹……在这里我推荐几款常用的WiKi程序。一,ASP
  • 推荐系统初探之二 —— 推荐方法  在上一篇文章中,我们了解到了两种相似度评价方法:欧几里得距离和皮尔逊相关度方法,其实 类似功能的算法好多,比如Jaccard系数和曼哈顿距离算法等。有兴趣的同学可以登陆...
  • 编程竞赛发展多年,难度越来越高,内容越来越复杂,而网上资料大多零散,初学者往往并不知道如何系统地学习相关知识,需要花费大量时间摸索。OI(OlympiadinI...
  • RankSys, Java 8推荐系统框架,用于新颖多样化和更多 RankSys: Java 8推荐系统框架,用于新颖,多样性和更多 || || Wiki Wiki Wiki Wiki Wiki Wiki Twitter 。 简介RankSys是一个新的框架,它是由目前在几个出版物
  • 推荐系统--开源代码

    千次阅读 2017-02-17 18:29:14
    最近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature、LibMF、LibFM等,也有重量级的适用于工业系统的 Mahout、Oryx、EasyRecd等 #1.SVDFeature 主页:...
  • 最近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature、LibMF、LibFM等,也有重量级的适用于工业系统的 Mahout、Oryx、EasyRecd等,供大家参考。PS:这里的top...
  • 最 近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature、LibMF、LibFM等,也有重 量级的适用于工业系统的 Mahout、Oryx、EasyRecd等,供大家参考。PS:这里的...
  • 推荐系统之协同过滤概述

    万次阅读 2015-12-11 13:44:01
    协同过滤(Collaborative Filtering)是现今推荐系统中应用最为成熟的一个推荐算法系类,它利用兴趣相投、拥有共同经验之群体的喜好来推荐使用者感兴趣的资讯,个人透过合作的机制给予资讯相当程度的回应(如评分)...
  • 推荐系统之协同过滤

    2012-04-01 16:38:33
    协同过滤(Collaborative Filtering)是现今推荐系统中应用最为成熟的一个推荐算法系类,它利用兴趣相投、拥有共同经验之群体的喜好来推荐使用者感兴趣的资讯,个人透过合作的机制给予资讯相当程度的回应(如评分)...
  • 转载请注明出处:http://blog.csdn.net/gamer_gyt ...公众号:搜索与推荐Wiki 个人网站:http://thinkgamer.github.io 俗话说的好:“眼看千遍,不如手写一遍”,前几篇介绍了推荐系统的来源、发展、数据预处理、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 443
精华内容 177
关键字:

wiki系统推荐