python实现文本相似度排名计算

这篇具有很好参考价值的文章主要介绍了python实现文本相似度排名计算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

   项目中,客户突然提出需要根据一份企业名单查找对应的内部系统用户信息,然后根据直接的企业社会统一信用号和企业名称进行匹配,发现匹配率只有2.86%,低得可怜。所以根据客户的要求,需要将匹配率提高到70-80%左右,于是开始了折腾之路。

    上网一查,各种相似度的算法供选择,简直是眼花缭乱,感叹现在python发展的强大,需要做什么研究都能快速运用上各种算法库,找到的算法有:

1、欧几里得距离(Eucledian Distance)
欧氏距离是最常用的距离计算公式,衡量的是多维空间中各个点之间的绝对距离。

2、曼哈顿距离(Manhattan Distance)
曼哈顿距离依赖坐标系统的转度,而非系统在坐标轴上的平移或映射,他是使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。

3.切比雪夫距离
在数学中,切比雪夫距离(Chebyshev distance)或是L∞度量,是向量空间中的一种度量,二个点之间的距离定义是其各坐标数值差绝对值的最大值。以数学的观点来看,切比雪夫距离是由一致范数(uniform norm)(或称为上确界范数)所衍生的度量,也是超凸度量(injective metric space)的一种。 
4、明可夫斯基距离(Minkowski distance)
明氏距离是欧氏距离的推广。闵氏距离不是一种距离,而是一组距离的定义。闵氏距离的定义:两个n维变量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:
其中p是一个变参数。
当p=1时,就是曼哈顿距离
当p=2时,就是欧氏距离
当p→∞时,就是切比雪夫距离
根据变参数的不同,闵氏距离可以表示一类的距离。
5、词袋模型 6、TF-IDF 7、余弦相似度8、Python自带比较相似度函数difflib.SequenceMatcher 9、word2vec 10、JS距离 11、simtext 等等... ...

然后最后我们采用的是 Levenshtein,Levenshtein Distance是一个度量两个字符序列之间差异的字符串度量标准,两个单词之间的Levenshtein Distance是将一个单词转换为另一个单词所需的单字符编辑(插入、删除或替换)的最小数量。Levenshtein Distance是1965年由苏联数学家Vladimir Levenshtein发明的。Levenshtein Distance也被称为编辑距离(Edit Distance)。
 安装对应的库

# conda install python-Levenshtein
# pip install python-Levenshtein

计算字符串的相似度

汉明距离,要求str1和str2必须长度一致。是描述两个等长字串之间对应位置上不同字符的个数。

编辑距离,也称为Levenshtein距离,描述由一个字串转化成另一个字串最少的操作次数,在其中的操作包括插入、删除、替换。

莱文斯坦比,计算公式 r = (sum - ldist) / sum, 其中sum是指str1 和 str2 字串的长度总和,ldist是类编辑距离
注意:这里的类编辑距离不是2中所说的编辑距离,2中三种操作中每个操作+1,而在此处,删除、插入依然+1,但是替换+2
这样设计的目的:ratio(‘a’, ‘c’),sum=2,按2中计算为(2-1)/2 = 0.5,’a’,'c’没有重合,显然不合算,但是替换操作+2,就可以解决这个问题。
 

在实际操作中,我们应用了莱文斯坦比来给不同的企业名称打分

第一步:剔除高频词,由于通过企业名称精确匹配发现很难匹配到对应的用户名称,那么很有可能这份企业名单中的企业名称不是那么符合规范也可能更改了其他后缀、前缀,所以通过剔除高频词之后,再进行模糊匹配。

#region 第一步
        excelname = '*******.xlsx'
        LoadPath = excelname  #加载excel路径(这里为相对路径,excel表与该程序在同一文件夹下就能识别,所以只用excel文件名即可)
        #excel表格初始化
        book=load_workbook(LoadPath, data_only=True)#加载已有Excel文档
        
        sheet_current_week_result=book['sheet1']#加载需要的工作簿(这里为excel表中的sheet工作簿)

        #  剔除企业高频词       
        w = 1
        w = w + 1
        while w <= sheet_current_week_result.max_row:
            strreplace = sheet_current_week_result['A'+str(w)].value
            for qy_gpc in ['有限公司','**省','科技','供应站','分公司','有限责任','有限','贸易','湖南','公司']:            
                strreplace = strreplace.replace(qy_gpc,'')
            sheet_current_week_result['E'+str(w)].value = strreplace
            print(w)
            w = w + 1

        book.save(LoadPath)
#endregion

第二步:模糊匹配,根据剔除后的企业名称与内部系统的用户名进行模糊匹配,可能得到一个企业名称对应多个用户名的情况,这样才需要我们的第三步,用户名称相似度排名打分,当然第二步中我们可能获取到完全匹配的名称,我们需要另外存放起来。

#region 第二步

    df = pd.read_excel('***.xlsx', sheet_name='sheet1')
    df.index = range(1,len(df)+1)
    df = df[:len(df)+1]
    df = df.values.tolist()

    all_zbdc = []
    zbdc_tup = []
    for row in df: # 2. 将剔除后的企业名称、匹配后用户名称完全相等的记录找出来,得到表AllMate
        qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm = row
        zbdc = row[0]
        res_zbdc = []
        flag = True

        if qy_nm == qy_mate_nm:
            res_row = [qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm,100,1,Levenshtein.ratio(qy_nm, qy_tc_gpc) * 100]
            print(res_row)
            all_zbdc.append(res_row)
            flag = False 

        if flag:
            zbdc_tup.append([qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm])
    
    df = pd.DataFrame(all_zbdc)
    df.to_excel('AllMate.xlsx', sheet_name='mate', index=False)
    #endregion

第三步:相似度排名打分

#region 第三步
    print(len(zbdc_tup))
    res = []
    for row in zbdc_tup:
        qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm = row
        res_zbdc = []
        strreplace = qy_mate_nm
        for qy_mate_gpc in ['有限公司','**省','科技','供应站','分公司','有限责任','有限','贸易','**','公司']:            
                strreplace = strreplace.replace(qy_mate_gpc,'')

        d_n =  intersection(strreplace, qy_tc_gpc)
        sim = max(Levenshtein.ratio(strreplace, d_n),Levenshtein.ratio(qy_tc_gpc, d_n))
        res_row = [qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm,strreplace,sim * 100]
        res_zbdc.append(res_row)

        res.append(get_top3(res_zbdc))

        df = pd.concat(res)
        df.to_excel('SimilarMate.xlsx', sheet_name='mate', index=False)

        #endregion

涉及到的自定义函数:文章来源地址https://www.toymoban.com/news/detail-650871.html

def intersection(string1, string2):
    return [cha for cha in string2 if cha in string1]

def get_top3(datas:list):
    df = pd.DataFrame(datas,columns=["企业名称","区块","统一社会信用代码","经营范围","企业匹配结果名称","企业匹配结果名称剔除高频","名称相似度"])
    df = df.sort_values("名称相似度",ascending=False)
    df.index = range(1,len(df)+1)
    df = df[:3]
    df['相似度排名'] = df.index
    all_sim = []
    for i in range(len(df)):
        row = df.iloc[i].to_list()
        all_sim.append(Levenshtein.ratio(row[0], row[3]) * 100)
    df['全名相似度'] = all_sim
    print(df)
    return df

到了这里,关于python实现文本相似度排名计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 集成多元算法,打造高效字面文本相似度计算与匹配搜索解决方案,助力文本匹配冷启动[BM25、词向量、SimHash、Tfidf、SequenceMatcher]

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目

    2024年02月05日
    浏览(46)
  • 【计算机视觉】使用 notebook 展示如何下载和运行 CLIP models,计算图片和文本相似度,实现 zero-shot 图片分类

    项目地址: CLIP(Contrastive Language-Image Pretraining)是由OpenAI开发的一个深度学习模型,用于处理图像和文本之间的联合表示。它的目标是将图像和文本嵌入到一个共享的向量空间中,使得相似的图像和文本在这个空间中距离较近,而不相似的图像和文本距离较远。 CLIP模型的特

    2024年02月08日
    浏览(37)
  • Java 计算文本相似度

    2024年02月11日
    浏览(30)
  • scala 短文本相似度计算

    simHash类的算法更适合长文本的相似度判断,而短文本可考虑一下几种方法: 一、编辑距离+jacard距离 对于dataframe,getLevenshtein可利用原生的levenshtein函数 二、md5 三、语义向量模型 其他思路 python的difflib使用

    2024年02月15日
    浏览(29)
  • 用java计算文本相似度

    遇到这样一个需求,需要计算两个文本内容的相似度,以前也接触过,下面列举几种方式,也是我在网上查了很多内容整理的,直接上代码,供大家参考,如果你也有这样的需求,希望能帮到你: 引入pom 代码 Jaccard计算文本相似性,效果并不咋地,但在一些应用环境上,使用

    2024年02月10日
    浏览(28)
  • 自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配,用于找到与查询语句最相似的文本

    大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目14-基于文本向量和欧氏距离相似度的文本匹配,用于找到与查询语句最相似的文本。NLP中的文本匹配是指通过计算文本之间的相似度来找到与查询语句最相似的文本。其中一种常用的方法是基于文本向量和欧氏

    2024年02月15日
    浏览(38)
  • LLM - LLaMA-2 获取文本向量并计算 Cos 相似度

    目录 一.引言 二.获取文本向量 1.hidden_states 与 last_hidden_states ◆ hidden_states ◆ last_hidden_states  2.LLaMA-2 获取 hidden_states ◆ model config  ◆ get Embedding 三.获取向量 Cos 相似度 1.向量选择 2.Cos 相似度 3.BERT-whitening 特征白化 4.评估指标对比 四.总结 前面提到了两种基于统计的机器翻

    2024年02月10日
    浏览(28)
  • python+openCV使用SIFT算法实现印章的总相似度检测

    首先整体流程是预建了一个印章库,包含若干张图片。目的是输入一张印章图片,与库里图片对比,最终显示相似度最高的三张。记一下关键代码。 1.图像预处理 主要是红色区域提取、常规灰度二值、对于形态不好的图片做个腐蚀啥的。 2.做一个霍夫圆打开,方便后续文字识

    2024年02月08日
    浏览(36)
  • Python案例分析|文本相似度比较分析

     本案例通过设计和实现有关文本相似度比较的类Vector和Sketch,帮助大家进一步掌握设计Python类来解决实际问题的能力。 通过计算并比较文档的摘要可实现文本的相似度比较。 文档摘要的最简单形式可以使用文档中的k-grams(k个连续字符)的相对频率的向量来表示。假设字符

    2024年02月16日
    浏览(37)
  • 利用Redis实现向量相似度搜索:解决文本、图像和音频之间的相似度匹配问题

    在自然语言处理领域,有一个常见且重要的任务就是文本相似度搜索。文本相似度搜索是指根据用户输入的一段文本,从数据库中找出与之最相似或最相关的一段或多段文本。它可以应用在很多场景中,例如问答系统、推荐系统、搜索引擎等。 比如,当用户在知乎上提出一个

    2024年02月15日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包