在上篇文章中对libsvm的流程和简单的java代码测试做了说明,本篇简单对libsvm如何在工程中实践进行简短说明,不当的地方欢迎大家指正。

第一步是对libsvm的预测函数进行调整,我是从svm_predict类中抽取部分代码组成预测防范,代码如下:

/**
* 对传入的文本特征根据训练好的分类模型进行分类
* @param model 已经训练好的模型
* @param contentFeature 传入的计算好的文本分词后的特征
* @return
*/
public static int libSvmPredict(svm_model model, String contentFeature){
//默认分类类别为-1
int label = -1;
//判断传入的文本特征是否为空
if (contentFeature == null) return label;
//对传入的特征进行切分
StringTokenizer st = new StringTokenizer(contentFeature," \t\n\r\f:");
//这里target用不到,测试中会用到,即我们测试语料的类别标签
// double target = atof(st.nextToken());
int m = st.countTokens()/2;
svm_node[] x = new svm_node[m];
for(int j=0;j<m;j++)
{
x[j] = new svm_node();
x[j].index = atoi(st.nextToken());
x[j].value = atof(st.nextToken());
} double v = svm.svm_predict(model,x);
label = (int) v;
return label;
}

第二步对待分类的文本按照上篇文章中讲到的方法根据terms词表生成libsvm需要的格式,注意我这里为了方便仅做了词的tf,idf默认都为1,代码如下:

/**
* 获取模型分词用的term词表
* @param termsPath
* @return
*/
public static Map<String, Integer> getModelTerms(String termsPath){
Map<String, Integer> termsMap = new HashMap<String, Integer>( );
try {
String termsStr = FileOptionUtil.readFile( termsPath, "UTF-8" );
if (termsStr != null){
String[] terms = termsStr.split( "\r\n" );
if (terms!=null && terms.length>0){
for (int i=0; i<terms.length; i++){
String term = terms[i];
String[] termM = term.split( "\t" );
if (termM!=null && termM.length==2){
termsMap.put( termM[0], Integer.parseInt(termM[1]) );
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return termsMap;
} public static String getContentFeature(String content, Map<String, Integer> terms){
String contentFature = "";
//对传入的文本进行分词
Map<String, Integer> contentTermsMap = HanLPAnalyser.segString( content );
Map<Integer, Double> contentTfIdf = new TreeMap<Integer, Double>( new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo( o2 );
}
} );
//计算tf-idf,这里我们就用单存的tf代替tf-idf,idf值均为1
for (String word : contentTermsMap.keySet()){
if (terms.containsKey( word )){
contentTfIdf.put( terms.get( word ), getWordTF( word, contentTermsMap ) );
}
} for (Integer key : contentTfIdf.keySet()){
contentFature += key + ":" + contentTfIdf.get( key ) + " ";
} return contentFature.trim();
}

第三步根据上述方法进行分类计算,main方法代码如下:

public static void main(String[] args){
String s = "&nbsp&nbsp&nbsp&nbsp依照上海证券交易所发布的《关于证券公司创设白云机场权证有关事项的\n" +
"通知》,光大证券股份有限公司向上海证券交易所申请注销白云机场认沽权证并\n" +
"已获核准,中国证券登记结算有限责任公司上海分公司已办理相应登记手续。本\n" +
"公司此次获准注销的白云机场认沽权证数量为1,500万份,该权证的条款与原白\n" +
"云机场认沽权证(交易简称机场JTP1、交易代码580998、行权代码582998)的条\n" +
"款完全相同。\n" +
"&nbsp&nbsp&nbsp&nbsp\n";
Map<String, Integer> terms = LibSvmDataProcess.getModelTerms( "/Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/terms.txt" );
String contentFeature = LibSvmDataProcess.getContentFeature( s, terms);
svm_model model = GetSvmModel.getSvmModelInstance().getModel( "/Users/zhouyh/work/yanfa/xunlianji/UTF8/heji/model.txt" );
int label = libSvmPredict(model, contentFeature);
System.out.println(label);
}

测试结果如图,财经类和我们选择的语料类别也一致,如下图所示:

最后,此代码仅为将libsvm如何在工程中实践做了下流程走通,后续要在工程中使用,还需要做很多的调整。

Libsvm java工程实践的更多相关文章

  1. Quartz应用实践入门案例二(基于java工程)

    在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任 ...

  2. 大型网站系统与Java中间件实践

    大型网站系统与Java中间件实践(贯通分布式高并发高数据高访问量网站架构与实现之权威著作,九大一线互联网公司CTO联合推荐) 曾宪杰 著   ISBN 978-7-121-22761-5 2014年4 ...

  3. Eclipse使用Maven创建普通Java工程时错误:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart:RELEASE from any of the configured repositories.

    报错信息如下: Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart:RELEASE f ...

  4. Maven学习(2) - Maven构建多模块Java工程

    概述 项目开发时,通常会将项目分为多个模块进行开发,本文讨论如何用Maven构建多模块的Java工程. 软件环境 Java:1.6.0_26 Maven:3.1.1 OS:WindowXP SP3 项 ...

  5. 工程实践:给函数取一个"好"的名字

    工程实践:给函数取一个"好"的名字 早在2013年,国外有个程序员做了一个有意思的投票统计(原始链接请见:<程序员:你认为最难做的事情是什么?>),该投票是让程序员从以 ...

  6. 《大型网站系统与JAVA中间件实践》读书笔记-消息中间件

    消息中间件 1.消息中间件的价值 1.1 透过示例看消息中间件对应用的解耦 1.1.1.通过服务调用让其他系统感知事件发生的方式 假设我们要做一个用户登录系统,其中需要支持的一个功能是,用户登录成功 ...

  7. AES加密原理和AOE工程实践

    在AI业务的开发的过程中,我们常常需要对模型文件进行加密.我们从以下几个方面来说一说AES的加密原理以及AOE里的工程实践. 常见的加密算法 AOE对模型加密需求的思考 AES的加密原理 AOE工程实 ...

  8. java工程打成jar包 - 使用maven assembly插件打包及手动打包

    在java工程打包的过程中遇到过不少问题,现在总结一下.一种是典型的maven工程打包,依赖的jar包全都在pom.xml中指定,这种方式打包很方便:另一种是依赖了本机jar包(不能通过pom.xml ...

  9. 基于menu小插件探索工程实践

    目录 一.准备工作 1.C/C++环境搭建 2.VSCode的配置 (1) 安装插件: (2) 设置配置文件: 二.工程化编程实战 1.模块化设计 2.可重用设计:进一步抽象 menu的进一步优化 可 ...

随机推荐

  1. python 面向对象专题(五):私有成员、类方法、静态方法、属性、isinstance/issubclass

    https://www.cnblogs.com/liubing8/p/11325421.html 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubc ...

  2. Go的100天之旅-06数组和Slice

    目录 数组 Slice 数组 Go的数组和其它语言基本上一样,是长度固定的特定类型元素组成的序列,这基本上是所有语言数组的特性.和其它语言相比差异主要在声明和初始化的写法上,下面是简单声明一个数组: ...

  3. p44_IP数据包格式

    一.IP数据报格式 二.IP分片 数据链路层每帧可封装数据有上限,IP数据超过的要分片. 标识:同一数据报的分片使用同一标识 标志: 片偏移(13bit):用于还原数据报顺序,指出某片在原分组1中的相 ...

  4. postman之测试集

    简单点,说话的方式简单点 步骤1:测试全部通过,哈哈~ 开玩笑! 适用场景:多组数据测试,像排比句那样,有规律,比如姓名,性别,年龄.这时候的测试要求就是这些信息与返回体的结果做比较!! 步骤1:创建 ...

  5. 设计模式:mediator模式

    目的:解决多组件之间的通信问题,使得组件之间的通信变得简单 核心:提供一个管理类,用来处理组件之间的通信,所有的组件只和管理类通信,组件彼此之间不在单独通信 例子: class Mediator { ...

  6. 从零开始一起学Blazor WebAssembly 开发(4)

    登录模块基本完成了,登录主要用了以下几个点: 1.后端采用的Abp Vnext 框架,这个框架自带的IdentityServer4用户角色权限控制,这个框架登录研究了好一阵子,有几个坑这里说下: 1) ...

  7. javac不是内部或外部命令,也不是可运行的程序或批处理文件的错误解决方法(Windows10/Windows7)

    前言:在配置JDK环境变量后,java显示正常,javac则显示javac不是内部或外部命令,也不是可运行的程序或批处理文件.造成javac不是内部或外部命令,也不是可运行的程序或批处理文件的问题一般 ...

  8. [leetcode/lintcode 题解] 谷歌面试题:找出有向图中的弱连通分量

    请找出有向图中弱连通分量.图中的每个节点包含 1 个标签和1 个相邻节点列表.(有向图的弱连通分量是任意两点均有有向边相连的极大子图) 将连通分量内的元素升序排列. 在线评测地址:https://ww ...

  9. Java基础知识_内存

    前述:利用一段较为充足暑假时间,对以前的Java学习进行一个系统性的回顾,对于部分知识点进行记录和积累. Java中的内存 一 Java中的内存划分: Java中内存主要划分为五部分 栈(Stack) ...

  10. SSM框架练习之Jsp页面使用taglib标签报错500的问题

    最近在练手一个SSM的基于AdminLET框架模板的后台管理系统,使用的环境是tomcat9,使用Maven构建并通过添加Web模板框架的项目,在添加完所有的配置文件后启动tomcat运行,出现了一个 ...