下面的内容转自我爱自然语言处理博客,感谢博主,学到很多东西。

原文链接:http://www.52nlp.cn/%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E4%B8%A4%E4%B8%AA%E6%96%87%E6%A1%A3%E7%9A%84%E7%9B%B8%E4%BC%BC%E5%BA%A6%E4%B8%80

前几天,我发布了一个和在线教育相关的网站:课程图谱,这个网站的目的通过对公开课的导航、推荐和点评等功能方便大家找到感兴趣的公开课,特别是目前最火的Coursera,Udacity等公开课平台上的课程。在发布之前,遇到的一个问题是如何找到两个相关的公开课,最早的计划是通过用户对课程的关注和用户对用户的关注来做推荐,譬如“你关注的朋友也关注这些课程”,但是问题是网站发布之前,我还没有积累用户关注的数据。另外一个想法是提前给课程打好标签,通过标签来计算它门之间的相似度,不过这是一个人工标注的过程,需要一定的时间。当然,另一个很自然的想法是通过课程的文本内容来计算课程之间的相似度,公开课相对来说有很多的文本描述信息,从文本分析的角度来处理这种推荐系统的冷启动问题应该不失为一个好的处理方法。通过一些调研和之前的一些工作经验,最终考虑采用Topic model来解决这个问题,其实方案很简单,就是将两个公开课的文本内容映射到topic的维度,然后再计算其相似度。然后的然后就通过google发现了gensim这个强大的Python工具包,它的简介只有一句话:topic modelling for humans, 用过之后,只能由衷的说一句:感谢上帝,感谢Google,感谢开源!

当前课程图谱中所有课程之间的相似度全部基于gensim计算,自己写的调用代码不到一百行,topic模型采用LSI(Latent semantic indexing, 中文译为浅层语义索引),LSI和LSA(Latent semantic analysis,中文译为浅层语义分析)这两个名词常常混在一起,事实上,在维基百科上,有建议将这两个名词合二为一。以下是课程图谱的一个效果图,课程为著名的机器学习专家Andrew Ng教授在Coursera的机器学习公开课,图片显示的是主题模型计算后排名前10的相关课程,Andrew Ng教授同时也是Coursera的创始人之一:

最后回到这篇文章的主题,我将会分3个部分介绍,首先介绍一些相关知识点,不过不会详细介绍每个知识点的细节,主要是简要的描述一下同时提供一些互联网上现有的不错的参考资料,如果读者已经很熟悉,可以直接跳过去;第二部分我会介绍gensim的安装和使用,特别是如何计算课程图谱上课程之间的相似度的;第三部分包括如何基于全量的英文维基百科(400多万文章,压缩后9个多G的语料)在一个4g内存的macbook上训练LSI模型和LDA模型,以及如何将其应用到课程图谱上来改进课程之前的相似度的效果,注意课程图谱的课程内容主要是英文,目前的效果还是第二部分的结果,第三部分我们一起来实现。如果你的英文没问题,第二,第三部分可以直接阅读gensim的tutorail,我所做的事情主要是基于这个tutorail在课程图谱上做了一些验证。

一、相关的知识点及参考资料

这篇文章不会写很长,但是涉及的知识点蛮多,所以首先会在这里介绍相关的知识点,了解的同学可以一笑而过,不了解的同学最好能做一些预习,这对于你了解topic model以及gensim更有好处。如果以后时间允许,我可能会基于其中的某几个点写一篇比较详细的介绍性的文章。不过任何知识点首推维基百科,然后才是下面我所罗列的参考资料。

1) TF-IDF,余弦相似度,向量空间模型
这几个知识点在信息检索中是最基本的,入门级的参考资料可以看看吴军老师在《数学之美》中第11章“如何确定网页和查询的相关性”和第14章“余弦定理和新闻的分类”中的通俗介绍或者阮一峰老师写的两篇科普文章“TF-IDF与余弦相似性的应用(一):自动提取关键词”和“TF-IDF与余弦相似性的应用(二):找出相似文章”。

专业一点的参考资料推荐王斌老师在中科院所授的研究生课程“现代信息检索(Modern Information Retrieval)”的课件,其中“第六讲向量模型及权重计算”和该主题相关。或者更详细的可参考王斌老师翻译的经典的《信息检索导论》第6章或者其它相关的信息检索书籍。

2)SVD和LSI
想了解LSI一定要知道SVD(Singular value decomposition, 中文译为奇异值分解),而SVD的作用不仅仅局限于LSI,在很多地方都能见到其身影,SVD自诞生之后,其应用领域不断被发掘,可以不夸张的说如果学了线性代数而不明白SVD,基本上等于没学。想快速了解或复习SVD的同学可以参考这个英文tutorail: Singular Value Decomposition Tutorial , 当然更推荐MIT教授Gilbert Strang的线性代数公开课和相关书籍,你可以直接在网易公开课看相关章节的视频。

关于LSI,简单说两句,一种情况下我们考察两个词的关系常常考虑的是它们在一个窗口长度(譬如一句话,一段话或一个文章)里的共现情况,在语料库语言学里有个专业点叫法叫Collocation,中文译为搭配或词语搭配。而LSI所做的是挖掘如下这层词语关系:A和C共现,B和C共现,目标是找到A和B的隐含关系,学术一点的叫法是second-order co-ocurrence。以下引用百度空间上一篇介绍相关参考资料时的简要描述:

LSI本质上识别了以文档为单位的second-order co-ocurrence的单词并归入同一个子空间。因此:
1)落在同一子空间的单词不一定是同义词,甚至不一定是在同情景下出现的单词,对于长篇文档尤其如是。
2)LSI根本无法处理一词多义的单词(多义词),多义词会导致LSI效果变差。

A persistent myth in search marketing circles is that LSI grants contextuality; i.e., terms occurring in the same context. This is not always the case. Consider two documents X and Y and three terms A, B and C and wherein:

A and B do not co-occur.
X mentions terms A and C
Y mentions terms B and C.

:. A—C—B

The common denominator is C, so we define this relation as an in-transit co-occurrence since both A and B occur while in transit with C. This is called second-order co-occurrence and is a special case of high-order co-occurrence.

其实我也推荐国外这篇由Dr. E. Garcia所写的SVD与LSI的通俗教程,这个系列最早是微博上有朋友推荐,不过发现英文原始网站上内容已经被其主人下架了,原因不得而知。幸好还有Google,在CSDN上我找到了这个系列“SVD与LSI教程系列”,不过很可惜很多图片都看不见了,如果哪位同学发现更好的版本或有原始的完整版本,可以告诉我,不甚感激!

不过幸好原文作者写了两个简要的PDF Tutorail版本:

Singular Value Decomposition (SVD)- A Fast Track Tutorial

Latent Semantic Indexing (LSI) A Fast Track Tutorial

这两个简明版本主要是通过简单的例子直观告诉你什么是SVD,什么是LSI,非常不错。

这几个版本的pdf文件我在微盘上上传了一个打包文件,也可以从这里下载:svd-lsi-doc.tar.gz

3) LDA
这个啥也不说了,隆重推荐我曾经在腾讯工作时的leader rickjin的”LDA数学八卦“系列,通俗易懂,娓娓道来,另外rick的其他系列也是非常值得一读的。

未完待续…

注:原创文章,转载请注明出处“我爱自然语言处理”:www.52nlp.cn

本文链接地址:http://www.52nlp.cn/如何计算两个文档的相似度一

转载于:https://www.cnblogs.com/fengjianhit/archive/2013/06/08/similarity.html

如何计算两个文档的相似度(一)相关推荐

  1. python如何寻找两个相似的文件_如何计算两个文档的相似度(二)

    上一节我们介绍了一些背景知识以及gensim , 相信很多同学已经尝试过了.这一节将从gensim最基本的安装讲起,然后举一个非常简单的例子用以说明如何使用gensim,下一节再介绍其在课程图谱上的应 ...

  2. 比较两个文档的相似程度_您的文档对读者的友好程度如何?

    比较两个文档的相似程度 有成就的技术作家所要做的首要任务是为观众写作. 这个任务听起来很简单,但是当我想到世界各地的人们时,我想知道:他们能阅读我们的文档吗? 可读性已经研究了多年,接下来是对研究成果 ...

  3. 文档词频矩阵_如何通过词向量技术来计算 2 个文档的相似度?

    作者:吴俣https://www.zhihu.com/question/33952003/answer/135089460 Deep Learning 派系:(1)最简单的就是两个句子分别过一个CNN ...

  4. Git提交到多个远程仓库(多看两个文档)

    Git提交到多个远程仓库(多看两个文档) 一.总结 一句话总结: 二. Git提交到多个远程仓库(多看两个文档) 有两种做法,先看第一种 一.通过命令行进行操作 例如我有下面两个仓库: Mybatis ...

  5. matlab源代码 语义相似度计算,如何计算两个句子之间的相似度(句法和语义)...

    我应该每次取两个句子并计算它们是否相似.我的意思是,在语法和语义上都是这样.如何计算两个句子之间的相似度(句法和语义) INPUT1:奥巴马签署法律.奥巴马签署了一项新法律. INPUT2: 总线停在 ...

  6. 团队合作开发的两种文档工具

    前言 团队中,需要从需求分析开始确定,一直到项目的开发完成,中间要经历各种事情,需要各种任务来维持,一直到合作开发完成,所以需要一个团队协作查看的任务工具.那么这里推荐的有两种,trello,和tea ...

  7. python 合并word内容_python如何合并两个文档内容

    1.两个文档合并之前 2.合并两个文件的代码:file1 = open("name,tel.txt", "rb") file2 = open("nam ...

  8. Computer:成功解决在WPS中合并论文中两个文档(比如将另一个封皮的文档合并在当前文档当中)

    Computer:成功解决在WPS中合并两个文档(比如将另一个封皮的文档合并在当前文档当中) 目录 解决问题 解决方法 解决问题 经常在写论文的时候,需要这样的一个场景,在WPS中合并两个文档,比如将 ...

  9. 使用python代码区分两个文档的差异,并将差异内容输出

    使用 python 代码来区分两个文档的差异,并将差异内容输出,可以使用 difflib 库. 首先,需要安装 difflib 库,可以使用以下命令安装: pipinstall difflib 然后, ...

最新文章

  1. dubbo 单元测试_技术分享——一路踩坑构建Dubbo源码
  2. 风口上的政府大数据 需要消除“大误区”
  3. 自律到极致-人生才精致:第12期
  4. 有些话不知道怎么说才好
  5. Django项目:CRM(客户关系管理系统)--12--05PerfectCRM实现King_admin注册功能获取内存01...
  6. 清华博士的逆袭路:从延毕警告到在顶刊发文,我蛰伏了四年
  7. Oracle密码中含有特殊字符时exp,imp的使用
  8. Django 1.8.2 文档
  9. Ubuntu打印机控制命令笔记
  10. 瑞芯微和全志哪个好_瑞芯微和全志科技基本面信息简要对比和整理
  11. .NET中的Lambda表达式与匿名方法
  12. 亿安科技作手_亿安科技作手(2)-李B
  13. Ubuntu/Windows配置AlphaPose填坑(亲测有效)
  14. 51Talk-Level 7 Unit 2 L3
  15. 0x120-从头开始写操作系统-启动扇区与内存的关系及内存寻址的应用
  16. 天龙八部荣耀版体验服服务器未响应,《天龙八部荣耀版》创新竖版手游官网-合区来了!体验服合区测试解析...
  17. 零基础转行学web前端开发好学吗?爱创课堂告诉你
  18. 计算机求职面试智力题:找毒药(一共n瓶水,仅有一瓶是毒药),求至少需要多少只老鼠/猪;或者求x只老鼠/猪最多可以搜索多少瓶水
  19. swap函数中的交换 【指针】 学习笔记
  20. 互联网日报 | 华为云年交易额超10亿元;恒大汽车拟申请科创板上市;李彦宏创立生命科学公司“百图生科”...

热门文章

  1. 从技术上解读大数据的应用现状和开源未来
  2. 埃森哲5G智慧城市报告:美国GDP将狂增5千亿
  3. “32 位应用已死!”
  4. 在Ubuntu中打开pycharm步骤:
  5. spring源码分析之spring注解@Aspect是如何工作的?
  6. 手动安装K8s第三节:etcd集群部署
  7. Linux_《Linux命令行与shell脚本编程大全》第十八章学习总结
  8. ES6数组的解构赋值( 中)
  9. [Linux] PHP程序员玩转Linux系列-腾讯云硬盘扩容挂载
  10. 186. [USACO Oct08] 牧场旅行