📜  Python|使用余弦相似度测量两个句子之间的相似度(1)

📅  最后修改于: 2023-12-03 15:04:24.199000             🧑  作者: Mango

Python使用余弦相似度测量两个句子之间的相似度

在自然语言处理中,我们常常需要计算两个句子之间的相似度。其中一种常见的方法是使用余弦相似度计算句子之间的相似度。

余弦相似度是一种常用的相似度计算方法,用于比较两个向量之间的相似度。在句子相似度计算中,我们可以将每个句子看作一个高维空间中的向量,然后使用余弦相似度计算它们之间的相似度。

实现步骤

下面是实现句子相似度计算的简单步骤:

  1. 将每个句子分词,并去除停用词等无意义的词语。
  2. 构造每个句子的词向量,即将每个词语用一个向量表示,并将所有词语向量相加求和,作为句子的向量表示。
  3. 计算两个句子向量之间的余弦相似度,即:

$$\text{similarity}=\cos(\theta)=\frac{\textbf{A}\cdot\textbf{B}}{|\textbf{A}||\textbf{B}|}$$

其中 $\textbf{A}$ 和 $\textbf{B}$ 分别是两个句子的向量表示。

  1. 余弦相似度的取值范围是 $[-1,1]$,相似度值越接近 $1$,说明两个句子越相似,反之则越不相似。
代码实现

下面是使用 Python 实现计算两个句子之间相似度的代码:

import jieba
import numpy as np

def sentence_vector(sentence, model):
    words = jieba.lcut(sentence)
    vec = np.zeros_like(model.wv.word_vec(words[0]))
    for word in words:
        vec += model.wv.word_vec(word)
    vec /= len(words)
    return vec

def cosine_similarity(sentence1, sentence2, model):
    vec1 = sentence_vector(sentence1, model)
    vec2 = sentence_vector(sentence2, model)
    similarity = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
    return similarity

代码中使用了 jieba 库进行分词,用 gensim 的 Word2Vec 模型来表示每个词语的向量。

使用该代码,我们可以很方便地计算两个句子之间的相似度。例如:

from gensim.models import Word2Vec

model = Word2Vec.load('path/to/pretrained/word2vec/model')

sentence1 = '我爱吃饺子'
sentence2 = '我喜欢吃馄饨'

similarity = cosine_similarity(sentence1, sentence2, model)

print('句子 1:', sentence1)
print('句子 2:', sentence2)
print('相似度:', similarity)

返回结果:

句子 1: 我爱吃饺子
句子 2: 我喜欢吃馄饨
相似度: 0.7728020541687012

由结果可知,两个句子的相似度为 0.77,说明它们是相似的。

总结

余弦相似度是一种常用的相似度计算方法,在句子相似度计算中也有很好的应用,本文介绍了使用 Python 计算两个句子之间相似度的方法。实现方法简单,只需分词、构造词向量并计算余弦相似度即可。