文本特征提取_03:基于词频数的文档向量CountVectorizer

来源:互联网 发布:多线程编程java面试题 编辑:程序博客网 时间:2024/05/22 14:30

王小草SparkML笔记


笔记整理时间:2017年1月10日
笔记整理者:王小草


1. 基于词频数的文档向量

在文本特征提取_01和02中分别介绍了TF-IDF文档矩阵和基于神经网络的word2vec词嵌入矩阵。本文我们要介绍的是一个非常基础非常简单的文档向量表征。

做过LDA的小伙伴知道对于文档的特征,它只需要每个词在该文档中出现的频数即可。因此简单而言,根据频数(token counts)可以将一个文档转换成一个向量。

假设有两篇文档,分词后以词的数组形式表示,如下:

id texts 0 Array(“a”, “b”, “c”) 1 Array(“a”, “b”, “b”, “c”, “a”)

通过计算词频,文档可以表示成如下表格中的第三列:

id texts vector 0 Array(“a”, “b”, “c”) (3,[0,1,2],[1.0,1.0,1.0]) 1 Array(“a”, “b”, “b”, “c”, “a”) (3,[0,1,2],[2.0,2.0,1.0])

将两篇文档中的词去重后就组成了一个字典,这个字典中有3个词:a,b,c,分别建立索引为0,1,2.
在第三列的文档向量,是由基于字典的索引向量,与对应对索引的词频向量所组成的。
文档向量是稀疏的表征,例子中只有3个词可能感觉不出,在实际业务中,字典的长度是上万,而文章中出现的词可能是几百或几千,故很多索引对应的位置词频都是0.

2. Spark代码

来看看官网上的案例。

object FeatureExtraction {  def main(args: Array[String]) {    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)    val conf = new SparkConf().setAppName("FeatureExtraction").setMaster("local")    val sc = new SparkContext(conf)    val spark = SparkSession      .builder()      .appName("Feature Extraction")      .config("spark.some.config.option", "some-value")      .getOrCreate()      // 人为得创建一个df    val df = spark.createDataFrame(Seq(      (0, Array("a", "b", "c")),      (1, Array("a", "b", "b", "c", "a"))    )).toDF("id", "words")    //训练CountVectorizerModel    val cvModel: CountVectorizerModel = new CountVectorizer()      .setInputCol("words")      .setOutputCol("features")      .setVocabSize(3)      .setMinDF(2)      .fit(df)    //也可以基于已有的字典训练模型    val cvm = new CountVectorizerModel(Array("a", "b", "c"))      .setInputCol("words")      .setOutputCol("features")    //预测    cvModel.transform(df).show(false)    spark.stop()  }}

打印的结果:

+---+---------------+-------------------------+|id |words          |features                 |+---+---------------+-------------------------+|0  |[a, b, c]      |(3,[0,1,2],[1.0,1.0,1.0])||1  |[a, b, b, c, a]|(3,[0,1,2],[2.0,2.0,1.0])|+---+---------------+-------------------------+
0 0
原创粉丝点击