scala 短文本相似度计算

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

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使用文章来源地址https://www.toymoban.com/news/detail-613853.html

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

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

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

相关文章

  • 你知道Scala编程语言吗?Scala基础教程【建议收藏】

    作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍 📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪 Scala是一种

    2023年04月08日
    浏览(80)
  • Scala语言入门以及基本语法

    scala在一种简洁的高级语言中结合了面向对象和函数式编程。Scala的静态类型有助于避免复杂应用程序中的错误,它的JVM和JavaScript运行时使您可以构建高性能系统,并轻松访问庞大的库生态系统。 几大特性 Scala运行在JVM上,因此Java和Scala实现完全无缝集成。 类型推理。 并发

    2024年02月01日
    浏览(41)
  • Scala集合常用函数 - 高级计算函数

    水善利万物而不争,处众人之所恶,故几于道💦   1. 过滤 - filter   2. 转换/映射 - map   3. 扁平化 - flatten   4. 扁平化+映射 - flatMap   5. 分组 - groupBy   6. 简化(规约) - reduce   7. 折叠 - fold   8. 函数小练习 1. 过滤 - filter  遍历一个集合并从中获取满足指定

    2024年02月17日
    浏览(43)
  • Scala集合常用函数 - 初级计算函数

    水善利万物而不争,处众人之所恶,故几于道💦   1. 求和   2. 求乘积   3. 最大值   4. 最小值   5. 排序     sorted     sortBy()     sortWith() 以List集合为例: 1. 求和 2. 求乘积 3. 最大值 4. 最小值 5. 排序 1. sorted  对一个集合进行自然排序,通过传递隐式的

    2024年02月16日
    浏览(33)
  • Spark-Scala语言实战(9)

    之前的文章中,我们学习了如何在spark中使用RDD方法的flatMap,take,union。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(8)-CSDN博客 文章浏览阅读675次,点赞16次,收藏10次。​今

    2024年04月15日
    浏览(47)
  • Spark-Scala语言实战(7)

    在之前的文章中,我们学习了如何在IDEA中导入jars包,并做了一道例题,了解了RDD。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(6)-CSDN博客 文章浏览阅读695次,点赞15次,

    2024年04月15日
    浏览(54)
  • Spark-Scala语言实战(15)

    在之前的文章中,我们学习了如何在spark中使用键值对中的学习键值对方法中的lookup,cogroup两种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(14)-CSDN博客 文章浏览阅

    2024年04月15日
    浏览(50)
  • Spark-Scala语言实战(14)

    在之前的文章中,我们学习了如何在spark中使用键值对中的fullOuterJoin,zip,combineByKey三种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(13)-CSDN博客 文章浏览阅读735次

    2024年04月10日
    浏览(58)
  • Spark-Scala语言实战(6)

    在之前的文章中,我们学习了如何在scala中定义与使用类和对象,并做了几道例题。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(5)-CSDN博客 文章浏览阅读1.6k次,点赞51次,

    2024年04月17日
    浏览(41)
  • Spark-Scala语言实战(12)

    在之前的文章中,我们学习了如何在spark中使用键值对中的join,rightOuterJoin,leftOuterJoin三种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(11)-CSDN博客 文章浏览阅读670次,

    2024年04月14日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包