从 TF-IDF 到 Spark、pyspark 中的 LDA 聚类

Hor*_*usH 5 python tf-idf lda apache-spark pyspark

我正在尝试对存储在格式键中的推文进行聚类,listofwords

我的第一步是使用数据框提取单词列表的 TF-IDF 值

dbURL = "hdfs://pathtodir"  
file = sc.textFile(dbURL)
#Define data frame schema
fields = [StructField('key',StringType(),False),StructField('content',StringType(),False)]
schema = StructType(fields)
#Data in format <key>,<listofwords>
file_temp = file.map(lambda l : l.split(","))
file_df = sqlContext.createDataFrame(file_temp, schema)
#Extract TF-IDF From https://spark.apache.org/docs/1.5.2/ml-features.html
tokenizer = Tokenizer(inputCol='content', outputCol='words')
wordsData = tokenizer.transform(file_df)
hashingTF = HashingTF(inputCol='words',outputCol='rawFeatures',numFeatures=1000)
featurizedData = hashingTF.transform(wordsData)
idf = IDF(inputCol='rawFeatures',outputCol='features')
idfModel = idf.fit(featurizedData)
rescaled_data = idfModel.transform(featurizedData)
Run Code Online (Sandbox Code Playgroud)

根据在 spark 中为 LDA 准备数据的建议,我尝试将输出重新格式化为我期望作为 LDA 输入的内容,基于此示例,我开始时:

indexer = StringIndexer(inputCol='key',outputCol='KeyIndex')
indexed_data = indexer.fit(rescaled_data).transform(rescaled_data).drop('key').drop('content').drop('words').drop('rawFeatures')
Run Code Online (Sandbox Code Playgroud)

但是现在我没有设法找到一种好方法将我的数据帧转换为上一个示例或本示例中建议的格式

如果有人可以指出我要查看的正确位置,或者如果我的方法错误可以纠正我,我将不胜感激。

我认为从一系列文档中提取 TF-IDS 向量并将它们聚类应该是一件相当经典的事情,但我没有找到一种简单的方法来做到这一点。

zer*_*323 4

LDA 期望 (id, features) 作为输入,因此假设它KeyIndex用作 ID:

from pyspark.mllib.clustering import LDA

k = ... # number of clusters
corpus = indexed_data.select(col("KeyIndex").cast("long"), "features").map(list)
model = LDA.train(corpus, k=k)
Run Code Online (Sandbox Code Playgroud)