【问题标题】:Calculate cosine similarity of document relevance计算文档相关性的余弦相似度
【发布时间】:2020-01-25 06:36:14
【问题描述】:

我已经针对关键字 RDD 进行了标准化的 TF-IDF,现在想要计算余弦相似度以找到文档的相关性分数。

所以我尝试了

    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)

现在我想计算归一化tfidf和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:不能将类型视为 向量

作为错误。

【问题讨论】:

    标签: pyspark apache-spark-mllib tf-idf


    【解决方案1】:

    您收到错误是因为您试图将 RDD 强制转换为 Vectors。

    您可以通过以下步骤在不进行转换的情况下实现您所需要的:

    1. 将两个 RDD 合并为一个 RDD。请注意,我假设您在两个 RDD 中都没有用于加入的唯一索引。
    # 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)
    
    1. 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 来查看它们。

    【讨论】:

    • 嗯,我猜所有不正确的文档都会返回 [1.0, 1.0]
    • 代码应该是正确的。您能否从您的 2 个文档“documents.txt”和“keywords.txt”中发布一些数据点?
    • 只是一个简单的问题,为什么 res.collect() 会返回 2 个值作为 [1.0, 1.0]?相关性不应该是一个数字
    • res.collect() 将在数据中的每一行返回一个值。如果您得到 2 个值,这意味着您在 normalizedtfidf 中有 2 行,在 keywordTF 中有 2 行。这个想法是您将normalizedtfidf 中的第 1 行与keywordTF 中的第 1 行进行比较,依此类推。
    • 我应该直接使用keywordTF还是keyWords
    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 2014-02-25
    • 2019-03-14
    • 2017-07-07
    • 2018-04-11
    • 2015-05-31
    • 2020-03-16
    相关资源
    最近更新 更多