【问题标题】:mllib and pyspark bag of words model for multiple text documents用于多个文本文档的 mllib 和 pyspark 词袋模型
【发布时间】:2015-11-02 18:34:22
【问题描述】:

我有 150 个文本文档(训练集),我想使用 pyspark 和 mllib 包“功能”对其执行“词袋”表示。从这里开始,我还有另外 150 个文本文档(测试集),我还想将它们转换为一个词袋,目的是将这个测试集的每个元素映射到具有最高余弦相似度的训练集文档。为了做到这一点,我将为权重实施 TF-IDF:这需要每个文档的词频以及我想要匹配的组合训练集。

我正在使用本指南:

https://spark.apache.org/docs/1.3.0/mllib-feature-extraction.html

请注意,它有一个注释“#加载文档(每行一个)”。然而,为了简洁起见,我从同一目录循环上传每个文本文件,如下所示:

import os
from pyspark import SparkContext
from pyspark.mllib.feature import HashingTF
from pyspark.mllib.feature import IDF    

train = os.listdir("/home/ubuntu/TF-IDF/TrainingSet") #create a list of file names
hashingTF = HashingTF()

for i in range(0,len(train)):  #create RDD of each text file, split into words and (attempt) to make hash table
    documents = sc.textFile("/home/ubuntu/TF-IDF/TrainingSet/" + train[i]).map(lambda line: line.split(" "))

    tf = hashingTF.transform(documents)

tf.count() #enact count to check if tf has worked as expected

但我发现用 tf.count() 作为检查,它给出的答案是 26,这肯定是错误的。尽管如此,从这里开始:

idf = IDF(minDocFreq=1).fit(tf)

tfidf = idf.transform(tf)

我的问题是如何使用这个 tfidf 和余弦相似度来匹配从测试集到训练集的文本文档?

【问题讨论】:

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


    【解决方案1】:

    嗯,我在你的问题中看到了两点。首先是你想要做什么的概念。让我看看我是否理解正确,你有两组文档 150 个训练集和 150 个测试集,你想用 tfidf 创建它们的向量表示(矩阵表示)。然后你想找到测试集与训练集的更高余弦相似度。

    首先,您必须谨慎操作。您可以独立完成,创建两个矩阵 1 用于训练集,另一个用于测试集。然后,您必须首先检查一个中的所有术语是否在另一个中,或者添加每个中缺少的那些,以便您可以正确计算余弦相似度,您需要具有相同列数和顺序的相同向量,否则您将得到错误。同样重要的是要注意每个训练集和测试集都会有两个 idf 计算。如果您引入偏见,则选择它们的 idf 可能会在两者中存在很大差异,在这里也要小心。

    或者你可以把它们放在一起,用 tfidf 构建一个矩阵,你知道第一个 150 是训练,第二个 150 是测试,或者在某个地方保留某种索引。有了这个,您可以确保它们都使用相同的空间、相同的列向量、idf 计算也沿着整个集合构建。然后你可以计算余弦相似度。

    现在在您的代码中,tf 应该是每个文档一个向量,我猜您的 len(train) 大于 26,mb 那里有一个错误。计算余弦我觉得比较简单,这里有一些例子,它是为一对向量定义的,你需要循环运行。

    Spark Cosine Similarity (DIMSUM algorithm ) sparse input file

    【讨论】:

    • 嗨 VComas,感谢您的帮助。我发现这是一个很难写下来的概念,但是是的,您已经正确理解了!我也关注了在堆栈交换中发现的另一个问题。我主要担心的是,当我使用我的测试 tf 向量时,测试文档将包含不在训练 IDF 中的单词,即它们的权重为零,并且这些额外特征在 TF-IDF 矩阵中没有位置(比如你上面说的)。此外,我通过使用原始链接中的方法获得了一个哈希表 TF-IDF,如何提取余弦相似度的向量?我会提出一个新问题
    • 你可以把它们放在一起,做1个矩阵,这样你就可以保证向量是一样的。保留 train 和 test 的索引,以便以后进行比较。对于余弦而言,重要的是不仅存在相同的项,而且顺序也相同。
    • 好的,那么我如何知道测试文档将匹配哪些培训文档?问题在于 HashingTF() 似乎消除了原始索引,因此您无法知道您正在查看哪个文档?希望我只是把这件事复杂化了,但这对我来说是个大问题。stackoverflow.com/questions/31946507/…
    • 我明白了,你是说你丢失了索引。但无论如何它应该是每个文档的向量,你能处理它们一个元组吗?喜欢(索引,无论你想用它做什么)
    • 我想我可能想出了一个解决方案。当您在这些 RDD 上运行 collect() 时,您可以看到它们只是稀疏向量的列表。所以我会制定 .dot() 在各种情况下找到点积。余弦相似度由 a dot b / (mod(a) * mod(b)) 给出,所以我将只使用 a.dot(b) / (a.dot(a)* b。 dot(b))^0.5 或类似的东西。 spark.apache.org/docs/1.1.0/api/python/…
    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 2015-11-22
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2016-08-28
    • 2017-05-28
    相关资源
    最近更新 更多