python实现的文本相似度算法(余弦定理)

    只对汉字进行相似度分析,以单个字为向量,然后每个字在章节中出现的次数,便是以此字向量的值。现在我们假设:

  • 章节1中出现的字为:Z1c1,Z1c2,Z1c3,Z1c4……Z1cn;它们在章节中的个数为:Z1n1,Z1n2,Z1n3……Z1nm

  • 章节2中出现的字为:Z2c1,Z2c2,Z2c3,Z2c4……Z2cn;它们在章节中的个数为:Z2n1,Z2n2,Z2n3……Z2nm

其中,Z1c1和Z2c1表示两个文本中同一个字,Z1n1和Z2n1是它们分别对应的个数,

最后我们的相似度可以这么计算:

代码如下:

#_*_encoding:utf-8_*_
import math
import time

#---------------------------------------------------------------
# 文本相似度计算
# 值0-1, 越靠近1越相似
#---------------------------------------------------------------
def Similarity(s1, s2):
	'''
	相似度计算,输入必须为unicode编码,且不为空
	仅计算汉字
	'''
	#汉字U编码 4E00-9FA5
	tmp = {}
	for i in s1:
		a = ord(i)
		if 0x4DFF<a<0x9FA6:
			try:
				tmp[a][0] = tmp[a][0] + 1
			except:
				tmp[a] = [1, 0]

	for i in s2:
		a = ord(i)
		if 0x4DFF<a<0x9FA6:
			try:
				tmp[a][1] = tmp[a][1] + 1
			except:
				tmp[a] = [0,1]
	
	a1 = 0
	a2 = 0
	a3 = 0
	if len(tmp)>0:
		for i in tmp:
			a1 += tmp[i][0] * tmp[i][1]
			a2 += tmp[i][0] * tmp[i][0]
			a3 += tmp[i][1] * tmp[i][1]
	else:
		return 0
	return a1 / math.sqrt(a2 * a3)
	
	


你可能感兴趣的:(python实现的文本相似度算法(余弦定理))