文本分析—余弦相似度计算

文本分析—余弦相似度计算

一、余弦相似度简介

欧几里得点积公式:a · b = || a || || b || cosθ

在这里插入图片描述

在这里插入图片描述
我们从图中可以看出,利用两个向量之间夹角的余弦值来代表两个向量之间的差异。
那么对于文本来说,如何将文本转换成可以计算的向量

二、文本余弦相似度

在这里插入图片描述
我们从文本出发,首先需要对文本进行预处理,包括分词、去停用词等等操作,接着将文本进行向量化,这样才可以进行后续的余弦相似度计算。
在这里插入图片描述

三、代码实现
自定义函数法
# -*- coding: utf-8 -*-
import jieba
import numpy as np
import re
 
def get_word_vector(s1,s2): # 将文本转换为词向量
    """
    :param s1: 句子1
    :param s2: 句子2
    :return: 返回句子的余弦相似度
    """
    # 分词
    cut1 = jieba.cut(s1)
    cut2 = jieba.cut(s2)
    list_word1 = (','.join(cut1)).split(',')
    list_word2 = (','.join(cut2)).split(',')
 
    # 列出所有的词,取并集
    key_word = list(set(list_word1 + list_word2))
    # 给定形状和类型的用0填充的矩阵存储向量 初始化矩阵
    word_vector1 = np.zeros(len(key_word))
    word_vector2 = np.zeros(len(key_word))
 
    # 计算词频
    # 依次确定向量的每个位置的值
    for i in range(len(key_word)):
        # 遍历key_word中每个词在句子中的出现次数
        for j in range(len(list_word1)):
            if key_word[i] == list_word1[j]:
                word_vector1[i] += 1
        for k in range(len(list_word2)):
            if key_word[i] == list_word2[k]:
                word_vector2[i] += 1
 
    # 输出向量
    print("s1词向量矩阵:")
    print(word_vector1)
    print("s2词向量矩阵:")
    print(word_vector2)
    return word_vector1, word_vector2 
 
def cos_dist(vec1,vec2):
    """
    :param vec1: 向量1
    :param vec2: 向量2
    :return: 返回两个向量的余弦相似度
    """
    # np.dot()向量点积和矩阵乘法  np.linalg.norm()求范数 
    dist1=float(np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2)))
    return dist1
 
if __name__ == '__main__':
    s1="我爱自然语言处理"
    s2="自然语言处理也爱我"
    vec1,vec2=get_word_vector(s1,s2)
    dist1=cos_dist(vec1,vec2) # 将矩阵传入
    print("两个文本的余弦相似度值为:")
    print(dist1)

首先需要导入需要的第三方库,jieba分词库、numpy、re正则表达式库等。定义需要分析的文本 s1 s2 ,定义get_word_vector(),得到词向量。在get_word_vector()方法中,首先采用jieba的精确模式完成分词,接下来将所有分好词的文本放入列表中,并初始化两个词向量矩阵,接着计算词频,输出词向量矩阵并返回vec1、vec2;将词向量矩阵传入cos_dist()计算余弦相似度,对于这种重复计算,计算机非常擅长,计算完成后,返回余弦相似度值dist1,算法结束!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敷衍zgf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值