MIT6.006Lec02:DocumentDistance
MIT6.006是算法导论,Lec02讲的是Document Distance(文档距离),比如比较两个文档相似度或者搜索引擎中都会用到。
计算步骤为:
1.将每个文档分离为单词
2.统计词频
3.计算点积(并做除法)
说明:
1.“单词”指的是字母和数字(alphanumeric)
2.每个文档统计完词频后得到的list,可看作一个向量
3.两个文档间的相似度,是相似的单词除以总的单词,类似于两个向量的夹角公式
MIT6.006下载的相关资源中,给出了8个逐渐改善的代码版本,但本质都是一样的。代码8短小精悍,我添加了一些中文注释
- #coding:utf8
- #description:计算文档距离
- import sys
- import math
- import string
- ######################################
- #步骤1:读取文件
- ######################################
- def read_file(filename):
- try:
- f = open(filename, 'r')
- return f.read()
- except IOError:
- print "Error opening or reading input file: ", filename
- sys.exit()
- #####################################
- #步骤2:从文本中分离单词
- #####################################
- translation_table=string.maketrans(string.punctuation+string.uppercase,
- " "*len(string.punctuation)+string.lowercase)
- def get_words_from_line_list(text):
- """从给定的文本中找出所有的单词,返回一个list"""
- text = text.translate(translation_table)
- word_list = text.split()
- return word_list
- ######################################
- #步骤3:统计词频
- ######################################
- def count_frequency(word_list):
- D = {}
- for new_word in word_list:
- if new_word in D:
- D[new_word] = D[new_word] + 1
- else:
- D[new_word] = 1
- return D
- def word_frequencies_for_file(filename):
- """返回(单词,频率)组成的list"""
- line_list = read_file(filename)
- word_list = get_words_from_line_list(line_list)
- freq_mapping = count_frequency(word_list)
- return freq_mapping
- def inner_product(D1, D2):
- sum = 0.0
- for key in D1:
- if key in D2:
- sum += D1[key] * D2[key]
- return sum
- def vector_angle(D1, D2):
- """计算两个向量的夹角"""
- numerator = inner_product(D1, D2)
- denominator = math.sqrt(inner_product(D1,D1)*inner_product(D2,D2))
- return math.acos(numerator/denominator)
- def main():
- if len(sys.argv) != 3:
- print "Usage: docdist.py filename_1 filename_2"
- else:
- filename_1 = sys.argv[1]
- filename_2 = sys.argv[2]
- sorted_word_list_1 = word_frequencies_for_file(filename_1)
- sorted_word_list_2 = word_frequencies_for_file(filename_2)
- distance = vector_angle(sorted_word_list_1, sorted_word_list_2)
- print "The distance between the document is: %0.6f (radians)"%distance
- if __name__ == '__main__':
- main()
Lec02的讲义在这里
MIT6.006Lec02:DocumentDistance的更多相关文章
- MIT6.006Lec03:插入排序,归并排序,递归树
MIT6.006是算法导论课,Lec03主要讲插入排序,归并排序,以及分析方法(递归树)等. 插入排序,可以分为线性插入排序.二分插入排序,区别在于当把数组中某元素插入到前面的有序列表中时,前者遍历, ...
- MIT6.006Lec01:Python实现
MIT6.006是Algo Intro这门课,据说语言使用python Lec01是讲peak finding,也就是峰值点 具体为: 一维情况下一个数组中a[i]>a[i-1]且a[i]> ...
- java web 开发三剑客 -------电子书
Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知In ...
- 所有selenium相关的库
通过爬虫 获取 官方文档库 如果想获取 相应的库 修改对应配置即可 代码如下 from urllib.parse import urljoin import requests from lxml im ...
- MIT6.828准备:MacOS下搭建xv6和risc-v环境
本文介绍在MacOS下搭建Mit6.828/6.S081 fall2019实验环境的详细过程,包括riscv工具链.qemu和xv6,对于Linux系统同样可以参考. 介绍 只有了解底层原理才能写好上 ...
- MIT6.S081/6.828 实验1:Lab Unix Utilities
Mit6.828/6.S081 fall 2019的Lab1是Unix utilities,主要内容为利用xv6的系统调用实现sleep.pingpong.primes.find和xargs等工具.本 ...
- mit-6.828 Lab01:Booting a PC exercise1.1
Lab01:Booting a PC 目录 Lab01:Booting a PC JOS BIOS 背景知识 8086的基本知识 GDB 常用调试指令 Real mode && Pro ...
- [MIT6.006] 22. Daynamic Programming IV: Guitar Fingering, Tetris, Super Mario Bro. 动态规划IV:吉他指弹,俄罗斯方块,超级玛丽奥
之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问 ...
- [MIT6.006] 21. Daynamic Programming III: Parenthesization, Edit Distance, Knapsack 动态规划III:括号问题,编辑距离,背包问题
这节课主要针对字符串/序列上的问题,了解如果使用动态规划进行求解.上节课我们也讲过使用前缀和后缀的概念,他们如下所示: 接下来,我们通过三个问题来深入了解下动态规划使用前缀.后缀和子串怎么去解决括号问 ...
随机推荐
- hdu 6311 欧拉回路
题意:求一个图(不一定联通)最小额外连接几条边,使得可以一笔画出来 大致做法 1.找出联通块 2.统计每一个连通块里面度数为奇数的点的个数, 有一个性质 一个图能够用一笔画出来,奇数点的个数不超过2个 ...
- bzoj 2243
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 8800 Solved: 3305[Submit][Status ...
- bzoj 刷题计划~_~
bzoj 2818 两个互质的数的gcd=1,所以他们同时乘一个素数那么他们的gcd=这个素数,所以枚举素数p找n/p以内有多少对互质数,用欧拉函数. bzoj 2809 可并堆,对于每一个子树显然是 ...
- java基础-System类常用方法介绍
java基础-System类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.System类概念 在API中system类介绍的比较简单,我们给出定义,system中 ...
- angularjs的Controller as
<html ng-app="notesApp"> <head><title>Notes App</title></head&g ...
- highCharts参数实例解释
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- ul标签的高度为0
由于项目中使用ul+li的布局方式,在ie8.chrome浏览器中,包裹浮动的li元素的外层ul高度为0,ie7浏览器和ie8兼容模式显示正常,这是典型的浏览器兼容性问题. 解决办法: 第一种:设置u ...
- ASP.NET 数据库缓存依赖
By Peter A. Bromberg, Ph.D. 在ASP.NET中,Cache类最酷的特点是它能根据各种依赖来良好的控制自己的行为.以文件为基础的依赖是最有用的,文件依赖项是通过使用 Cach ...
- 【BZOJ】4259: 残缺的字符串 FFT
[题意]给定长度为m的匹配串B和长度为n的模板串A,求B在A中出现多少次.字符串仅由小写字母和通配符" * "组成,其中通配符可以充当任意一个字符.n<=3*10^5. [算 ...
- HDU 2058 The sum problem 数学题
解题报告:可以说是一个纯数学题,要用到二元一次和二元二次解方程,我们假设[a,b]这个区间的所有的数的和是N,由此,我们可以得到以下公式: (b-a+1)*(a+b) / 2 = N;很显然,这是一个 ...