Мой датафрейм выглядит так:
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
, чтобы я мог затем вычислить сходство по Джакарду и затем среднее значение.