【问题标题】:LSH in Scala and Python APIScala 和 Python API 中的 LSH
【发布时间】:2021-11-10 20:50:35
【问题描述】:

我正在关注此 SO 帖子 Efficient string matching in Apache Spark 以使用 LSH 算法获得一些字符串匹配。出于某种原因,通过 python API 获得结果,但不是在 Scala 中。我真的看不出 Scala 代码中缺少什么。

下面是这两个代码:

from pyspark.ml import Pipeline
from pyspark.ml.feature import RegexTokenizer, NGram, HashingTF, MinHashLSH

query = spark.createDataFrame(["Bob Jones"], "string").toDF("text")

db = spark.createDataFrame(["Tim Jones"], "string").toDF("text")

model = Pipeline(stages=[
    RegexTokenizer(
        pattern="", inputCol="text", outputCol="tokens", minTokenLength=1
    ),
    NGram(n=3, inputCol="tokens", outputCol="ngrams"),
    HashingTF(inputCol="ngrams", outputCol="vectors"),
    MinHashLSH(inputCol="vectors", outputCol="lsh")
]).fit(db)

db_hashed = model.transform(db)
query_hashed = model.transform(query)

model.stages[-1].approxSimilarityJoin(db_hashed, query_hashed, 0.75).show()

然后它返回:

> +--------------------+--------------------+-------+ |            datasetA|            datasetB|distCol|
> +--------------------+--------------------+-------+ |[Tim Jones, [t, i...|[Bob Jones, [b, o...|    0.6|
> +--------------------+--------------------+-------+

然而 Scala 什么也没返回,代码如下:

import org.apache.spark.ml.feature.RegexTokenizer
val tokenizer = new RegexTokenizer().setPattern("").setInputCol("text").setMinTokenLength(1).setOutputCol("tokens")
import org.apache.spark.ml.feature.NGram
val ngram = new NGram().setN(3).setInputCol("tokens").setOutputCol("ngrams")
import org.apache.spark.ml.feature.HashingTF
val vectorizer = new HashingTF().setInputCol("ngrams").setOutputCol("vectors")
import org.apache.spark.ml.feature.{MinHashLSH, MinHashLSHModel}
val lsh = new MinHashLSH().setInputCol("vectors").setOutputCol("lsh")
import org.apache.spark.ml.Pipeline
val pipeline = new Pipeline().setStages(Array(tokenizer, ngram, vectorizer, lsh))
val query = Seq("Bob Jones").toDF("text")
val db = Seq("Tim Jones").toDF("text")
val model = pipeline.fit(db)
val dbHashed = model.transform(db)
val queryHashed = model.transform(query)
model.stages.last.asInstanceOf[MinHashLSHModel].approxSimilarityJoin(dbHashed, queryHashed, 0.75).show

我使用的是 Spark 3.0,我知道它是一个测试,但无法在不同版本上真正测试它。而且我怀疑是否存在这样的错误:)

【问题讨论】:

  • 我在添加 setNumHashTables(10) 时发现,然后 Scala 代码返回结果。但仍然不明白为什么在没有那个的情况下在 python 中返回结果。
  • 还发现 Scala 代码无需在 Spark 2.4.4 中设置 Number of Hash tables 即可工作,因此显然在 3.0 中有所改变

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

如果正确设置 numHashTables,此代码将在 Spark 3.0.1 中运行。

val lsh = new MinHashLSH().setInputCol("vectors").setOutputCol("lsh").setNumHashTables(3)

【讨论】:

  • 如果您可以在代码中添加一些解释,答案会更有用。
猜你喜欢
  • 2012-07-05
  • 2016-09-07
  • 2013-06-18
  • 1970-01-01
  • 2018-01-07
  • 2023-03-12
  • 2016-10-26
  • 2020-08-23
  • 1970-01-01
相关资源
最近更新 更多