分词词向量余弦相似度

  • Post author:
  • Post category:其他


说白了,就是所有的计算都要转换成数字,首先分词,词集合,转换成ID,然后匹配即可,这种模式比较粗糙。

词向量余弦

词向量余弦算法,是将文本作为一个多维空间的向量,计算两个文本的相识度即计算判断两个向量在这个多维空间中的方向是否是一样的。而这个多维空间的构成是通过将文本进行分词,每个分词代表空间的一个维度。

下面通过例子来说明多维空间的构成即词向量问题。比如要计算如下两个短文本的相识度:

文本一:天气预报说,明天会下雨,你明天早上去上班的时候记得带上伞。

文本二:你明天早上去上班的时候记得带上伞,天气预报说的可能会下雨。

首先我们利用某种分词方法将文本进行分词,如下:

这里不考虑标点符号,当然也可以涵盖

文本一分词:[天气 预报 说 明天 会 下雨 你 明天 早上 去 上班 的 时候 记 得 带 上 伞]

文本二分词:[你 明天 早上 去 上班 的 时候 记 得 带 上 伞 天气 预报 说 的 可能会 下 雨]

多维空间的词集合如下:

[天气 你 的 带 可能会 雨 上班 上 下 早上 时候 记 预报 说 明天 下雨 得 会 去 伞]

这是便可以得出连个文本在这个词集合构建的多维空间的词向量。

文本一的词向量:[1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1 ]

文本二的词向量:[1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1]

词向量得到了,这是便可以根据词向量余弦的公式计算出相似度值了,公式如下:

计算出的相似度值为: similarity = 0.8295150620062532

由余弦定理可知,cosine值的范围为[0,1],越趋近于1时两个向量的夹角越小,也代表两个文本越相似,

我们在做推荐或者信息检索任务时经常需要比较项目嵌入和项目嵌入之间或者用户嵌入和项目嵌入之间的相似度,然后进行推荐。余弦相似度的计算公式如下:

余弦相似度cosine similarity和余弦距离cosine distance是相似度度量中常用的两个指标,我们可以用sklearn.metrics.pairwise下的cosine_similarity和paired_distances函数分别计算两个向量之间的余弦相似度和余弦距离,效果如下:

import numpy as np

from sklearn.metrics.pairwise import cosine_similarity, paired_distances

x = np.array([[0.26304135, 0.91725843, 0.61099966, 0.40816231, 0.93606288, 0.52462691]])

print(x)

y = np.array([[0.03756129, 0.50223667, 0.66529424, 0.57392135, 0.20479857, 0.27286363]])

print(y)



余弦相似度

simi = cosine_similarity(x, y)

print(‘cosine similarity:’, simi)



余弦距离 = 1 – 余弦相似度

dist = paired_distances(x, y, metric=‘cosine’)

print(‘cosine distance:’, dist)

这里可以看到,余弦相似度 + 余弦距离 = 1。

我们试一下用cosine_similarity和paired_distances函数分别计算多个向量与一个向量的余弦相似度和余弦距离,效果如下:

import numpy as np

from sklearn.metrics.pairwise import cosine_similarity, paired_distances

x = np.array([[0.26304135, 0.91725843, 0.61099966, 0.40816231, 0.93606288, 0.52462691], [0.26304135, 0.91725843, 0.61099966, 0.40816231, 0.93606288, 0.52462691]])

print(x)

y = np.array([[0.03756129, 0.50223667, 0.66529424, 0.57392135, 0.20479857, 0.27286363]])

print(y)



余弦相似度

simi = cosine_similarity(x, y)

print(‘cosine similarity:’, simi)



余弦距离 = 1 – 余弦相似度

dist = paired_distances(x, y, metric=‘cosine’)

print(‘cosine distance:’, dist)

亲测有效的方法:

1、余弦相似性(cosine)

(1)使用sklearn中的向量相似性的计算包,代码如下:

  这个函数的输入是n个长度相同的list或者array,函数的处理是计算这n个list两两之间的余弦相似性,最后生成的相似矩阵中的s[i][j]表示的是原来输入的矩阵中的第i行和第j行两个向量的相似性,所以生成的是n*n的相似性矩阵

from sklearn.metrics.pairwise import cosine_similarity

s = cosine_similarity([[1, 0, 0, 0]], [[1, 0, 0, 0]])

print(s)

输出:

[[1.]]

(2)使用scipy包中的距离计算,代码如下:

    这里的vec1和vec2都是一维的array向量。

from scipy.spatial.distance import cosine

vec1 = [1, 2, 3]

vec2 = [2, 3, 4]

s = cosine(vec1, vec2)

print(s)

0.007416666029069763

2、皮尔森相关系数(pearson)

from scipy import stats

import numpy as np

a = np.array([0, 0, 0, 1, 1, 1, 1])

b = np.arange(7)

s1 = stats.pearsonr(a, b)

s2 = stats.pearsonr([1,2,3,4,5], [5,6,7,8,7])

print(“s1:”, s1)

print(“s2:”, s2)

s1: (0.8660254037844387, 0.011724811003954626)

s2: (0.8320502943378438, 0.08050957329849848)

前面的0.866025和0.862050即为所要求的相关系数,具体用法参见:scipy.stats.pearsonr

3、欧式距离

    欧式距离,即欧几里得距离,这里的计算有三种方式:

    (1)已知vec1和vec2是两个Numpy array,即数组,使用numpy包计算:

import numpy

a = numpy.array([0, 0, 0, 1, 1, 1, 1])

b = numpy.arange(7)

dist = numpy.sqrt(numpy.sum(numpy.square(a – b)))

print(dist)

dist: 7.681145747868608

    (2)也是使用numpy包,相对更加直接,代码如下:

import numpy

a = numpy.array([0, 0, 0, 1, 1, 1, 1])

b = numpy.arange(7)

dist = numpy.linalg.norm(a – b)

print(“dist:”, dist)

dist: 7.681145747868608

    (3) 使用sklearn中的向量相似性的计算包,这个没有具体使用,就不贴代码了。

import numpy

a=[1,2,3,1,4,5,5846,464,64,456,456,4]

print(a)

b=numpy.array(a).reshape(len(a),1) # reshape(列的长度,行的长度)

print(b) #转换为二维矩阵

print(‘b的形状是’+numpy.shape(b)) #12行1列

keys = [‘a’, ‘b’, ‘c’]

values = [1, 2, 3]

dictionary = dict(zip(keys, values))

print dictionary

“””

输出:

{‘a’: 1, ‘c’: 3, ‘b’: 2}

“””

[numpy] ndarray 与 list 互相转换

豆腐羲羲 2018-05-19 13:29:20 136354 收藏 32

分类专栏: numpy

版权

list 转 numpy

np.array(a)

ndarray 转 list

a.tolist()



版权声明:本文为qq_15821487原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。