zoukankan      html  css  js  c++  java
  • 余弦相似度

    转载自: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
  • 相关阅读:
    如何保存一张网页上的图片(C#)到本地计算机上
    SQL Server2005常用基本管理操作
    C#保存图片到数据库,读取图片显示
    简析正则表达式
    HDU 变形课
    HDU 1272 小希的迷宫
    HDU 1856 More is better
    POJ 1269 Intersecting Lines
    HDU Football Score
    HDU 1213 How Many Tables
  • 原文地址:https://www.cnblogs.com/i80386/p/3225316.html
Copyright © 2011-2022 走看看