【文本相似度】利用余弦相似性计算句子的相似度

好吧,在处理文本的过程中有陷入了一个胡同,不知道接下来该做啥了。于是又在网上找相关的资料,无意间发现了两篇写得超级超级好的博客,是讲文本相似度,之前也学过,但是这两篇博文写得非常棒,深入浅出。然后也按照博文进行了代码实现,在此记录下,也作为文本相似度相关文章的第一篇。

1 功能分析

通过词频和余弦相似性定理计算句子间的相似度,具体理论讲解见上面提到的两篇博文。
1、TF-IDF与余弦相似性的应用(一):自动提取关键词
2、TF-IDF与余弦相似性的应用(二):找出相似文章

2 代码实现

根据上面博文的讲解,写了一个简单的程序,代码如下,涉及到的余弦定理的计算和角度计算见参考资料。

#-*- coding: UTF-8 -*-
# @Time    : 2018/3/23 19:39
# @Author  : beibei
# @Site    : 
# @File    : 利用余弦相似性计算句子的相似度.py
# @Software: PyCharm

import sys
import jieba
import numpy as np
def compete_similar(sen1,sen2):
    # 1分词
    sege1=jieba.cut(sen1)
    wordlist_1=[word for word in sege1]
    sege2=jieba.cut(sen2)
    wordlist_2=[word for word in sege2]
    # 2列出所有的词、
    word_dict=[]
    for word in wordlist_1:
        # 如果当前词没有加入词汇表,则将该词加入词汇表
        if word not in word_dict:
            word_dict.append(word)
        else:
            continue
    for word in wordlist_2:
        if word not in word_dict:
            word_dict.append(word)
        else:
            continue
    # 3计算词频、4写出词频向量
    word_count_1={}
    word_count_2={}
    word_count_vec_1=[]
    word_count_vec_2=[]
    # 对于词汇表中的每一个词,统计他在每句话中出现的次数
    for word in word_dict:
        num1=sen1.count(word)
        num2=sen2.count(word)
        word_count_1[word]=num1
        word_count_2[word]=num2
        word_count_vec_1.append(num1)
        word_count_vec_2.append(num2)

    # 计算相似度
    vec_1=np.array(word_count_vec_1)
    vec_2=np.array(word_count_vec_2)
    one_dot_two=np.dot(vec_1,vec_2)
    L1=np.sqrt(np.dot(vec_1,vec_1))
    L2=np.sqrt(np.dot(vec_2,vec_2))
    # 余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。
    cos_angle=one_dot_two/(L1*L2)
    angle_pi=np.arccos(cos_angle)
    angle=angle_pi*360/2/np.pi
    return angle


# 提示参数问题
def usage():
    print (sys.argv[0], " first sentence"," second sentence")

#程序的入口函数
if __name__ == '__main__':
    arg_len = len(sys.argv)
    # 判断参数是否正确!
    if arg_len!=3:
        usage()
        sys.exit(-1)
    # 获取两句话
    sentence1=sys.argv[1]
    sentence2=sys.argv[2]
    # 计算相似性
    result=compete_similar(sentence1,sentence2)
    # 输出结果
    print(result)

运行结果为:

Prefix dict has been built succesfully.
19.1066053509

3 参考资料

1、python 线性代数:[14]计算向量夹角


文章作者: IrvingBei
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 IrvingBei !
评论
 上一篇
利用php的curl实现post和get请求 利用php的curl实现post和get请求
由于项目需求,进行了一段时间的微信开发。在微信开发的过程中,经常调用微信接口,通常是向微信服务器发送get或者post请求获取接口。下面给出两个具体的实现过程。 1、发送post请求function curl_post($url,$data
2018-06-08
下一篇 
d2 机器学习和深度学习资料 d2 机器学习和深度学习资料
为了保存资料,于是上传至博客。 机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)注:机器学习资料篇目一共500条,篇目二开始更新希望转载的朋友,你可以不用联系我.但是一定
2018-01-24
  目录