我已经使用归一化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 = Normalizer()
hashingTF = HashingTF()
tf = hashingTF.transform(documentRdd)
tf.cache()
idf = IDF().fit(tf)
tfidf = idf.transform(tf)
normalizedtfidf=normalizer1.transform(tfidf)
现在我想计算normalizedtfidf和keyWords之间的余弦相似度,因此我尝试使用
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:无法将类型视为 向量
作为错误。
答案 0 :(得分:1)
出现错误是因为您试图将RDD强制转换为Vectors。
您可以通过执行以下步骤来实现所需的功能而无需进行转换:
# 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)
map
RDD具有计算余弦距离的功能。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)
然后您可以使用结果或运行collect
来查看结果。