首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala和Python中的LSH

Scala和Python中的LSH
EN

Stack Overflow用户
提问于 2019-11-12 19:52:39
回答 1查看 377关注 0票数 3

我遵循这一点,所以post Efficient string matching in Apache Spark来获得一些字符串匹配使用LSH算法。出于某种原因,可以通过python获得结果,但在Scala中则不然。我看不出Scala代码缺少什么地方。

以下是这两项守则:

代码语言:javascript
复制
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()

它还会:

+--------------------+--------------------+-------+我.[鲍勃·琼斯] [b,o.=0.6]> +--------------------+--------------------+-------+

但是Scala什么也不返回,下面是代码:

代码语言:javascript
复制
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

我正在使用Spark3.0,我知道这是一个测试,但不能真正在不同版本上测试它。我怀疑会有这样的错误:)

EN

回答 1

Stack Overflow用户

发布于 2021-11-10 12:48:04

如果正确设置numHashTables,此代码将在Spark3.0.1中工作。

代码语言:javascript
复制
val lsh = new MinHashLSH().setInputCol("vectors").setOutputCol("lsh").setNumHashTables(3)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58825754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档