Pyspark 计算文档相关性的余弦相似度

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

我已经对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)
现在我想计算归一化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转换为向量,因此出现了错误

通过执行以下步骤,无需进行转换即可实现所需:

  • 将两个RDD连接到一个RDD中。请注意,我假设您在两个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)