2019独角兽企业重金招聘Python工程师标准>>>

中文分词

对于中文文本分类而言,需要先对文章进行分词,我使用的是IKAnalyzer中文分析工具,其中自己可以配置扩展词库来使分词结果更合理,我从搜狗、百度输入法下载了细胞词库,将其作为扩展词库。这里不再介绍分词。

中文词语特征值转换(TF-IDF)

分好词后,每一个词都作为一个特征,但需要将中文词语转换成Double型来表示,通常使用该词语的TF-IDF值作为特征值,Spark提供了全面的特征抽取及转换的API,非常方便,详见http://spark.apache.org/docs/latest/ml-features.html,这里介绍下TF-IDF的API:

比如,训练语料/tmp/lxw1234/1.txt:

0,苹果 官网 苹果 宣布
1,苹果 梨 香蕉

逗号分隔的第一列为分类编号,0为科技,1为水果。

case class RawDataRecord(category: String, text: String)val conf = new SparkConf().setMaster("yarn-client")
val sc = new SparkContext(conf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._//将原始数据映射到DataFrame中,字段category为分类编号,字段text为分好的词,以空格分隔
var srcDF = sc.textFile("/tmp/lxw1234/1.txt").map { x => var data = x.split(",")RawDataRecord(data(0),data(1))
}.toDF()srcDF.select("category", "text").take(2).foreach(println)
[0,苹果 官网 苹果 宣布]
[1,苹果 梨 香蕉]
//将分好的词转换为数组
var tokenizer = new Tokenizer().setInputCol("text").setOutputCol("words")
var wordsData = tokenizer.transform(srcDF)wordsData.select($"category",$"text",$"words").take(2).foreach(println)
[0,苹果 官网 苹果 宣布,WrappedArray(苹果, 官网, 苹果, 宣布)]
[1,苹果 梨 香蕉,WrappedArray(苹果, 梨, 香蕉)]//将每个词转换成Int型,并计算其在文档中的词频(TF)
var hashingTF =
new HashingTF().setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(100)
var featurizedData = hashingTF.transform(wordsData)

这里将中文词语转换成INT型的Hashing算法,类似于Bloomfilter,上面的setNumFeatures(100)表示将Hash分桶的数量设置为100个,这个值默认为2的20次方,即1048576,可以根据你的词语数量来调整,一般来说,这个值越大,不同的词被计算为一个Hash值的概率就越小,数据也更准确,但需要消耗更大的内存,和Bloomfilter是一个道理。

featurizedData.select($"category", $"words", $"rawFeatures").take(2).foreach(println)
[0,WrappedArray(苹果, 官网, 苹果, 宣布),(100,[23,81,96],[2.0,1.0,1.0])]
[1,WrappedArray(苹果, 梨, 香蕉),(100,[23,72,92],[1.0,1.0,1.0])]

结果中,“苹果”用23来表示,第一个文档中,词频为2,第二个文档中词频为1.

//计算TF-IDF值
var idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")
var idfModel = idf.fit(featurizedData)
var rescaledData = idfModel.transform(featurizedData)
rescaledData.select($"category", $"words", $"features").take(2).foreach(println)[0,WrappedArray(苹果, 官网, 苹果, 宣布),(100,[23,81,96],[0.0,0.4054651081081644,0.4054651081081644])]
[1,WrappedArray(苹果, 梨, 香蕉),(100,[23,72,92],[0.0,0.4054651081081644,0.4054651081081644])]//因为一共只有两个文档,且都出现了“苹果”,因此该词的TF-IDF值为0.

最后一步,将上面的数据转换成Bayes算法需要的格式,如:

https://github.com/apache/spark/blob/branch-1.5/data/mllib/sample_naive_bayes_data.txtvar trainDataRdd = rescaledData.select($"category",$"features").map {case Row(label: String, features: Vector) =>LabeledPoint(label.toDouble, Vectors.dense(features.toArray))
}

每一个LabeledPoint中,特征数组的长度为100(setNumFeatures(100)),”官网”和”宣布”对应的特征索引号分别为81和96,因此,在特征数组中,第81位和第96位分别为它们的TF-IDF值。

到此,中文词语特征表示的工作已经完成,trainDataRdd已经可以作为Bayes算法的输入了。

分类模型训练

训练模型,语料非常重要,我这里使用的是搜狗提供的分类语料库,很早之前的了,这里只作为学习测试使用。

下载地址在:http://www.sogou.com/labs/dl/c.html,语料库一共有10个分类:

C000007 汽车
C000008 财经
C000010  IT
C000013 健康
C000014 体育
C000016 旅游
C000020 教育
C000022 招聘
C000023 文化
C000024 军事

每个分类下有几千个文档,这里将这些语料进行分词,然后每一个分类生成一个文件,在该文件中,每一行数据表示一个文档的分词结果,重新用0-9作为这10个分类的编号:

0 汽车
1 财经
2 IT
3 健康
4 体育
5 旅游
6 教育
7 招聘
8 文化
9 军事

比如,汽车分类下的文件内容为:

数据准备好了,接下来进行模型训练及分类预测,代码:

package com.lxw1234.textclassificationimport scala.reflect.runtime.universeimport org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.ml.feature.HashingTF
import org.apache.spark.ml.feature.IDF
import org.apache.spark.ml.feature.Tokenizer
import org.apache.spark.mllib.classification.NaiveBayes
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.sql.Rowobject TestNativeBayes {case class RawDataRecord(category: String, text: String)def main(args : Array[String]) {val conf = new SparkConf().setMaster("yarn-client")val sc = new SparkContext(conf)val sqlContext = new org.apache.spark.sql.SQLContext(sc)import sqlContext.implicits._var srcRDD = sc.textFile("/tmp/lxw1234/sougou/").map { x => var data = x.split(",")RawDataRecord(data(0),data(1))}//70%作为训练数据,30%作为测试数据val splits = srcRDD.randomSplit(Array(0.7, 0.3))var trainingDF = splits(0).toDF()var testDF = splits(1).toDF()//将词语转换成数组var tokenizer = new Tokenizer().setInputCol("text").setOutputCol("words")var wordsData = tokenizer.transform(trainingDF)println("output1:")wordsData.select($"category",$"text",$"words").take(1)//计算每个词在文档中的词频var hashingTF = new HashingTF().setNumFeatures(500000).setInputCol("words").setOutputCol("rawFeatures")var featurizedData = hashingTF.transform(wordsData)println("output2:")featurizedData.select($"category", $"words", $"rawFeatures").take(1)//计算每个词的TF-IDFvar idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")var idfModel = idf.fit(featurizedData)var rescaledData = idfModel.transform(featurizedData)println("output3:")rescaledData.select($"category", $"features").take(1)//转换成Bayes的输入格式var trainDataRdd = rescaledData.select($"category",$"features").map {case Row(label: String, features: Vector) =>LabeledPoint(label.toDouble, Vectors.dense(features.toArray))}println("output4:")trainDataRdd.take(1)//训练模型val model = NaiveBayes.train(trainDataRdd, lambda = 1.0, modelType = "multinomial")   //测试数据集,做同样的特征表示及格式转换var testwordsData = tokenizer.transform(testDF)var testfeaturizedData = hashingTF.transform(testwordsData)var testrescaledData = idfModel.transform(testfeaturizedData)var testDataRdd = testrescaledData.select($"category",$"features").map {case Row(label: String, features: Vector) =>LabeledPoint(label.toDouble, Vectors.dense(features.toArray))}//对测试数据集使用训练模型进行分类预测val testpredictionAndLabel = testDataRdd.map(p => (model.predict(p.features), p.label))//统计分类准确率var testaccuracy = 1.0 * testpredictionAndLabel.filter(x => x._1 == x._2).count() / testDataRdd.count()println("output5:")println(testaccuracy)}
}

执行后,主要输出如下:

output1:(将词语转换成数组)

output2:(计算每个词在文档中的词频)

output3:(计算每个词的TF-IDF)

output4:(Bayes算法的输入数据格式)

output5:(测试数据集分类准确率)

准确率90%,还可以。接下来需要收集分类更细,时间更新的数据来训练和测试了。

转载于:https://my.oschina.net/xiaoluobutou/blog/680556

Spark MLlib实现的中文文本分类–Naive Bayes相关推荐

  1. 基于 spark ml NaiveBayes实现中文文本分类

    思路: 1  准备数据 2,代码编写 准备数据       这里数据我将它分为两类, 1 军事,2 nba   , 我将文件数据放在下面   代码编写: 这里面我用的是spark  ml  进行代码的 ...

  2. 详解CNN实现中文文本分类过程

    摘要:本文主要讲解CNN实现中文文本分类的过程,并与贝叶斯.决策树.逻辑回归.随机森林.KNN.SVM等分类算法进行对比. 本文分享自华为云社区<[Python人工智能] 二十一.Word2Ve ...

  3. 万字总结Keras深度学习中文文本分类

    摘要:文章将详细讲解Keras实现经典的深度学习文本分类算法,包括LSTM.BiLSTM.BiLSTM+Attention和CNN.TextCNN. 本文分享自华为云社区<Keras深度学习中文 ...

  4. 中文文本分类语料库-TanCorpV1.0

    转自 http://www.360doc.com/content/12/0216/21/3430376_187198503.shtml 中文文本分类语料库-TanCorpV1.0 谭松波,王月粉 1 ...

  5. 【文本分类】基于改进TF-IDF特征的中文文本分类系统

    摘要:改进TFIDF,提出相似度因子,提高了文本分类准确率. 参考文献:[1]但唐朋,许天成,张姝涵.基于改进TF-IDF特征的中文文本分类系统[J].计算机与数字工程,2020,48(03):556 ...

  6. 【NLP】BERT 模型与中文文本分类实践

    简介 2018年10月11日,Google发布的论文<Pre-training of Deep Bidirectional Transformers for Language Understan ...

  7. 【NLP】Kaggle从零到实践:Bert中文文本分类

    Bert是非常强化的NLP模型,在文本分类的精度非常高.本文将介绍Bert中文文本分类的基础步骤,文末有代码获取方法. 步骤1:读取数据 本文选取了头条新闻分类数据集来完成分类任务,此数据集是根据头条 ...

  8. 七、朴素贝叶斯中文文本分类

    1.朴素贝叶斯中文文本分类 中文分词 停用词 朴素贝叶斯中文分类举例:新闻文档分类 朴素贝叶斯中文分类的具体过程:加载停用词.中文分词.文本向量化.模型训练和保存.模型的加载和预测. 2 中文分词 2 ...

  9. [Python人工智能] 二十一.Word2Vec+CNN中文文本分类详解及与机器学习(RF\DTC\SVM\KNN\NB\LR)分类对比

    从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章分享了Keras实现RNN和LSTM的文本分类算法,并与传统的机器学习分类算法进行对比实验.这篇文章我们将继续巩固 ...

最新文章

  1. 算法战争:美国国家AI安全委员会要建立AI大学,「数字服务学院」为政府培养AI人才...
  2. 当心花招,关注全闪存性能
  3. C语言中定义加号的数据类型,C/C++知识点之c语言基础数据类型及命名规范
  4. matlab patch函数_MATLAB实现紧束缚近似能带结构画图
  5. python multiprocessing lock_python多进程Lock锁
  6. action与servlet用法区别
  7. 2020\Simulation_1\2.约数个数
  8. python 无法引用 tensorflow.keras_win10+anaconda安装tensorflow和keras遇到的坑小结
  9. Spark学习笔记——构建基于Spark的推荐引擎
  10. matlab中cell(17),Matlab中uigetfile( ) iscell() 函数的使用
  11. 二极管双平衡混频器的原理[ZT]
  12. app 手机网页一些小知识
  13. Python例题:设计一个工资(月薪)结算系统
  14. 考研英语 单词常见熟词生义
  15. HTML以及CSS制作相册
  16. 程序员成长之路(一)
  17. Redis到底是什么?
  18. 【Mo 人工智能技术博客】图卷积网络概述及其在论文分类上的应用
  19. 来自鹅厂的面试经验(干货)
  20. 计算机科学导论(6):操作系统

热门文章

  1. 重温目标检测--YOLO v3
  2. 人脸检测对齐--Joint Cascade Face Detection and Alignment
  3. sc修改服务器,华为sc服务器配置方法
  4. Java 两个引用类型相等_java-Spring配置:2个具有相同类引用的bean
  5. ThinkPHP 集成 PHPUnit 8 测试框架进行单元测试
  6. mac下nginx搭配php-fpm解析php文件
  7. 计算机主机的灯一直闪,电脑硬盘灯一直闪怎么办|电脑硬盘灯狂闪的解决方法...
  8. 东田纳西州立大学计算机排名,2019东田纳西州立大学世界排名
  9. java 精确 计算_java中进行高精度精准计算
  10. inner class java_Java Inner Class