【Educoder数据挖掘实训】用Cosine计算相似度
开挖挖挖挖
这个题目跟上一个实训很类似,区别在于本关旨在计算文本的相似度。
这里虽然说的是文本相似度但是却没有提及顺序的问题,比如否定句“不喜欢”和疑问句“喜欢不”在本实训中认为是完全相同的。
首先计算方式是基于
j
i
e
b
a
jieba
jieba库中的函数
j
i
e
b
a
.
c
u
t
jieba.cut
jieba.cut,把句子拆分成不同的单词,喜欢不和不喜欢都会被拆分成“不”和“喜欢”。
然后将两个句子的词取并集作为词库,而后进行数量统计。
最后用
c
o
s
i
n
e
cosine
cosine计算相似度即可。
计算公式为:
c
o
s
=
x
1
∗
服务器托管网 x
2
+
y
1
∗
y
2
x
1
2
+
y
1
2
x
2
2
+
y
2
2
cos = frac{x_1*x_2 + y_1 * y_ 2}{sqrt{x_1^2 +y_1^2}sqrt{x_2^2 + y_2^2}}
cos=x12+y12
x22+y22
x1∗x2+y1∗y2
代码如下:
import numpy as np
import jieba
def cosine_similarity(sentence1: str, sentence2: str) -> float:
#1.实现文本分词
########## Begin ##########
seg1 = [word for word in jieba.cut(sentence1)]
seg2 = [word for word in jieba.cut(sentence2)]
########## End ##########
#2.建立词库
########## Begin ##########
word_list = list(set([word for word in seg1 + seg2]))#建立词库
########## End ##########
word_count_vec_1 = []
word_count_vec_2 = []
for word in word_list:
#3.统计各个文本在词典里出现词的次数
########## Begin ##########
wor服务器托管网d_count_vec_1.append(seg1.count(word))
word_count_vec_2.append(seg2.count(word))
########## End ##########
vec_1 = np.array(word_count_vec_1)
vec_2 = np.array(word_count_vec_2)
#4.余弦公式
########## Begin ##########
num = vec_1.dot(vec_2.T)
denom = np.linalg.norm(vec_1) * np.linalg.norm(vec_2)
cos = num / denom
########## End ##########
return cos
str1="湖南是一个好地方"
str2="湖南好吃的在哪里"
sim1=cosine_similarity(str1,str2)
print(sim1)
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net