jaccard相似性的笛卡尔方法

rbl8hiat  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(466)

我有一段代码:

StructType schema = new StructType(
                new StructField[] { DataTypes.createStructField("file_path", DataTypes.StringType, false),
                        DataTypes.createStructField("file_content",
                                DataTypes.createArrayType(DataTypes.StringType, false), false) });

Dataset<Row> df = spark.createDataFrame(shinglesDocs.map(new Function<Tuple2<String, String[]>, Row>() {
            @Override
            public Row call(Tuple2<String, String[]> record) {
                return RowFactory.create(record._1().substring(record._1().lastIndexOf("/") + 1), record._2());
            }
        }), schema);
        df.show(true);

CountVectorizer vectorizer = new CountVectorizer().setInputCol("file_content").setOutputCol("feature_vector")
                .setBinary(true);
        CountVectorizerModel cvm = vectorizer.fit(df);
        Broadcast<Integer> vocabSize = sc.broadcast(cvm.vocabulary().length);
        System.out.println("vocab size = " + cvm.vocabulary().length;
        for (int i = 0; i < vocabSize.value(); i++) {
            System.out.print(cvm.vocabulary()[i] + "(" + i + ") ");
        }
        System.out.println();

        Dataset<Row> characteristicMatrix = cvm.transform(df);
        characteristicMatrix.show(false);

cm contains=[文档1列,文档2列,文档3列]
其中,column-for-document1如下所示(1,0,1,1,0,0,1,1)
我需要计算js=a/(a+b+c)
column-for-document1和column-for-document2之间的jaccard相似性(js)
column-for-document1和column-for-document3之间的jaccard相似性(js)
column-for-document2和column-for-document3之间的jaccard相似性(js)
但是cm是一个大文件,它在3台不同的计算机上(因为它是大数据编程),所以,
文件列1在一台计算机上;文档列2在另一台计算机上;文件列3在第3台计算机上
如果它们都在不同的计算机上,你如何计算上面的呢?
我需要用笛卡尔坐标 cm.cartesian(cm) 但我甚至不知道从哪里开始,因为cm在数据集中。我想也许我可以把它转换成一个数组,然后比较索引,但是我以前从来没有处理过数据集,所以我不知道怎么做,或者什么是最好的策略。
请用java spark写下你的答案。

wqsoz72f

wqsoz72f1#

这似乎是minhash算法的理想情况。
此算法允许您接收数据流(例如来自3台不同的计算机),并使用多个哈希函数计算流之间的相似性,即jaccard相似性。
您可以在spark wiki上找到minhash算法的实现:http://spark.apache.org/docs/2.2.3/ml-features.html#minhash-对于jaccard距离

相关问题