在上篇文章中对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. js自定义方法绑定元素事件

    //事件绑定封装 function addEvent(elem, type, handle){ if(elem.addEventListener){ elem.addEventListener(typ ...

  2. P1136 迎接仪式 题解

    题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出"欢迎欢迎欢迎欢 ...

  3. Python Ethical Hacking - Malware Packaging(2)

    PACKAGING FOR WINDOWS FROM LINUX For best results package the program from the same OS as the target ...

  4. 事件循环 event loop 究竟是什么

    事件循环 event loop 究竟是什么 一些概念 浏览器运行时是多进程,从任务管理器或者活动监视器上可以验证. 打开新标签页和增加一个插件都会增加一个进程,如下图:  浏览器渲染进程是多线程,包 ...

  5. 2.UDP协议

    UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能. 应用层给UDP多长的报文,UDP就照样发送,即一次发送一个完整报文 一.UDP首部格式 这里的长度是指(首部+数据) UDP校验 ...

  6. Java中static、final和static final(final static)的区别(转)

    大佬的总结(大赞!) final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final修饰的属性跟具体对象有关, ...

  7. 关于node-sass安装失败问题

    在进行Vue开发中npm run dev报错,按照提示尝试进行npm以及cnpm安装均失败 解决办法:npm uninstall node-sass卸载模块 指定淘宝镜像源安装 npm i node- ...

  8. jmeter压力测试报错:java.net.BindException: Address already in use: connect || java.net.SocketException: Socket closed

    windows提供给TCP/IP链接的端口为 1024-5000,并且要四分钟来循环回收它们,就导致我们在短时间内跑大量的请求时将端口占满了,导致如上报错. 解决办法(在jmeter所在服务器操作): ...

  9. nginx Dockerfile

    FROM centos MAINTAINER zengxh RUN yum install -y epel-release vim pcre-devel wget net-tools gcc zlib ...

  10. 关于if后有无else谜题

    在自定义函数中 for(i=1;i<=6;i++) { if(a%i==0) return 0; else return 1; } 意思是,如果有一个除不尽就返回零,有一个除尽会立刻返回一. 如 ...