哈工大語言云:LTP4J在win 32環(huán)境下編譯過程

前言:ltp4j是語言技術(shù)平臺(tái)(Language Technology Platform, LTP)接口的一個(gè)Java封裝。官網(wǎng)給出了C++源碼,要想用java調(diào)用,必須編譯成java本地接口。 官網(wǎng)給的文檔太籠統(tǒng),遇到錯(cuò)誤根本不知道怎么處理。在網(wǎng)上搜的博客,一步一步來還是編譯不成功。這里給出在windows環(huán)境下編譯詳細(xì)過程,也是自己一點(diǎn)一點(diǎn)解決問題,最終在摸索中編譯成功。

準(zhǔn)備工作

  1. 源碼下載:
    1. LTP源碼--------- 下載鏈接
    2. LTP4J源碼--------下載鏈接
    3. ltp-master.zipltp4j-master.zip解壓到當(dāng)前文件夾
  2. 環(huán)境:
    1. 操作系統(tǒng):windows 7/8/10
    2. JDK版本:1.8+ 32位(低于1.8版本的話,無法運(yùn)行)
    3. IDEeclipse
    4. Ant:這個(gè)一般集成在eclipse中,如果沒有請先安裝
    5. cmake下載鏈接
    6. Visual studio Express 2012:其他版本不知道行不行,最好不要低于這個(gè)版本

2. 生成jar文件

  1. 打開eclipse,點(diǎn)擊File -> New -> Project -> Java Project from Existing Ant Buildfile,然后next

  2. project name填寫ltp4j,build file那里選擇剛才解壓的itp4j-master 中的build.xml,點(diǎn)擊Finish。

  3. 選中build.xml,右鍵->Run As -> 2 Ant Build,在 彈出的窗口的導(dǎo)航欄中選擇main,第二項(xiàng)的Base Directory點(diǎn)擊下方的Browse File System,然后選擇LTP4J根目錄。最后點(diǎn)擊右下角的Run運(yùn)行。

  4. 控制臺(tái)顯示如下,說明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. 構(gòu)建VC project:

    ltp-master項(xiàng)目文件夾下新建一個(gè)名為build的文件夾,使用CMake Gui,在source code中填入項(xiàng)目文件夾,在binaries中填入build文件夾。然后Configure 選擇vs 11 2012,點(diǎn)擊finish。稍等幾秒鐘,點(diǎn)擊Generate

    查看日志,如果出現(xiàn)如下,說明成功。

    Configuring done

    Generating done

    ?

  2. 編譯:

    進(jìn)入build文件夾,用vs 2012打開ALL_BUILD.vcxproj在vs的菜單欄中,點(diǎn)擊生成->生成解決方法,可以在控制臺(tái)看到,正在生成。注意要選擇Debug模式。(網(wǎng)上很多帖子說的選擇Release模式,我開始這么嘗試,后來發(fā)現(xiàn)在編譯ltp4j的時(shí)候失敗,一直報(bào)error link 1181:--.lib輸入文件無法打開。后來讀了一下ltp4j的配置文件,發(fā)現(xiàn)里面默認(rèn)的路徑是到ltplib\Debug中加載lib文件,如下

    ? ```

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

    如果選擇Release,那么生成的庫只會(huì)在Release中,這也難怪會(huì)報(bào)上述錯(cuò)誤了。

  3. 編譯生成比較耗時(shí)。生成完成之后,可以到ltp-master\lib\Debug看到已經(jīng)生成庫文件。至此LTP的編譯已經(jīng)完成,接下來進(jìn)行LTP4J的編譯。

編譯 LTP4J

  1. 配置ltp的安裝路徑:

    因?yàn)閖ni依賴于ltp編譯產(chǎn)生的動(dòng)態(tài)庫,所以在編譯過程中需要給出ltp的路徑。 請修改/path/to/your/ltp4j-project/CMakeLists.txt中的LTP_HOME的值為您的LTP項(xiàng)目的路徑(/path/to/your/ltp-project), 對應(yīng)修改的代碼為:set (LTP_HOME "/path/to/your/ltp-project/")

  2. 構(gòu)建VC project。 在項(xiàng)目文件夾下新建一個(gè)名為build的文件夾,使用CMake Gui,在source code中填入項(xiàng)目文件夾,在binaries中填入build文件夾。然后Configure -> Generate。(同上)
    ?

  3. 編譯:(同上)

  4. 生成完成之后,同樣可以到ltp-master\libs\Debug看到已經(jīng)生成庫文件。至此所有編譯工作已經(jīng)完成,是不是覺得很簡單呀,哈哈。反正我是試了好多次。接下來重頭戲,開始在java 代碼中調(diào)用。

3. 實(shí)戰(zhàn)-- java中調(diào)用

  1. 打開eclipse,新建java project。

  2. 根目錄創(chuàng)建lib文件夾,將ltp4j.jar拷貝至此,然后build path。

  3. 將ltp4j中的libs文件夾中生成的所有動(dòng)態(tài)庫、以及原ltp lib文件夾下的splitsnt、segmentor、postagger、ner、parser、srl 6個(gè)動(dòng)態(tài)庫拷貝到項(xiàng)目根目錄

  4. 根目錄下面創(chuàng)建model文件夾,拷貝model文件至此,需要下載3.3.1版本的model文件,下載鏈接 。

  5. 創(chuàng)建一個(gè)類文件:這里測試一下分詞的接口調(diào)用。其他的自行測試。

    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. 工程目錄結(jié)構(gòu)如圖:

  7. 運(yùn)行,完美分詞結(jié)果:

    ?


  8. 看到這兒 ,可能伸手黨表示已經(jīng)扛不住了。沒事兒,我這兒有傳送門。打包好的,下載就能用哦

    傳送門


    ?

    用了一個(gè)午休的時(shí)間來寫,脖子都疼了。

    如果能給你帶來一些幫助的話,那我也覺得值啦。

    該休息了。下次見。---


    想起我的阿里簡歷還沒完善,,馬上該面試了,神助我!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容