首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文档相关性的余弦相似度计算

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

Stack Overflow用户
提问于 2019-09-25 06:12:14
回答 1查看 697关注 0票数 0

我已经进行了归一化TF-以色列国防军和关键字RDD,现在想要计算余弦相似度,以找到相关评分的文档。

所以我试着

代码语言:javascript
复制
    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)

现在,我想计算一下我尝试使用的标准文件和keyWords.So之间的余弦相似性。

代码语言:javascript
复制
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()参数必须是字符串或数字

这意味着我传递错误的格式.Any帮助是感激的。

更新

我当时试过了

代码语言:javascript
复制
    x = Vectors.sparse(normalizedtfidf.count(),normalizedtfidf.collect())
    y = Vectors.sparse(keywordTF.count(),keywordTF.collect())

但得到

TypeError:不能将类型视为向量

作为错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-25 08:03:47

您得到了错误,因为您正试图强制地将RDD转换为向量。

通过执行以下步骤,您可以在不执行转换的情况下实现所需的内容:

  1. 将两个RDD连接到一个RDD中。请注意,我假设您在加入.

的两个RDDs中都没有唯一的索引。

代码语言:javascript
复制
# 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 .

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58092111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档