使用libSvm实现文本分类的基本过程,此文参考 使用libsvm实现文本分类 对前期数据准备及后续的分类测试进行了验证,同时对文中作者的分词组件修改成hanLP分词,对数字进行过滤,仅保留长度大于1的词进行处理。

转上文作者写的分类流程:

选择文本训练数据集和测试数据集:训练集和测试集都是类标签已知的;

训练集文本预处理:这里主要包括分词、去停用词、建立词袋模型(倒排表);

选择文本分类使用的特征向量(词向量):最终的目标是使得最终选出的特征向量在多个类别之间具有一定的类别区分度,可以使用相关有效的技术去实现特征向量的选择,由于分词后得到大量的词,通过选择降维技术能很好地减少计算量,还能维持分类的精度;

输出libsvm支持的量化的训练样本集文件:类别名称、特征向量中每个词元素分别到数字编号的映射转换,以及基于类别和特征向量来量化文本训练集,能够满足使用libsvm训练所需要的数据格式;

测试数据集预处理:同样包括分词(需要和训练过程中使用的分词器一致)、去停用词、建立词袋模型(倒排表),但是这时需要加载训练过程中生成的特征向量,用特征向量去排除多余的不在特征向量中的词(也称为降维);

输出libsvm支持的量化的测试样本集文件:格式和训练数据集的预处理阶段的输出相同;

使用libsvm训练文本分类器:使用训练集预处理阶段输出的量化的数据集文件,这个阶段也需要做很多工作(后面会详细说明),最终输出分类模型文件;

使用libsvm验证分类模型的精度:使用测试集预处理阶段输出的量化的数据集文件,和分类模型文件来验证分类的精度;

分类模型参数寻优:如果经过libsvm训练出来的分类模型精度很差,可以通过libsvm自带的交叉验证(Cross Validation)功能来实现参数的寻优,通过搜索参数取值空间来获取最佳的参数值,使分类模型的精度满足实际分类需要。

文本预处理阶段,增加了基于hanLP的分词,代码如下:

/*** 使用hanlp进行分词

* Created by zhouyh on 2018/5/30.*/

public class HanLPDocumentAnalyzer extends AbstractDocumentAnalyzer implementsDocumentAnalyzer {private static final Log LOG = LogFactory.getLog(HanLPDocumentAnalyzer.class);publicHanLPDocumentAnalyzer(ConfigReadable configuration) {super(configuration);

}

@Overridepublic Mapanalyze(File file) {

String doc=file.getAbsolutePath();

LOG.debug("Process document: file=" +doc);

Map terms =Maps.newHashMap();

BufferedReader br= null;try{

br= new BufferedReader(new InputStreamReader(newFileInputStream(file), charSet));

String line= null;while((line = br.readLine()) != null) {

LOG.debug("Process line: " +line);

List termList =HanLP.segment(line);if (termList!=null && termList.size()>0){for(com.hankcs.hanlp.seg.common.Term hanLPTerm : termList){

String word=hanLPTerm.word;if (!word.isEmpty() && !super.isStopword(word)){if (word.trim().length()>1){

Pattern compile= Pattern.compile("(\\d+\\.\\d+)|(\\d+)|([\\uFF10-\\uFF19]+)");

Matcher matcher=compile.matcher(word);if (!matcher.find()){

Term term=terms.get(word);if (term == null){

term= newTermImpl(word);

terms.put(word, term);

}

term.incrFreq();

}

}

}else{

LOG.debug("Filter out stop word: file=" + file + ", word=" +word);

}

}

}

}

}catch(IOException e) {throw new RuntimeException("", e);

}finally{try{if(br != null) {

br.close();

}

}catch(IOException e) {

LOG.warn(e);

}

LOG.debug("Done: file=" + file + ", termCount=" +terms.size());

}returnterms;

}public static voidmain(String[] args){

String filePath= "/Users/zhouyh/work/yanfa/xunlianji/UTF8/train/ClassFile/C000008/0.txt";

HanLPDocumentAnalyzer hanLPDocumentAnalyzer= new HanLPDocumentAnalyzer(newConfiguration());

hanLPDocumentAnalyzer.analyze(newFile(filePath));

String str= "测试hanLP分词";

System.out.println(str);//Pattern compile = Pattern.compile("(\\d+\\.\\d+)|(\\d+)|([\\uFF10-\\uFF19]+)");//Matcher matcher = compile.matcher("9402");//if (matcher.find()){//System.out.println(matcher.group());//}

}

}

View Code

这里对原作者提供的训练集资源做了合并,将训练集扩大到10个类别,每个类别的8000文本中,前6000文本作为训练集,后2000文本作为测试集,文本结构如下图所示:

测试集中是同样的结构。

生成的特征向量与libsvm需要的训练集格式如下面所示:

libsvm训练集格式文档:

针对测试集也通过上述方式处理。

使用libSvm训练分类文本

文本转换:

./svm-scale -l 0 -u 1 /Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/train.txt > /Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/train-scale.txt

测试集也做同样转换:

./svm-scale -l 0 -u 1 /Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/test.txt > /Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/test-scale.txt

进行模型训练,此部分耗时较长:

./svm-train -h 0 -t 0 /Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/train-scale.txt /Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/model.txt

训练过程如下图所示:

训练完成会生成model文件

采用预先处理好的测试文本进行分类测试:

./svm-predict /Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/test-scale.txt /Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/model.txt /Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/predict.txt

得到结果为:Accuracy = 81.6568% (16333/20002) (classification)

整体流程做完,得到文件如下图所列:

至此,仿照原作者的思路,对libsvm的分类流程做了一次实践。

JAVA代码测试

建立相关java项目,引入libsvm的jar包,我这里采用maven搭建,引入jar包:

tw.edu.ntu.csie

libsvm

3.17

同时要把libsvm包中的svm_predict.java及svm_train.java引入,并对svm_predict.java的类做简单改动,将预测的结果值返回,测试代码如下:

public classLibSvmAlgorithm {public static voidmain(String[] args){

String[] testArgs= {"/Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/test-scale.txt", "/Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/model.txt", "/Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/predict1.txt"};try{

Double accuracy=svm_predict.main(testArgs);

System.out.println(accuracy);

}catch(IOException e) {

e.printStackTrace();

}

}

}

libsvm java 实例_LibSvm流程及java代码测试相关推荐

  1. 安装jdk配置环境、cmd命令行测试环境变量配置是否正确及运行java程序、安装IDEA编写代码测试

    文章目录 1.安装jdk配置环境 2.cmd命令行测试环境变量配置是否正确及运行java程序 3.安装IDEA编写代码测试 1.安装jdk配置环境 首先打开官网Oracle https://www.o ...

  2. libsvm java 实例_LibSVM Java API调用示例程序

    [实例简介] LibSVM Java API调用示例程序 Eclipse 完整工程可以运行 相关详情见http://blog.csdn.net/yangliuy/article/details/804 ...

  3. Java-Runoob-高级教程-实例-数组:03. Java 实例 – 获取数组长度-*

    ylbtech-Java-Runoob-高级教程-实例-数组:03. Java 实例 – 获取数组长度 1.返回顶部 Java 实例 - 获取数组长度  Java 实例 本文我们将为大家介绍如何使用数 ...

  4. Java实例教程(上)

    第一个Java程序 Java 枚举 Java注释 Java创建对象 Java访问实例变量和方法 Java局部变量实例 Java编译错误 Java 实例变量示例 Java类变量 静态变量示例 Java静 ...

  5. Java 实例 - 字符串分割和字符串分隔

    Java 实例 - 字符串分割和字符串分隔 Java 实例 - 字符串分隔(StringTokenizer) Java 中我们可以使用 StringTokennizer 设置不同分隔符来分隔字符串,默 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试

    前言 看到标题你可能会问为什么这一篇会谈到代码测试,不是说代码优化么?前两篇主要是讲了程序的输出及Log4j的使用,Log能够帮助我们进行bug的定位,优化开发流程,而代码测试有什么用呢?其实测试是为 ...

  7. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序

    1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...

  8. libsvm java 实例,libsvm-3.1

    [实例简介] libsvm-3.1是对MATLAB(2008版以后)中libsvm工具箱的补充,该补充工具包主要用来选择最佳的参数. [实例截图] [核心代码] 7c21e762-74e0-45bc- ...

  9. 外汇汇率接口 java_基于JAVA的货币汇率api调用代码实例

    代码描述:基于JAVA的货币汇率api调用代码实例 关联数据:货币汇率 接口地址:http://www.juhe.cn/docs/api/id/23 1.[代码][Java]代码 import jav ...

最新文章

  1. Python基础教程:列表(list)切片详细操作
  2. 如何用50行代码构建情感分类器
  3. 《白鹿原》金句摘抄(四)
  4. adobe 书签怎么设置_让我们设置一些规则…没有Adobe Analytics处理规则
  5. 第十三节:Lambda、linq、SQL的相爱相杀(2)
  6. 如何对web.config进行加密和解密
  7. vue组件穿方法_vue组件中的数据传递方法
  8. arcengine 图层中节点抽稀功能(c++)
  9. MySQL事务及隔离级别详解
  10. sublime连接Linux进行vim编辑
  11. java商城系统设计——秒杀
  12. 第八章笔记[计算机网络]
  13. [自用代码]基于python的遥感影像传统分割方法(直方图双峰法,阈值分割法,模糊C均值法,超像素分割法,K-means,snake)
  14. 【进阶版】 机器学习之主成分分析(PCA)、MDS算法、核化线性降维 (16)
  15. 特征选择(模型输入参数的分析选择)方法汇总
  16. 电脑卡,电脑比较卡问题都出在这里,怎么解决电脑卡顿方法
  17. Quantopian自学笔记04
  18. [总结]好书的评判标准
  19. 1024啊、终于等到了
  20. 全国青少年软件编程等级考试C语言标准解读(1_10级)

热门文章

  1. 微店API分享:获得微店商品详情 API 返回值说明
  2. Iterator对象
  3. 步进电机 高速光耦_高速光耦的工作原理!
  4. 使用pxe安装uos系统
  5. 【可视化】复变函数可视化-复变函数导数
  6. 有理函数分解成部分分式的几种方法
  7. Hadoop入门学习笔记-第五天(hadoop-hive安装部署与配置笔记)
  8. 每天学点Python之数值类型
  9. Windows线程同步、CreateThread与_beginthread的区别
  10. 我来比较好国企和好外企