python余弦定理计算相似度

# -*- coding: utf-8 -*-
import jieba
import jieba.analyse
import math

def sentence_resemble():
    ‘‘‘
    计算两个句子的相似度:
        1,将输入的两个句子分词
        2,求分词后两句子的并集(去重)
        3,计算两句子各自词频
        4,求词频向量
        5,套用余弦定理公式求出相似度
    余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"
    :return:
    ‘‘‘
    str1="我喜欢看电视,不喜欢看电影"
    str2="我不喜欢看电视,也不喜欢看电影"

    # 结巴分词,得到去掉逗号的数组
    str1 = jieba.cut(str1)
    str1 = ",".join(str1)
    str1_array = str1.split(",")
    str1_array.remove(u",")

    str2 = jieba.cut(str2)
    str2 = ",".join(str2)
    str2_array = str2.split(",")
    str2_array.remove(u",")

    # 求分词后两句子的并集(去重)
    all_array = list(set(str1_array+str2_array))
    all = sorted(all_array)

    # 计算两句子各自词频
    str1_num_dic = num_count(str1_array)
    str2_num_dic = num_count(str2_array)
    # 套用余弦定理公式求出相似度
    cos = resemble_cal(all,str1_num_dic,str2_num_dic)
    print cos

def num_count(a):
    d = {k: a.count(k) for k in set(a)}
    return d

def article_resemble():
    all_key=set()
    with open("article_1.txt","r") as f:
        lines = f.readlines()
    lines = "".join(lines)
    article1_dic = analyse_word(lines)
    for k,v in article1_dic.items():
        all_key.add(k)

    with open("article_2.txt","r") as f:
        article2_lines = f.readlines()
        article2_lines = "".join(article2_lines)
    article2_dic = analyse_word(article2_lines)
    for k,v in article2_dic.items():
        all_key.add(k)

    cos = resemble_cal(all_key,article1_dic,article2_dic)
    print cos

def resemble_cal(all_key,article1_dic,article2_dic):
    str1_vector=[]
    str2_vector=[]
    # 计算词频向量
    for i in all_key:
        str1_count = article1_dic.get(i,0)
        str1_vector.append(str1_count)
        str2_count = article2_dic.get(i,0)
        str2_vector.append(str2_count)

    # 计算各自平方和
    str1_map = map(lambda x: x*x,str1_vector)
    str2_map = map(lambda x: x*x,str2_vector)

    str1_mod =  reduce(lambda x, y: x+y, str1_map)
    str2_mod = reduce(lambda x, y: x+y, str2_map)

    # 计算平方根
    str1_mod = math.sqrt(str1_mod)
    str2_mod = math.sqrt(str2_mod)

    # 计算向量积
    vector_multi = reduce(lambda x, y: x + y, map(lambda x, y: x * y, str1_vector, str2_vector))

    # 计算余弦值
    cos = float(vector_multi)/(str1_mod*str2_mod)
    return cos

‘‘‘
文章关键词提取
‘‘‘
def analyse_word(content):
    zidian={}
    return_dic={}
    # 内容分词
    fenci = jieba.cut_for_search(content)
    for fc in fenci:
        if fc in zidian:
            zidian[fc] += 1
        else:
            zidian[fc] = 1
    topK=30
    # 关键词  比率
    tfidf = jieba.analyse.extract_tags(content, topK=topK,withWeight=True)
    stopkeyword = [line.strip() for line in open(‘stop.txt‘).readlines()]
    for word_weight in tfidf:
        if word_weight in stopkeyword:
            continue
        frequence = zidian.get(word_weight[0], ‘not found‘)
        return_dic[word_weight[0]]=frequence
    return return_dic

if __name__=="__main__":
    # 比较两句子相似度
    sentence_resemble()
    # 比较两篇文章相似度
    article_resemble()
时间: 2024-12-09 18:59:07

python余弦定理计算相似度的相关文章

使用余弦定理计算两篇文章的相似性

使用余弦定理计算两篇文章的相似性:(方法论,细致易懂版) http://blog.csdn.net/dearwind153/article/details/52316151 python 实现(代码): http://outofmemory.cn/code-snippet/35172/match-text-release (结巴分词下载及安装:http://www.cnblogs.com/kaituorensheng/p/3595879.html) java 实现(代码+方法描述): https

模式识别之相似度计量---余弦计算相似度度量关于两句话的相似度

余弦计算相似度度量 相似度度量(Similarity),即计算个体间的相似程度,相似度度量的值越小,说明个体间相似度越小,相似度的值越大说明个体差异越大. 对于多个不同的文本或者短文本对话消息要来计算他们之间的相似度如何,一个好的做法就是将这些文本中词语,映射到向量空间,形成文本中文字和向量数据的映射关系,通过计算几个或者多个不同的向量的差异的大小,来计算文本的相似度.下面介绍一个详细成熟的向量空间余弦相似度方法计算相似度 向量空间余弦相似度(Cosine Similarity) 余弦相似度用向

Python TF-IDF计算100份文档关键词权重

上一篇博文中,我们使用结巴分词对文档进行分词处理,但分词所得结果并不是每个词语都是有意义的(即该词对文档的内容贡献少),那么如何来判断词语对文档的重要度呢,这里介绍一种方法:TF-IDF. 一,TF-IDF介绍 TF-IDF(Term Frequency–Inverse Document Frequency)是一种用于资讯检索与文本挖掘的常用加权技术.TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的重要性随着它在文件中出现的次数成正比增加,

Python科学计算之Pandas

Reference: http://mp.weixin.qq.com/s?src=3&timestamp=1474979163&ver=1&signature=wnZn1UtWreFWjQbpWweZXp6RRvmmKwW1-Kud3x6OF0czmyPqv*F6KzQ1i-dKhi4D-QvDjp1mFDdqAHLPrCLgMOb1KXJcbbkU5-QAREDarkCaPumjQlORzVAOma541S0X2MGgysuH18DI2567rBcTSkMHPsVf6sxClfB

windows下安装python科学计算环境,numpy scipy scikit等

背景: 目的:要用Python下的DBSCAN聚类算法. scikit-learn 是一个基于SciPy和Numpy的开源机器学习模块,包括分类.回归.聚类系列算法,主要算法有SVM.逻辑回归.朴素贝叶斯.Kmeans.DBSCAN等,目前由INRI 资助,偶尔Google也资助一点. SciPy是一个开源的Python算法库和数学工具包,SciPy包含的模块有最优化.线性代数.积分.插值.特殊函数.快速傅里叶变换.信号处理和图像处理.常微分方程求解和其他科学与工程中常用的计算.其功能与软件MA

余弦方法计算相似度算法实现

http://blog.csdn.net/cscmaker/article/details/7990600 余弦方法计算相似度算法实现 (1)余弦相似性 通过测量两个向量之间的角的余弦值来度量它们之间的相似性.0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1.从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向.所以,它通常用于文件比较. 详见百科介绍(点击打开链接) (2)算法实现的中未使用权重(IDF ---逆文档频率),使用词项的出现次数作为向量空间的值

基于谷本系数计算相似度

//这段程序写的是忽略偏好值基于谷本系数计算相似度 //这个算法是基于谷本系数. //这个值也叫做Jaccard系数,由两个用户共同表达过偏好的物品数目除以至少 //一个用户表达过偏好的物品数目而得(就是两者得交集除以两者得并集) package byuser; import java.io.File; import java.io.IOException; import org.apache.mahout.cf.taste.common.TasteException; import org.a

Mahout基于对数似然比更好的计算相似度

//基于对数似然比更好的计算相似度(量用户) //所谓对数似然比为选取两个用户进行比较的时后进行筛选 //相似性为可以解释为发生重叠为发生重叠的非偶然概率 package byuser; import java.io.File; import java.io.IOException; import org.apache.mahout.cf.taste.common.TasteException; import org.apache.mahout.cf.taste.eval.Recommender

python科学计算

windows下python科学计算库的下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/(由于C运行库的问题,scipy在linux下可以用pip安装,而windows下不行) matpoltlib:绘图 numpy:矩阵运算 scipy:科学计算,高阶抽象和物理模型 sklearn:科学计算,多种聚类算法. 数据拟合:http://blog.csdn.net/lsldd/article/details/41251583 遗传算法:http://bl