在上篇文章中对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. Odoo13之在tree视图左上角添加自定义按钮

    前言 首先展示效果图,如下图所示,在资产设备模块tree视图的左上角添加了一个同步资产的按钮. 要完成按钮的添加,分为四步,分别是: 1.编写xml文件,找到相关模型tree视图,并给模型tree视图 ...

  2. CSS3 文字边框 -webkit-text-stroke 镂空的字体

    CSS边框的一个不足就是只有矩形的元素才能使用. -webkit-text-stroke可以为文字添加边框.它不但可以设置文字边框的宽度,也能设置其颜色. 而且,配合使用color: transpar ...

  3. (2)简单理解和使用webpack-dev-server

    webpack-dev-server能做什么? 每次打包都得像之前一样使用webapck 入口文件 -o 出口文件,每次修改都得打包一次过于麻烦,可以使用webpack-dev-server实现自动打 ...

  4. 第一部分软件测试综述——软件测试背景【软件测试】(美)Ron Patton中文电子版

    截取自:第一部分软件测试综述——软件测试背景[软件测试](美)Ron Patton中文电子版(有需要的可以关注我) 第一部分软件测试综述 对手的程序死掉叫崩溃.自己的程序死掉叫“身体不良反应(idio ...

  5. html 转义和反转义

    public static void main(String[] args) {// String html = "<img style=\"width: 100%; hei ...

  6. OSCP Learning Notes - File Transfers(2)

    Metasploit Target Server: Kioptrix Level 1 (1) Start the Metasploit on Kali Linux. (2) Set the modul ...

  7. Web优化躬行记(1)——CSS

    Web优化的对象包括页面性能.用户体验.开发效率.代码优化.网络延迟等,本系列会列举出众多常用的优化技巧,每个技巧都可深入分析,在此只做抛砖引玉. 本系列优化内容提炼于<前端面试宝典>.& ...

  8. Zuul原理

    @EnableZuulProxy和@EnableZuulServer @EnableZuulProxy和@EnableZuulServer通过实例化不同的Marker,走不同的AutoConfigur ...

  9. 富文本数据 解析HTML

    后台返回给前端的富文本数据如: { "status": 1, "info": "获取活动数据成功", "data": [ ...

  10. Day02_CMS前端开发

    CMS前端开发 1 Vue.js与Webpack研究 参考链接:https://www.cnblogs.com/artwalker/p/13387386.html 2 CMS前端工程创建 2.1 导入 ...