1.步骤一览

2.步骤详情

2.1.环境准备

Swig(Simplified Wrapper and Interface Generator)下载,Windows操作系统直接解压即可使用

CRF++(Yet Another CRF toolkit)下载,CRF++-0.58zip和CRF++-0.58.tar.gz两个版本最好都下载,方便我们后续操作

VS2013下载,本文用的是试用版

2.2.Swig包装CRF++

2.2.1.包装文件准备

用Swig包装CRF++主要用到以下源文件,CRF++-0.58.zip\CRF++-0.58\sdk\crfpp.h, CRF++-0.58.zip\CRF++-0.58\sdk\libcrfpp.lib

还需要一个SWIG接口文件,接口文件CRFPP.i我们直接从CRF++-0.58.tar.gz\CRF++-0.58\swig目录下解压拷贝出来,顺便也将version.h拷出来,与其它原文件放在一起。目录结构如下:

现在来看一下接口文件里的内容

%module CRFPP
%include exception.i
%{
#include "crfpp.h"
%} %newobject surface; %exception {
try { $action }
catch (char *e) { SWIG_exception (SWIG_RuntimeError, e); }
catch (const char *e) { SWIG_exception (SWIG_RuntimeError, (char*)e); }
} %feature("notabstract") CRFPP::Model;
%feature("notabstract") CRFPP::Tagger;
%ignore CRFPP::createModel;
%ignore CRFPP::createModelFromArray;
%ignore CRFPP::createTagger;
%ignore CRFPP::getTaggerError;
%ignore CRFPP::getLastError; %extend CRFPP::Model { Model(const char *arg); }
%extend CRFPP::Tagger { Tagger(const char *arg); } %{ void delete_CRFPP_Model (CRFPP::Model *t) {
delete t;
t = 0;
} CRFPP::Model* new_CRFPP_Model(const char *arg) {
CRFPP::Model *tagger = CRFPP::createModel(arg);
if (!tagger) throw CRFPP::getLastError();
return tagger;
} void delete_CRFPP_Tagger (CRFPP::Tagger *t) {
delete t;
t = 0;
} CRFPP::Tagger* new_CRFPP_Tagger (const char *arg) {
CRFPP::Tagger *tagger = CRFPP::createTagger(arg);
if (!tagger) throw CRFPP::getLastError();
return tagger;
} %} %include crfpp.h
%include version.h

由于CRFF.i文件和crfpp.h位于同一目录,故将倒数第二行更改。另外如果没有version.h文件,把最后一行%include version.h删去即可

2.2.2包装文件

在命令行cmd下执行:C:\swigwin-2.0.12\swig.exe -c++ -java -package com.ibugs.crfpp D:\CRF++-0.58\sdk\CRFPP.i

其中C:\swigwin-2.0.12\swig.exe 为Swig的解压目录,D:\CRF++-0.58\sdk\CRFPP.i为CRFPP.i放置目录。另外-package com.ibugs.crfpp,设置编译后java文件的包名,包名大家可以自己设定。执行后会生成以下文件,其中CRFPP_wrap.cxx包装文件为编译动态链使用;*.java文件在调用java项目中引入。

2.3.编译动态链库

2.3.1.创建DLL工程

在VS新建DLL项目工程,

千万要将Application type设置为DLL,这样就将工程建好了。然后将CRFPP_wrap.cxx复制到工程中即可

2.3.2.编译动态链库

直接右键工程Build,好像出错了。

错误信息提示找不到jni.h文件。jni.h文件为jdk安装目录自带库,那我们就要配置包含目录。右键工程Properties打开如下,并在C/C++>>General>>Additional Include Directories添加包含目录

再来Build一下吧,很不幸又出错了

错误信息提示找不到相应的函数,在sdk目录下还有一个libcrfpp.lib包,把它拷入项目中来。然后Build,好像这次真的成功啦

在项目物理目录中可以看到生成的动态链库文件

2.4.总算可以实例了

建立一个Java项目,目录结构如下:其中包名和Swig包装设定的包名一致,将Swig生成的相应Java文件拷入项目中;同时将生成的动态链库CRFPP.dll放入lib目录中,其中libcrfpp.dll文件在CRF++-0.58.zip\目录下

测试文件test.java,可以从CRF++-0.58.tar.gz\CRF++-0.58\swig目录获得,如下:

package com.ibugs.crfpp;

public class test {

public static void main(String[] argv) {

  //Tagger tagger = new Tagger("-m W://model -v 3 -n2");
Tagger tagger = new Tagger("-m D://CRF++-0.58/CRF++-0.58/chinese/model -v 3 -n2"); // clear internal context
tagger.clear(); // add context
tagger.add("Confidence NN");
tagger.add("in IN");
tagger.add("the DT");
tagger.add("pound NN");
tagger.add("is VBZ");
tagger.add("widely RB");
tagger.add("expected VBN");
tagger.add("to TO");
tagger.add("take VB");
tagger.add("another DT");
tagger.add("sharp JJ");
tagger.add("dive NN");
tagger.add("if IN");
tagger.add("trade NN");
tagger.add("figures NNS");
tagger.add("for IN");
tagger.add("September NNP"); System.out.println("column size: " + tagger.xsize());
System.out.println("token size: " + tagger.size());
System.out.println("tag size: " + tagger.ysize()); System.out.println("tagset information:");
for (int i = 0; i < tagger.ysize(); ++i) {
System.out.println("tag " + i + " " + tagger.yname(i));
} // parse and change internal stated as 'parsed'
if (!tagger.parse())
return; System.out.println("conditional prob=" + tagger.prob()
+ " log(Z)=" + tagger.Z()); for (int i = 0; i < tagger.size(); ++i) {
for (int j = 0; j < tagger.xsize(); ++j) {
System.out.print(tagger.x(i, j) + "\t");
}
System.out.print(tagger.y2(i) + "\t");
System.out.print("\n"); System.out.print("Details");
for (int j = 0; j < tagger.ysize(); ++j) {
System.out.print("\t" + tagger.yname(j) + "/prob=" + tagger.prob(i,j)
+ "/alpha=" + tagger.alpha(i, j)
+ "/beta=" + tagger.beta(i, j));
}
System.out.print("\n");
} // when -n20 is specified, you can access nbest outputs
System.out.println("nbest outputs:");
for (int n = 0; n < 10; ++n) {
if (! tagger.next()) break;
System.out.println("nbest n=" + n + "\tconditional prob=" + tagger.prob());
// you can access any information using tagger.y()...
}
System.out.println("Done"); System.out.println();
} static {
try {
//System.loadLibrary(CRFPP);
    System.loadLibrary("./lib/libcrfpp);
    System.loadLibrary("./lib/CRFPP");
} catch (UnsatisfiedLinkError e) {
System.err.println("Cannot load the example native code.\nMake sure your LD_LIBRARY_PATH contains \'.\'\n" + e);
e.printStackTrace();
System.exit(1);
}
} }

需要修改代码

指定模板文件:Tagger tagger = new Tagger("-m W://model -v 3 -n2");  ==〉 Tagger tagger = new Tagger("-m D://CRF++-0.58/CRF++-0.58/chinese/model -v 3 -n2"); 其中model为指定的模板文件

指定动态链库文件:System.loadLibrary("CRFPP");  ==〉System.loadLibrary("./lib/libcrfpp); System.loadLibrary("./lib/CRFPP");

总算可以结束啦,执行java程序吧!祝你好运没有其它什么错误。

另外,可以将Swig工具嵌入到VS中执行,在Tools工具条添加外部工具

其中的Arguments:-c++ -java -package com.ibugs.crfpp $(ItemFileName)$(ItemExt)

执行时,将CRFPP.i文件拷入工程中并选中,在Tools找到Swig点击即执行

3.小结

Java调用C++语言其实并不难,关键是不熟悉整个流程。

搞了半天好像自己编译的CRFPP.dll没太大的作用,直接在工程中引用CRF++-0.58.zip\目录下libcrfpp.dll即可

Windows 环境下Java调用CRF++详解的更多相关文章

  1. windows环境下tensorflow安装过程详解

    写在最前: 在安装过程中遇到很多坑,一开始自己从官网下载了Python3.6.3或者Python3.6.5或者Python3.7.1等多个版本,然后直接pip install tensorflow或者 ...

  2. windows和linux环境下java调用C++代码-JNI技术

    最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结 ...

  3. linux环境下/etc/hosts文件详解

    linux环境下/etc/hosts文件详解 就没一个昵称能用关注 0.0632017.09.12 17:04:28字数 623阅读 27,096 介绍 hosts文件是linux系统中负责ip地址与 ...

  4. kettle的下载、安装和初步使用(windows平台下)(图文详解)

    kettle的下载 žKettle可以在http://kettle.pentaho.org/网站下载                   http://sourceforge.net/projects ...

  5. Kettle学习系列之kettle的下载、安装和初步使用(windows平台下)(图文详解)

    不多说,直接上干货! kettle的下载 žKettle可以在http://kettle.pentaho.org/网站下载                   http://sourceforge.n ...

  6. Windows环境下 PHP调用R脚本

    写在前面的: 由于是windows平台实现的,只要保证脚本命令能在cmd控制台运行,则可以在php中利用system()实现. 注意事项: (1).保证system的路径中无汉字和空格 !!  (亲身 ...

  7. MyCat部署运行(Windows环境)与使用步骤详解

        目录(?)[+] 1.MyCat概念 1.1 总体架构 MyCAT的架构如下图所示: MyCAT使用MySQL的通讯协议模拟成一个MySQL服务器,并建立了完整的Schema(数据库).Tab ...

  8. libcurl开源库在Win7 + VS2012环境下编译、配置详解 以及下载文件并显示下载进度 demo(转载)

    转载:http://blog.csdn.net/fengshuiyue/article/details/39530093(基本教程) 转载:https://my.oschina.net/u/14207 ...

  9. Linux环境下部署svn服务详解

    说明 环境: 操作系统:centos 8.0 IP:39.100.228.13 安装 用ROOT账号登录,在控制台执行以下命令,一直默认安装就好可以了. [root@localhost ~]#yum ...

随机推荐

  1. ios上传图片遇见了一个TimeoutError(DOM Exception 23)异常

    TimeoutError(DOM Exception 23):The operation timed out 百度了下,没发现解决办法

  2. 点击bindingNavigatorAddNewItem 关联的dataGridView不会新增一行

    方法一. 在设计界面,修改bindingNavigator1的属性AddNewItem 为“(无)”: 方法二. 在设计器自动生成的代码中找到这一行:             // bindingNa ...

  3. [置顶] Android 适配真要命?

    原始尺寸场景 相信大家对上面也有所有耳闻另外就是如何计算屏幕的密度一般都是按照勾股定理例如中等屏幕密度 480^2+800^2开根号 然后除以当前屏幕尺寸3.5-4.2之间尺寸. 对于刚出来的那些An ...

  4. HAWQ取代传统数仓实践(九)——维度表技术之退化维度

    退化维度技术减少维度的数量,简化维度数据仓库模式.简单的模式比复杂的更容易理解,也有更好的查询性能.        有时,维度表中除了业务主键外没有其它内容.例如,在本销售订单示例中,订单维度表除了订 ...

  5. 旧书重温:0day2【10】第五章 堆溢出利用2

    好久没有发帖子啦!最近一直很忙!但是还是抽空学习啦下! 前段时间匆匆忙忙的把0day2上的堆溢出实验做啦! 可能当时太浮躁啦,很多细节没注意!结果:实验结果很不满意!所以就有啦这一篇!! 上一篇是发布 ...

  6. Ubuntu 16.04 安装配置支持http2的nginx

    第一步 安装最新版本的nginx 对于ubuntu16.04而言 直接装就是最新的 ``` sudo apt-get update sudo apt-get install nginx 查看Nginx ...

  7. Hadoop2.7.1安装与配置

    Hadoop2.7.1集群环境的搭建 s204.s205是我的两台服务器hostname,可以用你对应的ip或者hostname代替 工具/原料   jdk.ssh免登录 方法/步骤   1 首先去A ...

  8. Java Platform SE binary已停止运行 Can't load AMD 64-bit.dll on a IA 32-bit platform错误

    这个我是在junit测试web项目时候遇到的问题,然后今天遇到一位网友也遇到了,报问题的是A卡了,所以今天做个记载,方便遇到问题的人,因为,之前我个人遇到这个问题,在网上找了很久都没有找到. 上面这个 ...

  9. 洛谷 P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver

    传送门 题目大意: n个谷仓 ,每次关闭一个谷仓,问剩下没被关闭的谷仓是 否联通. 题解:并查集+倒序处理 代码: #include<iostream> #include<cstdi ...

  10. 学习动态性能表(3)--v$sql&v$sql_plan

    学习动态性能表 第三篇-(1)-v$sq 2007.5.25 V$SQL中存储具体的SQL语句. 一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例1).如果有多个cur ...