mllib和pyspark包的多个文本文档的单词模型

时间:2015-08-10 18:18:37

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

我有150个文本文档(训练集),我想用pyspark和mllib包“feature”执行“bag of words”表示。从那里开始,我还有另外150个文本文档(测试集),我想将每个文档转换成一个单词,目的是将该测试集的每个元素映射到具有最高余弦相似性的训练集文档。为了做到这一点,我将实施TF-IDF加权:这需要每个文档的术语频率以及我想要匹配的组合训练集。

我正在使用本指南:

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

请注意,它有一个注释“#Load documents(每行一个)”。相反,为了简洁起见,我将每个文本文件从同一目录中上传到以下内容:

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和余弦相似性来匹配从测试集到训练集的文本文档?

1 个答案:

答案 0 :(得分:0)

好吧,我在你的问题中看到了两件事。首先是你要做的事情的概念。让我看看,如果我理解正确,你有两组文件150训练集和150测试集,你想用tfidf创建它们的矢量表示(矩阵表示)。然后,您希望找到测试集与训练集中较高的余弦相似度。

首先,你必须小心你的工作方式。您可以单独执行此操作,为训练集创建两个矩阵1,为测试集创建另一个矩阵。然后你必须先检查一个中的所有项是否在另一个中,或者添加每个项中缺少的项,这样你就可以正确地计算余弦相似度,你需要具有相同数量和列顺序的相同向量,否则你将得到一个错误。同样重要的是要注意每个训练和测试集将有两个idf计算。如果你引入偏见选择它们,idfs在两者中可能会有很大不同,这里也要小心。

或者你可以将它们放在一起,并使用tfidf构建一个Matrix,你知道第一个150正在训练,第二个150正在测试,或者在某个地方保留某种索引。通过这种方式,您可以确保它们都使用相同的空间,相同的列向量,整个集合中的idf计算。然后你可以计算余弦相似度。

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

Spark Cosine Similarity (DIMSUM algorithm ) sparse input file