哈工大语言云:LTP4J在win 32环境下编译过程

前言:ltp4j是语言技术平台(Language Technology Platform, LTP)接口的一个Java封装。官网给出了C++源码,要想用java调用,必须编译成java本地接口。 官网给的文档太笼统,遇到错误根本不知道怎么处理。在网上搜的博客,一步一步来还是编译不成功。这里给出在windows环境下编译详细过程,也是自己一点一点解决问题,最终在摸索中编译成功。

准备工作

  1. 源码下载:
    1. LTP源码--------- 下载链接
    2. LTP4J源码--------下载链接
    3. ltp-master.zipltp4j-master.zip解压到当前文件夹
  2. 环境:
    1. 操作系统:windows 7/8/10
    2. JDK版本:1.8+ 32位(低于1.8版本的话,无法运行)
    3. IDEeclipse
    4. Ant:这个一般集成在eclipse中,如果没有请先安装
    5. cmake下载链接
    6. Visual studio Express 2012:其他版本不知道行不行,最好不要低于这个版本

2. 生成jar文件

  1. 打开eclipse,点击File -> New -> Project -> Java Project from Existing Ant Buildfile,然后next

  2. project name填写ltp4j,build file那里选择刚才解压的itp4j-master 中的build.xml,点击Finish。

  3. 选中build.xml,右键->Run As -> 2 Ant Build,在 弹出的窗口的导航栏中选择main,第二项的Base Directory点击下方的Browse File System,然后选择LTP4J根目录。最后点击右下角的Run运行。

  4. 控制台显示如下,说明build成功.可以打开根目录下面ltp4j-master\output\jar中查看生成的jar文件

    Buildfile: C:\Users\shixu\Documents\work space\ltp4j\build.xml
    clean:
    [delete] Deleting directory C:\Users\shixu\Documents\LTP\ltp4j-master\output
    compile:

    [mkdir] Created dir: C:\Users\shixu\Documents\LTP\ltp4j-master\output\classes
    [javac] C:\Users\shixu\Documents\work space\ltp4j\build.xml:17: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 7 source files to C:\Users\shixu\Documents\LTP\ltp4j-master\output\classes

    jar:

    [mkdir] Created dir: C:\Users\shixu\Documents\LTP\ltp4j-master\output\jar
    [jar] Building jar: C:\Users\shixu\Documents\LTP\ltp4j-master\output\jar\ltp4j.jar

    main:
    BUILD SUCCESSFUL
    Total time: 2 seconds

编译LTP

  1. 构建VC project:

    ltp-master项目文件夹下新建一个名为build的文件夹,使用CMake Gui,在source code中填入项目文件夹,在binaries中填入build文件夹。然后Configure 选择vs 11 2012,点击finish。稍等几秒钟,点击Generate

    查看日志,如果出现如下,说明成功。

    Configuring done

    Generating done

  2. 编译:

    进入build文件夹,用vs 2012打开ALL_BUILD.vcxproj在vs的菜单栏中,点击生成->生成解决方法,可以在控制台看到,正在生成。注意要选择Debug模式。(网上很多帖子说的选择Release模式,我开始这么尝试,后来发现在编译ltp4j的时候失败,一直报error link 1181:--.lib输入文件无法打开。后来读了一下ltp4j的配置文件,发现里面默认的路径是到ltplib\Debug中加载lib文件,如下

    ​ ```

    if(WIN32)
        link_directories (${LTP_HOME}/lib/Debug)
    else(WIN32)
        link_directories (${LTP_HOME}/lib)
    endif(WIN32)
    

    如果选择Release,那么生成的库只会在Release中,这也难怪会报上述错误了。

  3. 编译生成比较耗时。生成完成之后,可以到ltp-master\lib\Debug看到已经生成库文件。至此LTP的编译已经完成,接下来进行LTP4J的编译。

编译 LTP4J

  1. 配置ltp的安装路径:

    因为jni依赖于ltp编译产生的动态库,所以在编译过程中需要给出ltp的路径。 请修改/path/to/your/ltp4j-project/CMakeLists.txt中的LTP_HOME的值为您的LTP项目的路径(/path/to/your/ltp-project), 对应修改的代码为:set (LTP_HOME "/path/to/your/ltp-project/")

  2. 构建VC project。 在项目文件夹下新建一个名为build的文件夹,使用CMake Gui,在source code中填入项目文件夹,在binaries中填入build文件夹。然后Configure -> Generate。(同上)

  3. 编译:(同上)

  4. 生成完成之后,同样可以到ltp-master\libs\Debug看到已经生成库文件。至此所有编译工作已经完成,是不是觉得很简单呀,哈哈。反正我是试了好多次。接下来重头戏,开始在java 代码中调用。

3. 实战-- java中调用

  1. 打开eclipse,新建java project。

  2. 根目录创建lib文件夹,将ltp4j.jar拷贝至此,然后build path。

  3. 将ltp4j中的libs文件夹中生成的所有动态库、以及原ltp lib文件夹下的splitsnt、segmentor、postagger、ner、parser、srl 6个动态库拷贝到项目根目录

  4. 根目录下面创建model文件夹,拷贝model文件至此,需要下载3.3.1版本的model文件,下载链接

  5. 创建一个类文件:这里测试一下分词的接口调用。其他的自行测试。

    package ltp;
    
    import java.util.ArrayList;
    import java.util.List;
    import edu.hit.ir.ltp4j.*;
    public class Test {
      public static void main(String[] args) {
        if(Segmentor.create("model\\cws.model")<0){
          System.err.println("load failed");
          return;
        }
    
        String sent = "我是中国人";
        List<String> words = new ArrayList<String>();
        int size = Segmentor.segment(sent,words);
    
        for(int i = 0; i<size; i++) {
          System.out.print(words.get(i));
          if(i==size-1) {
            System.out.println();
          } else{  
            System.out.print("\t");
          }
        }
        Segmentor.release();
      }
    }
    

  6. 工程目录结构如图:

  7. 运行,完美分词结果:


  8. 看到这儿 ,可能伸手党表示已经扛不住了。没事儿,我这儿有传送门。打包好的,下载就能用哦

    传送门


    用了一个午休的时间来写,脖子都疼了。

    如果能给你带来一些帮助的话,那我也觉得值啦。

    该休息了。下次见。---


    想起我的阿里简历还没完善,,马上该面试了,神助我!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,408评论 4 371
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,690评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,036评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,726评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,123评论 3 296
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,037评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,178评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,964评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,703评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,863评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,333评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,658评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,374评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,195评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,988评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,167评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,970评论 2 279

推荐阅读更多精彩内容