文本分类是指将一篇文章归到事先定义好的某一类或者某几类,在数据平台的一个典型的应用场景是,通过爬取用户浏览过的页面内容,识别出用户的浏览偏好,从而丰富该用户的画像。
本文介绍使用Spark MLlib提供的朴素贝叶斯(Naive Bayes)算法,完成对中文文本的分类过程。主要包括中文分词、文本表示(TF-IDF)、模型训练、分类预测等。
特征工程
文本处理
对于中文文本分类,需要先对内容进行分词,我使用的是ansj中文分析工具,其中自己可以配置扩展词库来使分词结果更合理,同时可以加一些停用词可以提高准确率,需要把数据样本分割成两批数据,一份用于训练模型,一份用于测试模型效果。
代码
目录结构

DataFactory.java
package com.maweiming.spark.mllib.classifier;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.maweiming.spark.mllib.utils.AnsjUtils;
import com.maweiming.spark.mllib.utils.FileUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 1、first step
* data format
* Created by Coder-Ma on 2017/6/12.
*/
public class DataFactory {
public static final String CLASS_PATH = "/Users/coderma/coders/github/SparkTextClassifier/src/main/resources";
public static final String STOP_WORD_PATH = CLASS_PATH + "/data/stopWord.txt";
public static final String NEWS_DATA_PATH = CLASS_PATH + "/data/NewsData";
public static final String DATA_TRAIN_PATH = CLASS_PATH + "/data/data-train.txt";
public static final String DATA_TEST_PATH = CLASS_PATH + "/data/data-test.txt";
public static final String MODELS = CLASS_PATH + "/models";
public static final String MODEL_PATH = CLASS_PATH + "/models/category-4";
public static final String LABEL_PATH = CLASS_PATH + "/models/labels.txt";
public static final String TF_PATH = CLASS_PATH + "/models/tf";
public static final String IDF_PATH = CLASS_PATH + "/models/idf";
public static void main(String[] args) {
/**
* 收集数据、特征工程
* 1、遍历数据样本目录
* 2、对数据进行清洗,剔除掉停用词
*/
//数据样本切割比例 80%用于训练样本,20%数据用于测试模型准确率
Double spiltRate = 0.8;
//停用词
List<String> stopWords = FileUtils.readLine(line -> line, STOP_WORD_PATH);
//分类标签(标签id,分类名)
Map<Integer, String> labels = new HashMap<>();
Integer dirIndex = 0;
String[] dirNames = new File(NEWS_DATA_PATH).list();
for (String dirName : dirNames) {
dirIndex++;
labels.put(dirIndex, dirName);
String fileDirPath = String.format("%s/%s", NEWS_DATA_PATH, dirName);
String[] fileNames = new File(fileDirPath).list();
//当前分类目录的样本总数 * 切割比率
int spilt = Double.valueOf(fileNames.length * spiltRate).intValue();
for (int i = 0; i < fileNames.length; i++) {
String fileName = fileNames[i];
String filePath = String.format("%s/%s", fileDirPath, fileName);
System.out.println(filePath);
String text = FileUtils.readFile(filePath);
for (String stopWord : stopWords) {
text = text.replaceAll(stopWord, "");
}
if (StringUtils.isBlank(text)) {
continue;
}
//把文本内容进行分词
List<String> wordList = AnsjUtils.participle(text);
JSONObject data = new JSONObject();
data.put("text", wordList);

最低0.47元/天 解锁文章
3195





