かなり長くなり、申し訳ありません。
第 3 章で説明した Minhash LSH アルゴリズムを、Spark (Java) を使用して実装しようとしています。私はこのようなおもちゃの問題を使用しています:
+--------+------+------+------+------+
|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 |
+--------+------+------+------+------+
目標は、これら 4 つのドキュメント ( 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])|
+----+---------+-------------------------+
コードスニペットは次のとおりです。
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
使用できる には 2 つの主要な呼び出しがあるようです:model.approxSimilarityJoin(...)
とmodel.approxNearestNeighbors(...)
. これら 2 つの呼び出しの使用例は次のとおりです: https://spark.apache.org/docs/latest/ml-features.html#lsh-algorithms
一方、model.approxSimilarityJoin(...)
2 つのデータセットを結合する必要があります。私は 4 つのドキュメントを持つデータセットを 1 つしか持っていません。これら 4 つのドキュメントのどれが互いに類似しているかを調べたいので、2 つ目のデータセットはありません。結合... 試してみるために、実際に唯一のデータセットをそれ自体に結合しました。結果に基づいて、model.approxSimilarityJoin(...)
ペアワイズ Jaccard 計算を行ったようで、ハッシュ関数などの数を変更しても影響は見られず、minhash 署名が正確にどこで計算され、バンド/行がどこで計算されたのか疑問に思いました。分割が発生しました...
もう 1 つの呼び出し はmodel.approxNearestNeighbors(...)
実際に比較ポイントを要求し、モデルはこの指定されたポイントに最も近いものを識別します... 明らかに、これも私が望んでいたものではありません。余分な基準点はありません。
アイデアが尽きたので、Spark API を使用して独自のバージョンのアルゴリズムを実装しましたが、からのサポートがあまりなくMinHashLSHModel model
、本当に気分が悪くなりました。私は何かを逃したにちがいないと思っています... ??
どんな考えでも聞きたいです、本当に謎を解きたいです。
よろしくお願いします!