Java Spark ML实现的文本分类

文本分类是指将一篇文章归到事先定义好的某一类或者某几类,在数据平台的一个典型的应用场景是,通过爬取用户浏览过的页面内容,识别出用户的浏览偏好,从而丰富该用户的画像。
本文介绍使用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);
   
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值