【问题标题】:Implement minhash LSH using Spark (Java)使用 Spark (Java) 实现 minhash LSH
【发布时间】:2018-02-05 02:35:52
【问题描述】:

这很长,对此我很抱歉。

我一直在尝试使用 Spark (Java) 来实现 chapter 3 中讨论的 Minhash LSH 算法。我正在使用这样的玩具问题:

+--------+------+------+------+------+
|element | doc0 | doc1 | doc2 | doc3 |
+--------+------+------+------+------+
|   d    |   1  |  0   |  1   |  1   |
|   c    |   0  |  1   |  0   |  1   |
|   a    |   1  |  0   |  0   |  1   |
|   b    |   0  |  0   |  1   |  0   |
|   e    |   0  |  0   |  1   |  0   |  
+--------+------+------+------+------+

目标是在这四个文档(doc0doc1doc2doc3)中识别出哪些文档彼此相似。显然,唯一可能的候选对是doc0doc3

使用 Spark 的支持,生成以下“特征矩阵”是我目前所能达到的:

+----+---------+-------------------------+
|key |value    |vector                   |
+----+---------+-------------------------+
|key0|[a, d]   |(5,[0,2],[1.0,1.0])      |
|key1|[c]      |(5,[1],[1.0])            |
|key2|[b, d, e]|(5,[0,3,4],[1.0,1.0,1.0])|
|key3|[a, c, d]|(5,[0,1,2],[1.0,1.0,1.0])|
+----+---------+-------------------------+

这里是sn-ps的代码:

CountVectorizer vectorizer = new CountVectorizer().setInputCol("value").setOutputCol("vector").setBinary(false);
Dataset<Row> matrixDoc = vectorizer.fit(df).transform(df);

MinHashLSH mh = new MinHashLSH()
  .setNumHashTables(5)
  .setInputCol("vector")
  .setOutputCol("hashes");

MinHashLSHModel model = mh.fit(matrixDoc);

现在,MinHashLSHModel model 上似乎有两个可以使用的主要调用:model.approxSimilarityJoin(...)model.approxNearestNeighbors(...)。关于使用这两个调用的示例在这里:https://spark.apache.org/docs/latest/ml-features.html#lsh-algorithms

另一方面,model.approxSimilarityJoin(...) 要求我们加入两个数据集,而我只有一个数据集有 4 个文档,我想弄清楚这四个中哪些是相似的,所以我不没有第二个数据集要加入......只是为了尝试一下,我实际上加入了我唯一的数据集。根据结果​​,model.approxSimilarityJoin(...) 似乎只是进行了成对的 Jaccard 计算,我没有看到更改哈希函数等的数量有任何影响,这让我想知道 minhash 签名的确切计算位置以及带/行分区已经发生...

另一个调用,model.approxNearestNeighbors(...),实际上是询问一个比较点,然后模型将识别到这个给定点的最近邻居......显然,这也不是我想要的,因为我有四个玩具文件,我没有额外的参考点。

我的想法已经不多了,所以我继续使用 Spark API 实现了我自己的算法版本,但是 没有来自MinHashLSHModel model 的太多支持,这真的让我感觉很糟糕。我在想我一定错过了什么……??

我很想听听任何想法,真的很想解开这个谜。

提前谢谢你们!

【问题讨论】:

    标签: java apache-spark minhash


    【解决方案1】:
    • minHash 签名计算发生在 model.approxSimilarityJoin(...) 本身在哪里 model.transform(...) 在每个输入数据集和哈希签名上调用函数 在加入它们并进行成对提卡之前计算 距离计算。所以,改变哈希数的影响 功能可以在这里看到。
    • model.approxNearestNeighbors(...), 在使用创建模型时可以看到相同的影响 minHash.fit(...) 调用 transform(...) 的函数 输入数据集。

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 2018-09-12
      • 1970-01-01
      • 2011-10-22
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      相关资源
      最近更新 更多