scala 短文本相似度计算

短文本相似度算法 目录 一、无监督方法 1、余弦相似度度量 1.1 基于TF-IDF计算词频向量 1.2 基于Word2Vec计算词向量 2、基于simHash计算文本相似度 3、直接度量句子间相似度—WMD 二、有监督方法 一、无监督方法 1、余弦相似度度量 基本思想: 获取两个短文本的表示向量 计算两个向量的余弦相似度 值越大,表示越相似 文本表示方法: 通过TF-ID... 阅读详情

simHash类的算法更适合长文本的相似度判断,而短文本可考虑一下几种方法:

一、编辑距离+jacard距离


import com.hankcs.hanlp.HanLP
import com.hankcs.hanlp.seg.common.Term
import java.util.Properties
import scala.collection.JavaConverters._

object Test extends Serializable  {

  def main(args: Array[String]): Unit = {
    val props=new Properties()
    props.setProperty("deduplicateMinJaccardDistance","0.2")
    val s1="山东今天大雨"
    val s2="云南今天大雨"
    println(isSimilar(props,s1,s2))
  
  }

  /**
   * 获取有效实体
   *
   * @param text
   * @return
   */
  def getEfficientNorms(text: String): List[String] = {
    val terms: List[Term] = HanLP.newSegment.seg(text).asScala.toList
    terms.filter(term => term.word.length > 1 && term.nature.startsWith
    ("n")).map(term => term.word) //n开头为名词
  }

  /**
   * 获取Jaccard系数
   *
   * @param array1
   * @param array2
   * @return
   */
  def getJaccardCoefficient(array1: Seq[String], array2: Seq[String]) = {
    val s1 = array1.toSet
    val s2 = array2.toSet
    s1.intersect(s2).size.toDouble / s1.union(s2).size.toDouble
  }

  /**
   * 计算编辑距离Levenshtein距离:插入、删除和替换
   *
   * @param word1
   * @param word2
   * @return
   */
  def getLevenshtein(word1: String, word2: String): Int = {
    val m = word1.length
    val n = word2.length
    val dp = Array.ofDim[Int](m + 1, n + 1)
    for (i <- 0 to m) dp(i)(0) = i
    for (j <- 0 to n) dp(0)(j) = j
    for (i <- 1 to m; j <- 1 to n) {
      if (word1(i - 1) == word2(j - 1)) dp(i)(j) = dp(i - 1)(j - 1)
      else dp(i)(j) = (dp(i - 1)(j - 1) + 1).min((dp(i - 1)(j) + 1).min(dp(i)(j - 1) + 1))
    }
    dp(m)(n)
  }
  /**
   * 判断两字符串是否相似
   * @param props
   * @param text1
   * @param text2
   * @return
   */

  def isSimilar(props: Properties, text1: String, text2: String): Boolean = {

    val maxDistance = props.getProperty("deduplicateMaxEditDistance", "10").toInt
    val minDistanceRate = props.getProperty("deduplicateMinDistanceRate", "0.3").toFloat
    val minJaccardDistance = props.getProperty("deduplicateMinJaccardDistance", "0.1").toFloat


    val lDis = getLevenshtein(text1, text2)

    val score = 1 - lDis.toDouble/ Math.max(text1.length, text2.length)

    val jDis = getJaccardCoefficient(getEfficientNorms(text1), getEfficientNorms(text2))

    jDis > minJaccardDistance && score > minDistanceRate && lDis < maxDistance

  }
}

对于dataframe,getLevenshtein可利用原生的levenshtein函数

 df.withColumn("editDistance", levenshtein(col("text1"), col("text2")))
   .withColumn("score", lit(1) - col("editDistance") / greatest(length(col("text1")), length(col("text2"))))

二、md5

三、语义向量模型

其他思路

## 根据经验,ratio() 值超过 0.6 就意味着两个序列是近似匹配的,1表示完全相同
difflin.SequenceMatcher(None,str1,str2).quik_ratio() #原理类似jacard距离

参考

python的difflib使用

【Spark Mllib】TF-IDF&Word2Vec——文本相似度 一个比较通用的例子是使用单词的向量表示基于单词的含义计算两个单词的相似度。特征哈希通过使用哈希方程对特征赋予向量下标,这个向量下标是通过对特征的值做哈希得到的(通常是整数)。使用的哈希方程必须是一致的(就是说,对于一个给定的输入,每次返回相同的输出)。的含义是:在一个文档中出现次数很多的词相比出现次数少的词应该在词向量表示中得到更高的权值。最后的结果就是,稀有的或者重要的词被给予了更高的权值,而更加常用的单词(被认为比较不重要)则在考虑权重的时候有较小的影响。对于我们的任务来说,可以使用。 阅读详情

相关推荐

Python-Levenshtein快速计算编辑距离以及字符串的相似度

Levenshtein:快速计算编辑距离以及字符串的相似度

Scala实现机器学习中常用的相识度和距离计算

在机器学习和人工智能领域,距离(distance)、相似度(similarity)是经常出现的基本概念,关于距离和相似度度量的方法也多种多样,本文将总结一些常用的距离计算方法: 欧氏距离 d=(xi−yi)2 d = \sqrt{(x_i-y_i)^2} d=(xi​−yi​)2​ 在二维平面即是两点间的直线距离,是最常用的距离度量的方法之一: /** * * @param p...

k_wzzc的博客 993

HIL(硬件在环)技术汇总梳理

HIL(Hardware-in-the-Loop)测试领域的知名公司有dSPACE、NI、Vector和speedgoat等,本文是针对这几家HIL技术的对比分析。

Mr.Cssust的博客 3687

用scala spark实现字符串类型cosine相似度计算

计算字符串类型值相似度

sinat_18558057的博客 663

第四章 汇川技术InoProShop入门之串口自由协议解读

摘要: 串口自由协议是工业自动化中针对特定需求设计的自定义通信协议,具有高度灵活性和针对性,适用于小型设备、实时控制等场景。其核心包括自定义帧结构(起始符、地址码、数据区、校验位等)和通信规则(波特率、交互机制)。相比标准协议,自由协议效率更高但兼容性弱,设计时需注重可靠性、效率和可扩展性,适用于定制化或高实时性需求,如传感器数据采集或老旧设备改造。典型应用需平衡精简帧结构与抗干扰能力,同时预留扩展空间。

zyfucking2010的博客 2216

从零到一:树莓派上的YOLO目标检测实战指南

本文详细介绍了如何在树莓派上部署和优化YOLO目标检测模型,从硬件选型到系统配置,再到模型转换与推理优化。通过对比不同树莓派型号的性能差异,提供实用的配置方案和代码示例,帮助开发者快速实现高效的边缘计算视觉系统。特别推荐使用ONNX格式进行模型转换,以提升在树莓派上的推理效率。

weixin_29046035的博客 1063

中文分词框架Hanlp简单案例(scala)

中文分词框架Hanlp简单案例(scala) 背景 在机器学习中,如果需要对中文做自然语言处理,分词的环节必不可少。有很多好用框架 Hanlp就是一个分词框架 案例 <dependency> <groupId>com.hankcs</groupId> <artifactId>hanlp</artifactId> <version>portable-1.7.4&l

xiaohu21的博客 1009

Cesium生态盘点:超图、火星3D等15个二次开发框架对比

本文深入解析Cesium生态中的15个二次开发框架,包括超图、火星3D等主流选择,帮助开发者根据项目需求进行精准选型。从性能表现、功能完备性、开发友好度等维度进行对比,特别适合需要处理地理空间数据和构建三维可视化的JavaScript开发者。

weixin_28197941的博客 497

PB级文本语义去重实战:MinHash-LSH算法与EMR Serverless Spark性能优化

在海量数据处理领域,文本去重是数据清洗和预处理的关键环节,直接影响后续分析和模型训练的质量。其核心原理是通过计算文档间的相似度,识别并合并重复或高度相似的文本。传统精确匹配方法无法处理语义相似问题,而基于深度学习的向量化方法又面临巨大的计算和存储开销。MinHash与局部敏感哈希(LSH)技术组合提供了一种高效的近似解决方案,通过将高维特征映射为紧凑签名并利用分桶机制,将计算复杂度从O(N²)降至接近O(N),实现了精度与效率的平衡。在工程实践中,结合EMR Serverless Spark的弹性计算能力,

weixin_33924220的博客 361

软件工程导论实践:从需求到架构的机票预订系统全流程解析

本文深入解析机票预订系统从需求分析到架构设计的全流程实践,涵盖业务流程、功能建模、模块化设计、性能优化等关键环节。通过实际项目经验,分享软件工程导论在复杂系统开发中的应用技巧,包括数据流图绘制、E-R图设计、微服务架构及高并发处理等实战策略,助力开发者构建高效可靠的机票预订系统。

weixin_29202213的博客 414

【100%通过率】2024华为OD机试真题E卷 C++ 实现【栈数据合并/空栈压数】

向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设: 栈顶至栈底整数依次编号为n1、n2...nx, n1为最新压入的整数)

MISAYAONE的博客 1553

scala 实现余弦相似度

scala 简单实现余弦相似度 余弦相似度:也叫鱼线距离,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似。余弦相似度广泛应用于机器学习领域。 https://baike.baidu.com/item/%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6/17509249 本...

k_wzzc的博客 4216

【Claude】Not logged in · Please run /login 报错已解决

意味着 Claude Code 没有找到任何有效凭证。直接/login——交互式首选;检查——排查环境变量污染;CI 用——自动化场景标准方案;macOS Keychain 异常——/logout/login重置;时钟偏差——校准系统时间。参考:Claude Code 官方《错误参考》"身份验证"章节、官方认证优先级文档、社区 Token 过期排查记录。

博客 9981

Scala实现Pearson皮尔逊相似度计算

皮尔逊相似度是推荐算法中常见的 计算相似度的方法,其公式如下: 从公式可以看出 该算法有几个缺点: 1,如果用户A对所有item的评分都一样,那么将无法计算别人跟A的相似度(分母为0);所以该算法不适用于 boolean preference类型的推荐 2,如果用户A只对1个item进行了评分,那么也无法计算别人跟A的相似度(分母为0);所以对于数据量较小,或者矩阵非常之稀疏的数据都

小老虎的专栏 2603

汽车信息安全--SHE中的密钥管理(二)

上一篇我们讲解了HTA基本概念,SHE和EVITA HSM区别以及SHE的架构,接下来我们聊一聊SHE中的密钥管理策略。

认真搞搞汽车MCU 2402

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Jaccard和Levenshtein

目录 Jaccard相似度 Levenshtein距离 Jaccard相似度 1、jaccard index又称为jaccard similarity coefficient用于比较有限样本集之间的相似性和差异性 定义: 给定两个集合A,B jaccard 系数定义为A与B交集的大小与并集大小的比值,jaccard值越大说明相似度越高 Levenshtein距离 拿idf还得自己去...

黑洲非人lyf 868

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

余弦相似度-字符串相似度计算(scala)

余弦相似度-字符串相似度计算(scala)代码实现

top8488.top大数据 503

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

spark Word2Vec+LSH相似文本推荐(scala)

在上一篇博客,我们使用spark CountVectorizer与IDF进行了关键词提取,博客地址: spark CountVectorizer+IDF提取中文关键词(scala) 本篇博客在上一篇博客的基础上,介绍如何根据关键词获取文档的相似度,进行相似文本的推荐。在这里我们需要使用到两个算法:Word2Vec与LSH。 其中Word2Vec即将词转换为词向量,这样词之间的关系就可以向量距...

u013090676的博客 6924

使用spark计算文档相似度

为什么80%的码农都做不了架构师?>>> ...

weixin_34405354的博客 2586

文本相似度-相似度度量

<title>打赏</title> <script> window.tctipConfig = { staticPrefix: "https://static.tctip.com", buttonImageId: 5, //zanzhu--博客园右边出现"赞助"二字 //bu...

古月哲亭 7088

NLP点滴——文本相似度

目录 前言 字面距离 common lang库 相同字符数 莱文斯坦距离(编辑距离) 定义 实现方式 Jaro距离 定义 实现方式 应用 ...

weixin_30745641的博客 3000

基于编辑距离来判断词语相似度方法(scala版)

词语相似性比较,最容易想到的就是编辑距离,也叫做Levenshtein Distance算法。在Python中是有现成的模块可以帮助做这个的,不过代码也很简单,我这边就用scala实现了一版。 编辑距离 编辑距离是指一个字符串改编成另一个字符串的最短距离,它描述了两个字符串的相近程度。比如: son -&gt; sun ,只需要把o改成u即可,编辑距离为1 xing -&gt; long,需要...

weixin_34024034的博客 290

spark mllib 中的tf-idf算法计算文档相似度

import org.apache.spark.mllib.feature.{HashingTF, IDF} import org.apache.spark.mllib.linalg.{SparseVector => SV} import org.apache.spark.{SparkConf, SparkContext} import scala.io.Source /** * Crea

xiao_jun_0820的专栏 1万+

短文本相似度计算

短文本相似度计算方法 最长公共子序列 编辑距离 相同单词个数/序列长度 word2vec+余弦相似度 Sentence2Vector https://blog.youkuaiyun.com/qjzcy/article/details/51882959?spm=0.0.0.0.zFx7Qk DSSM(deep structured semantic models)(BOW/CNN/RNN) https:...

tsf的博客 1万+

短文本语义相似度计算

写在开始之前:语义即联系。 以下部分来自于我在公司内部的分享。 一、相关概念 在学术上,大致有以下三个概念和文本相似度相关: Semantic Textual Similarity(文本语义相似度):5分表示非常相似,0分表示非常不相似。 Paraphrase Identification(复述判定):1表示是复述,0表示不是复述。 Natural Language Inference(自然语...

领悟 释然 5595
上一篇: Elasticsearch 时间范围查询
下一篇: scala连接mysql数据库
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值