前言
还记得你在高中时是如何计算向量乘积的吗?
背景
在做数据分析的时候,经常会出现名字匹配的场景。如果两个名称相同,则很容易处理。如果两个名字不同,一个叫老王,一个叫王,或者一个叫小兔兔,一个叫小白兔,那就不好办了。 .
原则
两个字符串,虽然可以比较,但是s不能计算。只能计算数字和向量。如果将字符串映射到数字,则会丢失很多功能。毕竟,数字是一维的。自然地,我们想到将字符串映射成向量音乐,并通过计算它们之间的角度来判断两个向量。字符串相似度
文本矢量化
比如有两个字符串,'Little Rabbit','Little Rabbit';将字符串一一拆分成元素进行并集unity c# 查询列表 字符串相似度排序,得到 {'Little', 'Rabbit', 'Child'} ,以这个并集为基,然后在这个基下unity c# 查询列表 字符串相似度排序,
'小兔子'的坐标是 (1, 1, 1)
'小兔子'的坐标是(1, 2, 0)
这样对文本进行向量化可以保存字符串中的大部分信息创作人,但也会丢失信息,比如字符串中元素的顺序
代码
#定义向量乘积
def vec_multi(vec1 , vec2):
add = 0
for a,b in zip(vec1,vec2):
add += (a*b)
return add
#定义相似度
def Similarity(name1,name2):
name1_list = list(name1)
name2_list = list(name2)
#求可表示两个字符串的基
a1 = set(name1)
a2 = set(name2)
name_list.extend(list(name2))
all_set = a1 | a2
all_set_list = list(all_set)
#文本向量化
name1_vec = [0]*len(all_set_list)
for word in name1_list:
if word in all_set_list:
name1_vec[all_set_list.index(word)] += 1
name2_vec = [0]*len(all_set_list)
for word in name2_list:
if word in all_set_list:
name2_vec[all_set_list.index(word)] += 1
cosvec = vec_multi(name1_vec , name2_vec) / ((vec_multi(name1_vec , name1_vec)*vec_multi(name2_vec , name2_vec))**0.5)
if cosvec>=0.5:
print("两个名字很相似,相似度为:%.2f%%" %(cosvec*100))
else:
print("两个名字不相似,相似度为:%.2f%%" %(cosvec*100))
测试
总结