【发布时间】: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 |
+--------+------+------+------+------+
目标是在这四个文档(doc0、doc1、doc2 和 doc3)中识别出哪些文档彼此相似。显然,唯一可能的候选对是doc0 和doc3。
使用 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