私は次のように持ってDataSet
います:
+----+---------+-------------------------+
|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])|
+----+---------+-------------------------+
このデータセットのvector
一部が「特性マトリックス」と呼ばれるもので、「どのドキュメントにどの要素が含まれているか」を表しています。目に優しい形式を使用して、特性行列を書き出しましょう。
+--------+------+------+------+------+
|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 |
+--------+------+------+------+------+
注意深く見ると、要素とを含む にkey0
マップされていることがわかります。そのため、 で与えられるベクトルがあります (ベクトルは の下の列です。特性マトリックス自体には列と最初の行が含まれていないことに注意してください。読みやすくするためだけに存在します。doc0
a
d
(5,[0,2],[1.0,1.0])
doc0
element
ここでの目標は、N
ハッシュ関数を使用して、この特性行列のMinhash 署名を取得することです。
たとえば、 let N = 2
、つまり 2 つのハッシュ関数が使用され、これら 2 つのハッシュ関数が次のように与えられているとも言えます。
(x + 1) % 5
(3x + 1) % 5
x
特性行列の行番号です。これら 2 つのハッシュ関数を使用した後、「minhash 署名マトリックス」は次のようになると予想しています。
+--------+------+------+------+------+
| | doc0 | doc1 | doc2 | doc3 |
+--------+------+------+------+------+
| h1 | 1 | 3 | 0 | 1 |
| h2 | 0 | 2 | 0 | 0 |
+--------+------+------+------+------+
さて、Spark Java を使用して、使用したいこれら 2 つのハッシュ関数を指定するにはどうすればよいですか?次に、指定されたデータセットから上記の RDD を生成するにはどうすればよいですか? 実際のテストケースでは、おそらく約 1000 個のハッシュ関数を使用しますが、現時点では 2 個の使用方法を理解していれば十分です。
私は Spark ドキュメントを検索して読んでいますが、これに関するハンドラーを取得するのは非常に難しいようです。ヒント/ガイダンスは私にとって非常に役立ちます。
前もって感謝します!
今、私はドキュメントを見て、次のコードを持っています:
<pre>
List<Tuple2<String, String[]>> data = Arrays.asList(
new Tuple2<>("key0", new String [] {"a", "d"}),
new Tuple2<>("key1", new String [] {"c"}),
new Tuple2<>("key2", new String [] {"b", "d", "e"}),
new Tuple2<>("key3", new String [] {"a", "c", "d"})
);
JavaPairRDD<String, String[]> rdd = JavaPairRDD.fromJavaRDD(jsc.parallelize(data));
rdd.values().foreach(new VoidFunction<String[]>() {
public void call(String[] rows) throws Exception {
for ( int i = 0; i < rows.length; i ++ ) {
System.out.print(rows[i] + "|");
}
System.out.println();
}
});
StructType schema = StructType.fromDDL("key string, value array<String>");
Dataset<Row> df = spark.createDataFrame(
rdd.map((Function<Tuple2<String, String[]>, Row>) value -> RowFactory.create(value._1(), value._2())),
schema
);
df.show(false);
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);
model.transform(matrixDoc).show(false);
ここに私が得たものがあります: +----+---------+-------------------------+-------- -------------------------------------------------- ------------------------------+ |キー |値 |ベクトル |ハッシュ | +----+---------+-------------------------+-------- -------------------------------------------------- ------------------------------+ |key0|[a, d] |(5,[0,1],[1.0,1.0]) |[[7.57939931E8]、[-1.974869772E9]、[-1.974047307E9]、[4.95314097E8]、[7.01119548 E8]] | |key1|[c] |(5,[2],[1.0]) |[[-2.031299587E9], [-1.758749518E9], [-4.86208737E8], [1.247220523E9], [1.702128832E9]]| |key2|[b, d, e]|(5,[0,3,4],[1.0,1.0,1.0])|[[-1.278435698E9], [-1.542629264E9], [-1.974047307E9], [4.95314097E8]、[-1.59182918E9]]| |key3|[a, c, d]|(5,[0,1,2],[1.0,1.0,1.0])|[[-2.031299587E9], [-1.974869772E9], [-1.974047307E9], [4.95314097E8]、[7.01119548E8]] | +----+---------+-------------------------+-------- -------------------------------------------------- ------------------------------+
さて、結果を説明する方法がわかりません...Sparkで使用されるハッシュ関数は何ですか? これらの機能が何であるかを制御できますか? 結果を別のバケットにハッシュして、同じバケット内のドキュメントが「同じ」ドキュメントになるようにするにはどうすればよいですか? 結局のところ、ペアごとの比較はしたくありません...