ml sparksql 数据比较_Spark入门:特征抽取:CountVectorizer — spark.ml

76b5ba58fb8e05095d640dfdbd045795.png

【版权声明】博客内容由厦门大学数据库实验室拥有版权,未经允许,请勿转载!

[返回Spark教程首页]

CountVectorizer和CountVectorizerModel旨在通过计数来将一个文档转换为向量。当不存在先验字典时,Countvectorizer可作为Estimator来提取词汇,并生成一个CountVectorizerModel。该模型产生文档关于词语的稀疏表示,其表示可以传递给其他算法如LDA。

在fitting过程中,countvectorizer将根据语料库中的词频排序从高到低进行选择,词汇表的最大含量由vocabsize参数来指定。一个可选的参数minDF也影响fitting过程,它指定词汇表中的词语至少要在多少个不同文档中出现。

​ 我们接下来通过一个例子来进行介绍。首先,导入CountVectorizer所需要的包:

import org.apache.spark.SparkConf

import org.apache.spark.SparkContext

import org.apache.spark.sql.SQLContext

import org.apache.spark.ml.feature.{CountVectorizer, CountVectorizerModel}

​ 接下来,根据SparkContext来创建一个SQLContext,其中sc是一个已经存在的SparkContext;然后导入sqlContext.implicits._来实现RDD到Dataframe的隐式转换。

scala> val sqlContext = new SQLContext(sc)sqlContext: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@225a9fc6

scala> import sqlContext.implicits._

import sqlContext.implicits._

假设我们有如下的DataFrame包含id和words两列,一共有两个文档。

scala> val df = sqlContext.createDataFrame(Seq(

| (0, Array("a", "b", "c")),

| (1, Array("a", "b", "b", "c", "a"))

| )).toDF("id", "words")

df: org.apache.spark.sql.DataFrame = [id: int, words: array]

​ 我们创建一个CountVectorizerModel,设定词汇表的最大size为3,设定词汇表中的词至少要在2个文档中出现过。

scala> val cvModel: CountVectorizerModel = new CountVectorizer().

| setInputCol("words").

| setOutputCol("features").

| setVocabSize(3).

| setMinDF(2).

| fit(df)

cvModel: org.apache.spark.ml.feature.CountVectorizerModel = cntVec_237a080886a2

scala> cvModel.transform(df).select("features").foreach { println }

[(3,[0,1,2],[1.0,1.0,1.0])]

[(3,[0,1,2],[2.0,2.0,1.0])]

​ 从打印结果我们可以看到,词汇表中有“a”,“b”,“c”三个词,且这三个词都在2个文档中出现过。其中结果中前面的3代表的是vocabsize;“a”和“b”都出现了3次,而“c”出现两次,所以在结果中0和1代表“a”和“b”,2代表“c”;后面的数组是相应词语在各个文档中出现次数的统计。倘若把vocabsize设为2,则不会出现“c”。

​ 也可以用下面的方式来创建一个CountVectorizerModel,通过指定一个数组来预定义一个词汇表,在本例中即只包含“a”,“b”,“c”三个词。

scala> val cvm = new CountVectorizerModel(Array("a", "b", "c")).

| setInputCol("words").

| setOutputCol("features")

cvm: org.apache.spark.ml.feature.CountVectorizerModel = cntVecModel_c6a17c2befee

scala> cvm.transform(df).select("features").foreach { println }

[(3,[0,1,2],[1.0,1.0,1.0])]

[(3,[0,1,2],[2.0,2.0,1.0])]

dafa0ef021bf79cce28e3f06b56d675e.png

20aae5f031798b13326d9c99611e62c6.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值