MIT6.006是算法导论,Lec02讲的是Document Distance(文档距离),比如比较两个文档相似度或者搜索引擎中都会用到。

计算步骤为:

1.将每个文档分离为单词

2.统计词频

3.计算点积(并做除法)

说明:

1.“单词”指的是字母和数字(alphanumeric)

2.每个文档统计完词频后得到的list,可看作一个向量

3.两个文档间的相似度,是相似的单词除以总的单词,类似于两个向量的夹角公式

MIT6.006下载的相关资源中,给出了8个逐渐改善的代码版本,但本质都是一样的。代码8短小精悍,我添加了一些中文注释

  1. #coding:utf8
  2. #description:计算文档距离
  3. import sys
  4. import math
  5. import string
  6.  
  7. ######################################
  8. #步骤1:读取文件
  9. ######################################
  10. def read_file(filename):
  11. try:
  12. f = open(filename, 'r')
  13. return f.read()
  14. except IOError:
  15. print "Error opening or reading input file: ", filename
  16. sys.exit()
  17.  
  18. #####################################
  19. #步骤2:从文本中分离单词
  20. #####################################
  21. translation_table=string.maketrans(string.punctuation+string.uppercase,
  22. " "*len(string.punctuation)+string.lowercase)
  23.  
  24. def get_words_from_line_list(text):
  25. """从给定的文本中找出所有的单词,返回一个list"""
  26. text = text.translate(translation_table)
  27. word_list = text.split()
  28. return word_list
  29.  
  30. ######################################
  31. #步骤3:统计词频
  32. ######################################
  33. def count_frequency(word_list):
  34. D = {}
  35. for new_word in word_list:
  36. if new_word in D:
  37. D[new_word] = D[new_word] + 1
  38. else:
  39. D[new_word] = 1
  40. return D
  41.  
  42. def word_frequencies_for_file(filename):
  43. """返回(单词,频率)组成的list"""
  44. line_list = read_file(filename)
  45. word_list = get_words_from_line_list(line_list)
  46. freq_mapping = count_frequency(word_list)
  47. return freq_mapping
  48.  
  49. def inner_product(D1, D2):
  50. sum = 0.0
  51. for key in D1:
  52. if key in D2:
  53. sum += D1[key] * D2[key]
  54. return sum
  55.  
  56. def vector_angle(D1, D2):
  57. """计算两个向量的夹角"""
  58. numerator = inner_product(D1, D2)
  59. denominator = math.sqrt(inner_product(D1,D1)*inner_product(D2,D2))
  60. return math.acos(numerator/denominator)
  61.  
  62. def main():
  63. if len(sys.argv) != 3:
  64. print "Usage: docdist.py filename_1 filename_2"
  65. else:
  66. filename_1 = sys.argv[1]
  67. filename_2 = sys.argv[2]
  68. sorted_word_list_1 = word_frequencies_for_file(filename_1)
  69. sorted_word_list_2 = word_frequencies_for_file(filename_2)
  70. distance = vector_angle(sorted_word_list_1, sorted_word_list_2)
  71. print "The distance between the document is: %0.6f (radians)"%distance
  72.  
  73. if __name__ == '__main__':
  74. main()

 Lec02的讲义在这里 

MIT6.006Lec02:DocumentDistance的更多相关文章

  1. MIT6.006Lec03:插入排序,归并排序,递归树

    MIT6.006是算法导论课,Lec03主要讲插入排序,归并排序,以及分析方法(递归树)等. 插入排序,可以分为线性插入排序.二分插入排序,区别在于当把数组中某元素插入到前面的有序列表中时,前者遍历, ...

  2. MIT6.006Lec01:Python实现

    MIT6.006是Algo Intro这门课,据说语言使用python Lec01是讲peak finding,也就是峰值点 具体为: 一维情况下一个数组中a[i]>a[i-1]且a[i]> ...

  3. java web 开发三剑客 -------电子书

    Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知In ...

  4. 所有selenium相关的库

    通过爬虫 获取 官方文档库 如果想获取 相应的库 修改对应配置即可 代码如下 from urllib.parse import urljoin import requests from lxml im ...

  5. MIT6.828准备:MacOS下搭建xv6和risc-v环境

    本文介绍在MacOS下搭建Mit6.828/6.S081 fall2019实验环境的详细过程,包括riscv工具链.qemu和xv6,对于Linux系统同样可以参考. 介绍 只有了解底层原理才能写好上 ...

  6. MIT6.S081/6.828 实验1:Lab Unix Utilities

    Mit6.828/6.S081 fall 2019的Lab1是Unix utilities,主要内容为利用xv6的系统调用实现sleep.pingpong.primes.find和xargs等工具.本 ...

  7. mit-6.828 Lab01:Booting a PC exercise1.1

    Lab01:Booting a PC 目录 Lab01:Booting a PC JOS BIOS 背景知识 8086的基本知识 GDB 常用调试指令 Real mode && Pro ...

  8. [MIT6.006] 22. Daynamic Programming IV: Guitar Fingering, Tetris, Super Mario Bro. 动态规划IV:吉他指弹,俄罗斯方块,超级玛丽奥

    之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问 ...

  9. [MIT6.006] 21. Daynamic Programming III: Parenthesization, Edit Distance, Knapsack 动态规划III:括号问题,编辑距离,背包问题

    这节课主要针对字符串/序列上的问题,了解如果使用动态规划进行求解.上节课我们也讲过使用前缀和后缀的概念,他们如下所示: 接下来,我们通过三个问题来深入了解下动态规划使用前缀.后缀和子串怎么去解决括号问 ...

随机推荐

  1. Codeforces Round #552 (Div. 3) 题解

    Codeforces Round #552 (Div. 3) 题目链接 A. Restoring Three Numbers 给出 \(a+b\),\(b+c\),\(a+c\) 以及 \(a+b+c ...

  2. Eclipse开发java程序里Test用不了,怎么导包?

    1.右键项目Build Path->Add External JARs,选择要导入的jar包即可: 2.建立方法,引入junit. 3.ok

  3. VS生成事件执行XCOPY时出现Invalid num of parameters的解决方案

    最近想偷懒 想把项目生成的dll全部自动汇集到一个文件夹下 于是乎就动用了VS的生成后事件 在执行Xcopy的时候碰到了点问题 Invalid number of parameters 挺奇怪的,在公 ...

  4. NO.2day 操作系统基础

    操作系统基础 1.为什么要有操作系统 操作系统为用户程序提供一个更好.更简单.更清晰的计算机模型,并管理刚才提到的所有设备(磁盘.内存.显示器.打印机等).程序员无法把所有的硬件操作细节都了解到,管理 ...

  5. GO_10:GO语言基础之error

    Go错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制. error类型是一个接口类型,这是它的定义: type error interface { Error() string } ...

  6. python net-snmp使用

    安装 官网:http://www.net-snmp.org/download.html 环境:CentOS 6.6 + python 2.7.10 1.下载安装包 net-snmp-5.6.2.1.t ...

  7. Python之路,Day2 - Python基础,列表,循环

    1.列表练习name0 = 'wuchao'name1 = 'jinxin'name2 = 'xiaohu'name3 = 'sanpang'name4 = 'ligang' names = &quo ...

  8. 调用weka模拟实现 “主动学习“ 算法

    主动学习: 主动学习的过程:需要分类器与标记专家进行交互.一个典型的过程: (1)基于少量已标记样本构建模型 (2)从未标记样本中选出信息量最大的样本,交给专家进行标记 (3)将这些样本与之前样本进行 ...

  9. angularJS $http $q $promise

    一天早晨,爹对儿子说:“宝儿,出去看看天气如何!” 每个星期天的早晨,爹都叫小宝拿着超级望远镜去家附近最高的山头上看看天气走势如何,小宝说没问题,我们可以认为小宝在离开家的时候给了他爹一个promis ...

  10. 20155235 2016-2017-2 《Java程序设计》第5周学习总结

    20155235 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 第八章知识点 语法与继承结构 使用try.catch 异常继承结构 要抓还是要抛 贴心还是造 ...