我应该使用哪个Spark ML特征变换器将一列短语转换为固定长度的向量?

时间:2017-08-17 03:36:39

标签: apache-spark tokenize apache-spark-mllib one-hot-encoding

让我们说我有一个Spark DataFrame,其中一个列有短语。唯一短语的总数太大而无法在机器学习算法中使用,但我想将短语分解为单词,然后将每个短语转换为固定长度N的向量,其中每个维度指示一个在这个短语中找到了N最常见的单词。

以下是一个例子。

val sentenceDataFrame = spark.createDataFrame(Seq(
  (0, "Foo bar dinosaur"),
  (1, "bar logistic"),
  (2, "foo bar logistic regression")
)).toDF("id", "sentence")

如果我让N为3,那么我希望以下转换后的DataFrame

val sentenceDataFrameTransformed = spark.createDataFrame(Seq(
  (0, "Foo bar dinosaur", [1, 1, 0]),
  (1, "bar logistic", [0, 1, 0]),
  (2, "foo bar logistic regression", [1 1 1])
)).toDF("id", "sentence", "sentenceTopWordsHotEncoded")

最重要的词是" foo," "杆,"和"后勤"在这种情况下(受欢迎程度)。

有许多可用的变形金刚Spark describes here,但我没有看到一个(或一些简单的组合)给我我想要的东西。

我不想手动编写此函数的原因是因为我希望将变换器准备好放入管道中,以便我可以序列化此模型,因此当我评估新行时,顶部{{ 1}}单词将是相同的。

1 个答案:

答案 0 :(得分:1)

使用CountVectorizerHashingTF。如果你想要二进制功能,你应该使用第二个和setBinary

两者都需要先进行标记化,并可选择StopWordsRemover。总体:

 (RegexTokenizer|Tokenizer) ->  (CountVectorizer|HashingTF)