Pyspark 计算文档相关性的余弦相似度
我已经对TF-IDF和关键字RDD进行了规范化处理,现在我想计算余弦相似度以找到文档的相关性得分 所以我试着Pyspark 计算文档相关性的余弦相似度,pyspark,apache-spark-mllib,tf-idf,Pyspark,Apache Spark Mllib,Tf Idf,我已经对TF-IDF和关键字RDD进行了规范化处理,现在我想计算余弦相似度以找到文档的相关性得分 所以我试着 documentRdd = sc.textFile("documents.txt").flatMap(lambda l: re.split(r'[^\w]+',l)) keyWords = sc.textFile("keywords.txt").flatMap(lambda l: re.split(r'[^\w]+',l)) normalizer1 = Norma
documentRdd = sc.textFile("documents.txt").flatMap(lambda l: re.split(r'[^\w]+',l))
keyWords = sc.textFile("keywords.txt").flatMap(lambda l: re.split(r'[^\w]+',l))
normalizer1 = Normalizer()
hashingTF = HashingTF()
tf = hashingTF.transform(documentRdd)
tf.cache()
idf = IDF().fit(tf)
tfidf = idf.transform(tf)
normalizedtfidf=normalizer1.transform(tfidf)
现在我想计算归一化FIDF和关键字之间的余弦相似度,所以我尝试使用
x = Vectors.dense(normalizedtfidf)
y = Vectors.dense(keywordTF)
print(1 - x.dot(y)/(x.norm(2)*y.norm(2)) , "is the releavance score")
但这会导致错误
TypeError:float()参数必须是字符串或数字
这意味着我传递了一个错误的格式。任何帮助都将不胜感激
更新
我当时试过了
x = Vectors.sparse(normalizedtfidf.count(),normalizedtfidf.collect())
y = Vectors.sparse(keywordTF.count(),keywordTF.collect())
但是得到
TypeError:无法将类型视为
载体
作为错误。由于您试图强制将RDD转换为向量,因此出现了错误 通过执行以下步骤,无需进行转换即可实现所需:
map
RDD,带有计算余弦距离的函数然后,您可以使用您的结果或运行
collect
查看它们。对于所有不正确的文档,这会返回[1.0,1.0],我想代码应该是正确的。您能从您的两个文档“documents.txt”和“keywords.txt”中发布一些数据点吗?简单问一下,为什么res.collect()返回两个值作为[1.0,1.0]?相关性不应该是一个数字吗?res.collect()
将在数据中每行返回一个值。如果得到2个值,则表示在normalizedFIDF
中有2行,在keywordTF
中有2行。这样做的目的是将normalizedFIDF
中的第1行与keywordTF
中的第1行进行比较,依此类推。我应该直接使用keywordTF还是关键字
# Adding index to both RDDs by row.
rdd1 = normalizedtfidf.zipWithIndex().map(lambda arg : (arg[1], arg[0]))
rdd2 = keywordTF.zipWithIndex().map(lambda arg : (arg[1], arg[0]))
# Join both RDDs.
rdd_joined = rdd1.join(rdd2)
def cosine_dist(row):
x = row[1][0]
y = row[1][1]
return (1 - x.dot(y)/(x.norm(2)*y.norm(2)))
res = rdd_joined.map(cosine_dist)