Как получить среднее сходство Jaccard среди строк текстового столбца, используя PySpark - PullRequest
0 голосов
/ 27 марта 2019

Мой датафрейм выглядит так:

schema = ['name','text']
rdd = sc.parallelize(["abc,xyz a","abc,xyz a","abc,xyz b","att,xcy b","att,vwa c","acy,xyz a","acy,xyz a"]) \
        .map(lambda x : x.split(","))
df = sqlContext.createDataFrame(rdd,schema)
df.show()


+----+-----+
|name| text|
+----+-----+
| abc|xyz a|
| abc|xyz a|
| abc|xyz b|
| att|xcy b|
| att|vwa c|
| acy|xyz a|
| acy|xyz a|
+----+-----+

Я хочу посмотреть, насколько похожи Text для каждого дубликата Name

Итак, что-то вроде этого (оценки сходства приблизительно):

+----+-----------------+
|name| avg_text_jac_sim|
+----+-----------------+
| abc| 0.66            |
| att| 0.00            |
| acy| 1.00            |
+----+-----------------+

Я рассчитал LSH для каждого text, используя этот пример: http://spark.apache.org/docs/latest/ml-features.html#locality-sensitive-hashing

    from pyspark.ml.feature import HashingTF, IDF, Tokenizer

    tokenizer = Tokenizer(inputCol="text", outputCol="words")
    wordsData = tokenizer.transform(df)

    hashingTF = HashingTF(inputCol="words", outputCol="rawFeatures", numFeatures=20)
    hashedTFData = hashingTF.transform(wordsData)

    mh = MinHashLSH(inputCol="rawFeatures", outputCol="hashes", numHashTables=5)
    model=mh.fit(hashedTFData)

    hashedDF=model.transform(hashedTFData)
    hashedDF.head(1)

Теперь, с помощью model я могу получить похожий текст, используя расстояние Жакара.

# Compute the locality sensitive hashes for the input rows, then perform approximate
# similarity join.
# We could avoid computing hashes by passing in the already-transformed dataset, e.g.
# `model.approxSimilarityJoin(transformedA, transformedB, 0.6)`
print("Approximately joining dfA and dfB on distance smaller than 0.6:")
model.approxSimilarityJoin(dfA, dfB, 0.6, distCol="JaccardDistance")\
    .select(col("datasetA.id").alias("idA"),
            col("datasetB.id").alias("idB"),
            col("JaccardDistance")).show() 

Но я застрял на том, как получить фактическое значение JaccardDistance между text дубликата name, чтобы я мог затем вычислить сходство по Джакарду и затем среднее значение.

...