【问题标题】:How can I vectorize Tweets using Spark's MLLib?如何使用 Spark 的 MLLib 对推文进行矢量化?
【发布时间】:2023-03-21 01:40:01
【问题描述】:

我想将推文转换为机器学习的向量,以便我可以使用 Spark 的 K-Means 聚类根据内容对它们进行分类。例如,所有与亚马逊相关的推文都归为一类。

我曾尝试将推文拆分成单词并使用 HashingTF 创建一个向量,但不是很成功。

还有其他方法可以矢量化推文吗?

【问题讨论】:

    标签: apache-spark vector twitter k-means apache-spark-mllib


    【解决方案1】:

    你可以试试这个管道:

    首先,标记输入推文(位于text 列中)。基本上,它会创建一个新列 rawWords 作为从原始文本中获取的单词列表。为了得到这些词,它会按字母数字词分割输入文本 (.setPattern("\\w+").setGaps(false))

    val tokenizer = new RegexTokenizer()
     .setInputCol("text")
     .setOutputCol("rawWords")
     .setPattern("\\w+")
     .setGaps(false)
    

    其次,可以考虑去掉停用词,去掉文本中不重要的词,如atheof,等等

    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)
    

    希望对你有帮助。

    【讨论】:

    • 感谢您的帮助!我没有考虑过CountVectorizer,似乎很有用。我决定走 Streaming 路线——我将流式传输一批推文并在 Spark 中使用 StreamingKMeans 模型。是否可以在新数据进来时实时更新 CountVectorizer 模型?
    • 我不完全习惯于流式API,但我认为您可以通过调用管道的fit 方法来更新模型,这将生成一个新模型但您必须通过所有直到那一刻你已经处理的推文。
    • 感谢您的链接 - 我已经检查了那里的所有内容,但不确定该采取哪个方向。我遇到了这个stackoverflow.com/questions/40996430/…。您认为这种方法可行吗?
    • 我建议您就此提出一个新问题。不幸的是,目前我不能在 Streaming API 上给你太多建议,因为我还不习惯它。关于这个问题,我唯一可以建议您的是使用我向您展示的管道,然后找到一种优化刷新管道模型的方法(您可以使用 write 方法保存它并使用fit 方法)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2022-08-16
    • 2010-09-29
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多