在地址匹配过程中,由于不同的数据源,地理坐标存在不少差异,但我们可以通过文本相似度去比较。越相似越说明两个地址是一样的。文本相似度算法很多,作为刚入门的一员,选择从余弦先入手,余弦通过向量公式计算应该是我们中学时代最熟的一个公式之一,选择它入门相对好理解些。
两个文本cos计算从我的算法步骤说主要有4个:1、对两个文本进行分词,分词我用jieba分词的。2、获取两个文本所有的分词可能。3、计算词频将词频向量化。4、计算cos值。以下是具体算法实现:
import jieba
import numpy
import math
#分词
def divided(a,b):
a1=jieba.cut(a)
b1=jieba.cut(b)
list_a=[]
list_b=[]
for i in a1:
list_a.append(i)
for j in b1:
list_b.append(j)
return list_a,list_b
#获取所有的分词可能
def get_all_words(list_a,list_b):
all_words=[]
for i in list_a:
if(i not in all_words):
all_words.append(i)
for j in list_b:
if(j not in all_words):
all_words.append(j)
return all_words
#词频向量化
def get_word_vector(list_a,list_b,all_words):
la=[]
lb=[]
for word in all_words:
la.append(list_a.count(word))
lb.append(list_b.count(word))
return la,lb
#计算余弦值,利用了numpy中的线代计算方法
def calculate_cos(la,lb):
laa=numpy.array(la)
lbb=numpy.array(lb)
cos=(numpy.dot(laa,lbb.T))/((math.sqrt(numpy.dot(laa,laa.T)))*(math.sqrt(numpy.dot(lbb,lbb.T))))
return cos
if __name__=='__main__':
list_a,list_b=divided("河北地质大学","河北石家庄河北地质大学")
all_words=get_all_words(list_a,list_b)
for i in all_words:
print (i)
laa,lbb=get_word_vector(list_a,list_b,all_words)
print (laa,lbb)
cos=calculate_cos(laa,lbb)
print (cos)
—————————————————————————————————————————————————————————————————————————————————————————
河北
地质
大学
石家庄
[1, 1, 1, 0] [2, 1, 1, 1]
0.872871560944