CountVectorizer

  CountVectorizerCountVectorizerModel的目的是帮助我们将文本文档集转换为词频(token counts)向量。
当事先没有可用的词典时,CountVectorizer可以被当做一个Estimator去抽取词汇,并且生成CountVectorizerModel
这个模型通过词汇集为文档生成一个稀疏的表示,这个表示可以作为其它算法的输入,比如LDA
  在训练的过程中,CountVectorizer将会选择使用语料中词频个数前vocabSize的词。一个可选的参数minDF
会影响训练过程。这个参数表示可以包含在词典中的词的最小个数(如果该参数小于1,则表示比例)。另外一个可选的boolean参数控制着输出向量。
如果将它设置为true,那么所有的非0词频都会赋值为1。这对离散的概率模型非常有用。

举例

  假设我们有下面的DataFrame,它的列名分别是idtexts.

  1. id | texts
  2. ----|-------------------------------
  3. 0 | Array("a", "b", "c")
  4. 1 | Array("a", "b", "b", "c", "a")

  texts列的每一行表示一个类型为Array[String]的文档。CountVectorizer生成了一个带有词典(a, b, c)CountVectorizerModel
经过转换之后,输出的列为vector

  1. id | texts | vector
  2. ----|---------------------------------|---------------
  3. 0 | Array("a", "b", "c") | (3,[0,1,2],[1.0,1.0,1.0])
  4. 1 | Array("a", "b", "b", "c", "a") | (3,[0,1,2],[2.0,2.0,1.0])

  下面是代码调用的方法。

  1. import org.apache.spark.ml.feature.{CountVectorizer, CountVectorizerModel}
  2. val df = spark.createDataFrame(Seq(
  3. (0, Array("a", "b", "c")),
  4. (1, Array("a", "b", "b", "c", "a"))
  5. )).toDF("id", "words")
  6. // fit a CountVectorizerModel from the corpus
  7. val cvModel: CountVectorizerModel = new CountVectorizer()
  8. .setInputCol("words")
  9. .setOutputCol("features")
  10. .setVocabSize(3)
  11. .setMinDF(2)
  12. .fit(df)
  13. // alternatively, define CountVectorizerModel with a-priori vocabulary
  14. val cvm = new CountVectorizerModel(Array("a", "b", "c"))
  15. .setInputCol("words")
  16. .setOutputCol("features")
  17. cvModel.transform(df).select("features").show()