转载自:http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html
评:作者写的通俗易懂。实在不需要改进了,一下仅仅是加深个人印象,便于个人记忆。
第一步:分词
句子A:我/喜欢/看/电视,不/喜欢/看/电影。
句子B:我/不/喜欢/看/电视,也/不/喜欢/看/电影。
我,喜欢,看,电视,电影,不,也。
第三步:计算词频
句子A:我 1,喜欢 2,看 2,电视 1,电影 1,不 1,也 0。
句子B:我 1,喜欢 2,看 2,电视 1,电影 1,不 2,也 1。
第四步:写出词频向量
句子A:[1, 2, 2, 1, 1, 1, 0]
句子B:[1, 2, 2, 1, 1, 2, 1]
问题转化为,计算向量相似度:
高维向量的空间解释:都是从[0, 0, 0, 0, ...]出发,指向不同方向
0度,完全重合
90度,完全不相似
180度,完全相反
理论:通过夹角的大小来判断向量的相似度,夹角越小就越相似
附:python计算余弦相似度
__author__ = 'dell' import math a = [1, 2, 2, 1, 1, 1, 0] b = [1, 2, 2, 1, 1, 2, 1] dot = [0 for i in range(len(a))] for i in range(len(a)): dot[i] = a[i] * b[i] n = sum(dot) sum_a = math.sqrt(sum([i ** 2 for i in a])) sum_b = math.sqrt(sum([i ** 2 for i in b])) res = n / (sum_a * sum_b) print res def SimCosine(a, b): dot = [0 for i in range(len(a))] for i in range(len(a)): dot[i] = a[i] * b[i] sum_a = math.sqrt(sum([i ** 2 for i in a])) sum_b = math.sqrt(sum([i ** 2 for i in b])) res = sum(dot) / (sum_a * sum_b) return res res = SimCosine(a, b) print res
运行的结果:
C:Python27python.exe F:/Statis/Cosine.py 0.938194187433 0.938194187433