MIT6.006Lec02:DocumentDistance

简介: MIT6.006是算法导论,Lec02讲的是Document Distance(文档距离),比如比较两个文档相似度或者搜索引擎中都会用到。 计算步骤为: 1.将每个文档分离为单词 2.统计词频 3.计算点积(并做除法) 说明: 1.“单词”指的是字母和数字(alphanumeric) 2.每个文档统计完词频后得到的list,可看作一个向量 3.两个文档间的相似度,是相似的单词除以总的单词,类似于两个向量的夹角公式   MIT6.006下载的相关资源中,给出了8个逐渐改善的代码版本,但本质都是一样的。

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的讲义在这里 

目录
相关文章
|
Java 大数据 API
用上myexcel,百万数据导出也不怕
用上myexcel,百万数据导出也不怕
493 0
|
程序员 人工智能 Serverless
通义灵码保姆级教程:官网、安装、使用指南、常见问题、线上活动、官方答疑
通义灵码保姆级教程:官网、安装、使用指南、常见问题、线上活动、官方答疑
21970 1
执行apt-get install xxx 遇到无法定位软件包解决方法
执行apt-get install xxx 遇到无法定位软件包解决方法
4645 0
执行apt-get install xxx 遇到无法定位软件包解决方法
|
Web App开发 前端开发 程序员
将微信公众号文章同步到阿里云开发者社区
本文介绍了一种通过自己拓展的浏览器插件,便捷地将微信公众号文章同步到阿里云开发者社区的方法。
278 6
|
Java 关系型数据库 数据库连接
【MyBatis】初步解析MyBatis:实现数据库交互与关系映射的全面指南
【MyBatis】初步解析MyBatis:实现数据库交互与关系映射的全面指南
1135 1
|
安全 网络虚拟化 数据安全/隐私保护
6. 构建基础 WLAN 网络
6. 构建基础 WLAN 网络
6. 构建基础 WLAN 网络
|
存储 机器学习/深度学习 数据挖掘
利用 Python 中的地理空间数据与 GeoPandas
空间数据由与位置关联的记录组成。这些数据可以来自 GPS 轨迹、地球观测图像和地图。每个空间数据点都可以使用坐标参考系统(如纬度/经度对)精确地放置在地图上,以便在地图上精确放置,这使我们能够研究它们之间的关系。
1054 0
|
Kubernetes 负载均衡 Linux
k8s教程(service篇)-概念和原理(上)
k8s教程(service篇)-概念和原理(上)
441 0
|
前端开发 内存技术
11 个非常棒的按钮制作工具
CSS Tricks 一个神话般用来创建高度自定义的按钮工具。它可以让你选择渐变颜色,边框,为您的网页的完全独特的按钮悬停背景等。 CSS Tricks Da Button Factory 你只需要通过点击就可以生成很酷的按钮的超强工具,功能包括按钮字体、样式和颜色设置 Da Button Factory Filetransit Filetransit 是一个在线工具,用来创建网页菜单,可帮你设置文本颜色和按钮颜色 Filetransit Tucows Tucows 包含一个按钮生成器,可生成多个按钮图片,主要用于网页、展示等。
1027 0
|
人工智能 达摩院 自然语言处理
覆盖200+服务场景,阿里「通义」大模型系列打造国内首个AI统一底座(2)
覆盖200+服务场景,阿里「通义」大模型系列打造国内首个AI统一底座
3690 0

热门文章

最新文章