余弦相似文本算法——python实现

        在地址匹配过程中,由于不同的数据源,地理坐标存在不少差异,但我们可以通过文本相似度去比较。越相似越说明两个地址是一样的。文本相似度算法很多,作为刚入门的一员,选择从余弦先入手,余弦通过向量公式计算应该是我们中学时代最熟的一个公式之一,选择它入门相对好理解些。

        两个文本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

 

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兰小莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值