【发布时间】:2023-03-21 01:40:01
【问题描述】:
我想将推文转换为机器学习的向量,以便我可以使用 Spark 的 K-Means 聚类根据内容对它们进行分类。例如,所有与亚马逊相关的推文都归为一类。
我曾尝试将推文拆分成单词并使用 HashingTF 创建一个向量,但不是很成功。
还有其他方法可以矢量化推文吗?
【问题讨论】:
标签: apache-spark vector twitter k-means apache-spark-mllib
我想将推文转换为机器学习的向量,以便我可以使用 Spark 的 K-Means 聚类根据内容对它们进行分类。例如,所有与亚马逊相关的推文都归为一类。
我曾尝试将推文拆分成单词并使用 HashingTF 创建一个向量,但不是很成功。
还有其他方法可以矢量化推文吗?
【问题讨论】:
标签: apache-spark vector twitter k-means apache-spark-mllib
你可以试试这个管道:
首先,标记输入推文(位于text 列中)。基本上,它会创建一个新列 rawWords 作为从原始文本中获取的单词列表。为了得到这些词,它会按字母数字词分割输入文本 (.setPattern("\\w+").setGaps(false))
val tokenizer = new RegexTokenizer()
.setInputCol("text")
.setOutputCol("rawWords")
.setPattern("\\w+")
.setGaps(false)
其次,可以考虑去掉停用词,去掉文本中不重要的词,如a、the、of,等等
val stopWordsRemover = new StopWordsRemover()
.setInputCol("rawWords")
.setOutputCol("words")
现在是向量化words列的时候了。在这个例子中,我使用了CountVectorizer,这是非常基本的。还有很多其他的,例如TF-ID Vectorizer。您可以找到更多信息here。
我已配置 CountVectorizer,以便它创建一个包含 10,000 个单词的词汇表,每个单词在所有文档中至少出现 5 次,并且在每个文档中至少出现 1 次。
val countVectorizer = new CountVectorizer()
.setInputCol("words")
.setOutputCol("features")
.setVocabSize(10000)
.setMinDF(5.0)
.setMinTF(1.0)
最后,只需创建管道,并通过传递数据集来拟合和转换管道生成的模型。
val transformPipeline = new Pipeline()
.setStages(Array(
tokenizer,
stopWordsRemover,
countVectorizer))
transformPipeline.fit(training).transform(test)
希望对你有帮助。
【讨论】:
fit 方法来更新模型,这将生成一个新模型但您必须通过所有直到那一刻你已经处理的推文。
write 方法保存它并使用fit 方法)。