MinHash Spark ML 中与 OR 条件的字符串相似度

2023-11-30

我有两个数据集,第一个是大型参考数据集,第二个数据集将通过 MinHash 算法从第一个数据集找到最佳匹配。

val dataset1 = 
+-------------+----------+------+------+-----------------------+
|           x'|        y'|    a'|    b'|   dataString(x'+y'+a')|
+-------------+----------+------+------+-----------------------+
|         John|     Smith| 55649| 28200|       John|Smith|55649|
|         Emma|   Morales| 78439| 34200|     Emma|Morales|78439|
|        Janet|  Alvarado| 89488| 29103|   Janet|Alvarado|89488|
|    Elizabeth|         K| 36935| 38101|      Elizabeth|K|36935|
|      Cristin|      Cruz| 75716| 70015|     Cristin|Cruz|75716|
|         Jack|   Colello| 94552| 15609|     Jack|Colello|94552|
|     Anatolie|     Trifa| 63011| 51181|   Anatolie|Trifa|63011|
|      Jaromir|      Plch| 51237| 91798|     Jaromir|Plch|51237|
+-------------+----------+------+------+-----------------------+

// very_large
val dataset2 =
+-------------+----------+------+-----------------------+
|            x|         y|     a|      dataString(x+y+a)|
+-------------+----------+------+-----------------------+
|         John|     Smith| 28200|       John|Smith|28200|
|         Emma|   Morales| 17706|     Emma|Morales|17706|
|        Janet|  Alvarado| 98809|   Janet|Alvarado|98809|
|    Elizabeth|   Keatley| 36935|Elizabeth|Keatley|36935|
|     Cristina|      Cruz| 75716|    Cristina|Cruz|75716|
|         Jake|   Colello| 15609|     Jake|Colello|15609|
|     Anatolie|     Trifa| 63011|   Anatolie|Trifa|63011|
|         Rune|      Eide| 41907|        Rune|Eide|41907|
|    Hortensia|   Brumaru| 33836|Hortensia|Brumaru|33836|
|       Adrien|     Payet| 40463|     Adrien|Payet|40463|
|       Ashley|    Howard| 12445|    Ashley|Howard|12445|
|       Pamela|      Dean| 81311|      Pamela|Dean|81311|
|        Laura|     Calvo| 82682|      Laura|Calvo|82682|
|        Flora|   Parghel| 81206|    Flora|Parghel|81206|
|      Jaromír|      Plch| 91798|     Jaromír|Plch|91798|
+-------------+----------+------+-----------------------+

为了字符串的相似性,创建了| (管道)分开的 dataString.

这是相似度查找的代码dataString (x' + y' + a') and dataString(x + y + a)运行良好,

val tokenizer = new RegexTokenizer().setPattern("\\|").setInputCol("dataString").setOutputCol("dataStringWords")
val vectorizer = new CountVectorizer().setInputCol("dataStringWords").setOutputCol("features")

val pipelineTV = new Pipeline().setStages(Array(tokenizer, vectorizer))
val modelTV = pipelineTV.fit(dataset1)

val isNoneZeroVector = udf({v: Vector => v.numNonzeros > 0}, DataTypes.BooleanType)

val dataset1_TV = modelTV.transform(dataset1).filter(isNoneZeroVector(col("features")))
val dataset2_TV = modelTV.transform(dataset2).filter(isNoneZeroVector(col("features")))

val lsh = new MinHashLSH().setNumHashTables(20).setInputCol("features").setOutputCol("hashValues")
val pipelineLSH = new Pipeline().setStages(Array(lsh))
val modelLSH = pipelineLSH.fit(dataset1_TV)

val dataset1_LSH = modelLSH.transform(dataset1_TV)
val dataset2_LSH = modelLSH.transform(dataset2_TV)

val finalResult = modelLSH.stages.last.asInstanceOf[MinHashLSHModel].approxSimilarityJoin(dataset1_LSH, dataset2_LSH, 0.5)
finalResult.show

如上所述,代码给出了完美的结果,但我的要求是,我必须比较a with a' OR b', ie.

x' + y' + (a' OR b')
x  + y  + (   a    )

这里我不能连接这两个数据集,因为它们没有公共字段,否则它将是交叉连接。

那么在 Apache Spark 2.2.0 中,有没有什么方法可以在分组数据中通过 OR 条件实现字符串相似度。


我认为不可能设置两个输入列(一个dataString每个使用的元素的列a' or b')然后在计算时使用 OR 但你可以转换dataset1来代表两者x' + y' + a' and x' + y' + b'变体,然后进行距离计算。它不会给你与你选择时完全相同的答案a' or b'基于中的相应行dataset2(我想你知道如何做那个昂贵的操作)但仍然给人一些相似感。

val dataset1splitted =
    dataset1
    .withColumn( "a", explode( array( "a'", "b'" ) ) )
    .drop( "a'", "b'", "dataString" )
    .withColumn( "dataString", concat_ws( "|", $"x'", $"y'", $"a" ) )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MinHash Spark ML 中与 OR 条件的字符串相似度 的相关文章

随机推荐

  • Typescript - “字符串”类型的表达式不能用于索引类型

    common js const boxNames one two module exports boxNames const common require common js const boxNames common boxNames c
  • 在 Eclipse 中使用支持设计库

    我正在开发一个项目 遗憾的是尚未迁移到 Android Studio 我想利用 Google 新的 support design 库中的浮动操作按钮 但我无法将其包含在我的项目中 我更新了 Android SDK 管理器中的支持库 首先 我
  • 附近查询与内部查询

    我使用 MongoDB 查询纬度 经度 25 英里以内的房屋 我第一次尝试使用近命令来执行此操作 如下所示 var near Query Near Coordinates coordinates Latitude coordinates L
  • Golang:当您具有多重继承时,接口的意义是什么[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我是一名 Java 程序员 正在学习 Go 编程 到目前为止 我真的很喜欢这门语言 比 Java 多得多 但有一件事我有点困惑 Java之所以有接口 是因为类只能从一个类继承 既然Go允许
  • Ant unzip/unwar 目录名与文件名相同

    我需要使用 ANT 构建脚本在 tomcat webapps 目录中解压缩一个 war 文件 war 文件名不固定 如何将其解压到与war文件名相同的目录中 我知道如何解压缩文件 但问题是它将内容解压缩到指定的目标目录中 如果我不知道目录名
  • iOS 8 中的 SKSpriteNode 池似乎分配给重叠内存

    我可能错过了一些东西 但是我当前在应用商店中的应用程序可以在 iOS 7 中运行 但在 iOS 8 中完全失败 因为它不会创建预分配的精灵池 它们似乎被写入相同的地址 除非精灵具有特别不同的属性 在 iOS 7 中 以下代码生成包含 4 个
  • 如何解析 Google 地图地理编码结果

    我想使用地理编码从给定的纬度和经度检索地理地址 使用网站上给定的示例 在这个例子中我只需要城市名称纽约和国家名称即美国 但问题是出现的次数不止一种 这些词作为long name 我的问题是如何在 php 中解析这个 json xml 以获取
  • 单元测试中的随机数据?

    我有一位同事为对象编写单元测试 这些对象用随机数据填充其字段 他的原因是它提供了更广泛的测试范围 因为它将测试许多不同的值 而普通测试仅使用单个静态值 我给了他很多不同的反对理由 主要是 随机值意味着测试并不是真正可重复的 这也意味着如果测
  • Kafka批量侦听器反序列化消息不正确

    我正在使用具有以下配置的批量侦听 但我的消息错误地反序列化 KafkaListener id kafka buyers product sales pricing id topics kafka buyers product sales p
  • Cordova/phonegap 项目中的“需要”异常

    我正在尝试在 Android 平台上使用 Phonegap Cordova 构建混合移动应用程序 我也成功了 该应用程序在我的 Chrome 浏览器中的 Ripple 模拟器中按预期工作 我没有使用 Eclipe ADT 或 Android
  • 如何修复 Angular 5 中的 CORS 问题 http 请求 [重复]

    这个问题在这里已经有答案了 我是 Angular 5 的新手 我想发送 http 请求 但它在检查元素中返回 CORS 错误 Error XMLHttpRequest 无法加载http example com account create
  • AddToRole 和 IdentityRole 不是当前上下文模型的一部分

    我正在使用 Identity 2 1 来处理我的 asp net 应用程序中的用户角色 到目前为止 一切顺利 我创建了从 IdentityDBContext 扩展的新上下文 扩展了 IdentityUser 和 IdentityRole 以
  • 找不到文件 *.storyboardc

    I am trying to submit iOS app with extension but get a weird error on validation 我的小部件故事板名为 Main storyboard 属性文件如下所示 我猜这
  • htaccess 不允许访问带参数的子目录

    我正在尝试为 seo url 创建 htaccess 我创建了 htaccess 所有 url 都工作正常 排除带参数的子文件夹 它们重定向到站点文件夹 sitefolder是我的根目录 所有文件都在那里 示例 网址应如下所示 http l
  • 从数据库填充下拉列表并设置默认值

    现在我有一个用于填充 HTML 的可行解决方案
  • 解析 python imaplib 中的括号列表

    我正在寻找简单的方法来将 IMAP 响应中的括号列表拆分为 Python 列表或元组 我想去从 BODYSTRUCTURE text plain charset ISO 8859 1 NIL NIL quoted printable 120
  • 复制网页浏览器控件中的所有文本

    是否可以从导航到的网站中抓取所有文本WebBrowser不看源码就能控制 当人们不需要标题或网页的非主要部分中的任何信息时 大卫 沃克的方法非常有用 如果需要内部文本之外的内容 只有两种选择 一种是使用 getElement 进行解析 另一
  • 使用 Tkinter 处理未捕获的异常

    在我的 Tkinter Python 应用程序中 我尝试使用sys excepthook处理未捕获的异常 但我的处理程序从未被调用 堆栈跟踪仍然打印出来 如何处理 Tkinter 应用程序中未捕获的异常 这是一个简单的例子 展示了我的尝试
  • 将 StringVector 与 Rcpp 连接

    我不知道如何用 Rcpp 连接 2 个字符串 虽然我怀疑有一个明显的答案 但文档对我没有帮助 http gallery rcpp org articles working with Rcpp StringVector http galler
  • MinHash Spark ML 中与 OR 条件的字符串相似度

    我有两个数据集 第一个是大型参考数据集 第二个数据集将通过 MinHash 算法从第一个数据集找到最佳匹配 val dataset1 x y a b dataString x y a John Smith 55649 28200 John