1. 程式人生 > >常用工具包-哈工大語言技術平臺(LTP)-本地安裝-java介面(ubuntu,win7-64位)

常用工具包-哈工大語言技術平臺(LTP)-本地安裝-java介面(ubuntu,win7-64位)

目錄

第一部分 簡介

         LTP4J簡介。LTP底層均是C++實現,而LTP4J是對LTP的Java介面封裝。所以對於需要Java介面的開發人員來說要通過呼叫LTP4J的介面實現呼叫LTP的目的,LTP4J封裝了幾個獨立的方法,分別是Segmentor / Postagger /NER/Parser /SRL,與之對應的實現功能是分詞、詞性標註、命名實體識別、句法分析、語義角色標註。

         由於官網上沒有給編譯好的jar包和庫檔案,所以要根據自身電腦環境進行相應的編譯操作。

         使用ltp的java程式設計介面,要做的準備工作主要有二個:1,使用Ant編譯ltp4j,生成ltp4j.jar包;2,使用cmake/c++編譯環境對ltp工程進行編譯生成ltp4j依賴庫檔案。

         本文件依次在ubuntu、win7作業系統下完成了ltp4j的編譯工作,並用官網上給的java程式碼進行了測試。詳細如以下二部分。

第二部分 Ubuntu系統

2.1所有相關軟體

         本部分所用的軟體基本上都上官網上下載的最新,當然受限於硬體,所用的ubuntu系統是老了些。

軟體

版本資訊

官網

系統

ubuntu12.04 32

https://www.ubuntu.com/download

jdk

apache-ant-1.9.7-bin.tar.gz

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

ant

apache-ant-1.9.7-bin.tar.gz

http://ant.apache.org/

cmake

cmake-3.7.0-rc1.tar.gz

https://cmake.org/

eclipse

eclipse-jee-neon-R-linux-gtk.tar.gz

https://www.eclipse.org/downloads/

ltp

ltp-master.zip

https://github.com/HIT-SCIR

ltp4j

ltp4j-master.zip

https://github.com/HIT-SCIR

ltp

ltp-data-v3.3.1.zip

http://pan.baidu.com/share/link?shareid=1988562907&uk=2738088569#list/path=%2F

2 ltp4庫編譯

2.1安裝JDK並配置環境變數

自行設定jdk安裝目錄。在安裝目錄解壓,解壓:tar -xzvf jdk-8u101-linux-i586.tar.gz

配置環境變數:

exportJAVA_HOME=/usr/local/java/jdk1.8.0_101

export JRE_HOEM=${JAVA_HOME}/jre

exportCLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${JAVA_HOME}/bin:$PATH

檢測命令:java -version

2.2 安裝Ant

自行設定ant安裝目錄。在安裝目錄解壓、,解壓:tar -xzvf jdk-8u101-linux-i586.tar.gz

配置環境變數:

exportANT_HOME=/usr/local/ant/apache-ant-1.9.7

export PATH=${ANT_HOME}/bin:$PATH

2.3 安裝cmake

自行設定cmake安裝目錄。如果沒有g++,則先行安裝:sudo apt-get install g++

在安裝目錄解壓,解壓:tar -xzvf cmake-3.7.0-rc1.tar.gz

在解壓的目錄執行:

./configure

make

make install

2.4 編譯LTP

自行設定ltp安裝目錄。在安裝目錄解壓,解壓:tar -xzvf ltp-master.zip

在解壓後目錄,使用./configure檢查編譯環境,沒有問題則執行make進行編譯。

2.5 編譯LTP4j

自行設定ltp4j安裝目錄。在安裝目錄解壓,解壓:tar -xzvf ltp4j-master.zip

在解壓後的目錄ltp4j-master下執行ant命令,編譯後,可在ltp4j-master/output/jar目錄下找到ltp4j.jar包。

在對ltp4j編譯前,修改檔案...。修改後,執行“cmake .”“make”兩個命令進行編譯,編譯後,則在ltp4j-master/libs下生成動態庫:libner_jni.so; libpostagger_jni.so; libsplit_sentence_jni.so; libparser_jni.so;libsegmentor_jni.so;libsrl_jni.so

配置環境變數,將編譯的動態庫路徑加到環境變數:

exportLD_LIBRARY_PATH=/usr/local/LTP/tmpliso

至此完成。

3 eclipse下測試

         首先需要解壓ltp的資料模型檔案:ltp-data-v3.3.1.zip,解壓目錄可以自己設定。

         在eclipse裡新建一個工程,ltp4j.jar匯入到工程,至此,配置完成,下邊是ltp的五個功能。

3.1功能簡介

         ltp提供的主要功能有:分詞,詞性標註,命名實體識別,句法分析,語義角色標註。

         每個功能基本都是三個步驟:1,create, 讀取模型檔案,初始化功能例項;2,功能介面,實現相應的功能;3,release,釋放模型檔案、資源。

3.2詳細程式碼

         以下功能都是官方文件中的,注意的是模型檔案是ltp-data-v3.3.1.zip解決所得。

         /**

          * 1,分詞功能測試

          */

         publicvoid testSegment() {

                   if(Segmentor.create("ltp_data/cws.model")< 0) {

                            System.out.println("載入失敗!");

                            return;

                   }

                   Stringsent = "我從事自然語言處理方面的工作!";

                   System.out.println(sent);

                   List<String>words = new ArrayList<String>();

                   System.out.println(sent);

                   intsize = Segmentor.segment(sent, words);

                   System.out.println(sent);

                   for(int i = 0; i < size; i++) {

                            System.out.println(words.get(i));

                   }

                   Segmentor.release();

         }

 /**

  * 2,詞性標註工曾測試

  */

         publicvoid testPosTag() {

                   if(Postagger.create("ltp_data//pos.model")< 0) {

                            System.err.println("載入失敗!");

                            return;

                   }

                   List<String>words = new ArrayList<String>();

                   words.add("我");

                   words.add("從事");

                   words.add("自然");

                   words.add("語言");

                   words.add("處理");

                   words.add("方面");

                   words.add("的");

                   words.add("工作");

                   words.add("!");

                   List<String>postags = new ArrayList<String>();

                   intsize = Postagger.postag(words, postags);

                   for(int i = 0; i < size; i++) {

                            System.out.print(words.get(i)+ "_" + postags.get(i));

                            if(i == size - 1) {

                                     System.out.println();

                            }else {

                                     System.out.print("|");

                            }

                   }

                   Postagger.release();

         }

  /**

    *3,命名實體識別功能測試

   */

         publicvoid testNer(){

                    if(NER.create("ltp_data/ner.model")<0){

                               System.err.println("load failed");

                                return;         

                              }

                               List<String> words = newArrayList<String>();

                               List<String> tags = newArrayList<String>();

                               List<String> ners = newArrayList<String>();

                               words.add("中國");tags.add("ns");

                               words.add("國際");tags.add("n");

                               words.add("廣播");tags.add("n");

                               words.add("電臺");tags.add("n");

                               words.add("創辦");tags.add("v");

                               words.add("於");tags.add("p");

                               words.add("1941年");tags.add("m");

                               words.add("12月");tags.add("m");

                               words.add("3日");tags.add("m");

                               words.add("。");tags.add("wp");

                               NER.recognize(words,tags, ners);

                              for (int i = 0; i < words.size(); i++) {

                                System.out.println(ners.get(i));

                               }

                              NER.release();

         }

/**

 * 4,句法分析功能測試

 */

         publicvoid testParser(){

                    if(Parser.create("ltp_data/parser.model")<0){

                         System.err.println("loadfailed");

                         return;

                       }

                       List<String> words = newArrayList<String>();

                       List<String> tags = newArrayList<String>();

                       words.add("一把手");tags.add("n");

                       words.add("親自");tags.add("d");

                       words.add("過問");tags.add("v");

                       words.add("。");tags.add("wp");

                       List<Integer> heads = newArrayList<Integer>();

                       List<String> deprels = newArrayList<String>();

                       int size =Parser.parse(words,tags,heads,deprels);

                       for(int i = 0;i<size;i++) {

                        System.out.print(heads.get(i)+":"+deprels.get(i));

                         if(i==size-1) {

                           System.out.println();

                         }

                         else{

                           System.out.print("        ");

                         }

                       }

                       Parser.release();

         }

/**

 * 5,語義角色標註功能測試

 */

         publicvoid testSrl(){

                   SRL.create("ltp_data/srl");

                     ArrayList<String> words = newArrayList<String>();

                     words.add("一把手");

                     words.add("親自");

                     words.add("過問");

                     words.add("。");

                     ArrayList<String> tags = newArrayList<String>();

                     tags.add("n");

                     tags.add("d");

                     tags.add("v");

                     tags.add("wp");

                     ArrayList<String> ners = newArrayList<String>();

                     ners.add("O");

                     ners.add("O");

                     ners.add("O");

                     ners.add("O");

                     ArrayList<Integer> heads = newArrayList<Integer>();

                     heads.add(2);

                     heads.add(2);

                     heads.add(-1);

                     heads.add(2);

                     ArrayList<String> deprels = newArrayList<String>();

                     deprels.add("SBV");

                     deprels.add("ADV");

                     deprels.add("HED");

                     deprels.add("WP");

                     List<Pair<Integer,List<Pair<String, Pair<Integer, Integer>>>>> srls = newArrayList<Pair<Integer, List<Pair<String, Pair<Integer,Integer>>>>>();

                       SRL.srl(words, tags, ners, heads, deprels,srls);

                     for (int i = 0; i < srls.size(); ++i) {

                       System.out.println(srls.get(i).first +":");

                         for (int j = 0; j < srls.get(i).second.size();++j) {

                           System.out.println("   tpye = "+srls.get(i).second.get(j).first + " beg = "+srls.get(i).second.get(j).second.first + " end = "+ srls.get(i).second.get(j).second.second);

                         }

                       }

                     SRL.release();

         }

第三部分 win7-64系統

3.1 所有相關軟體

軟體

軟體資訊

作業系統

Win7 64 位

Jdk

jdk-8u101-windows-x64.exe

Ant

apache-ant-1.9.7

Cmake

cmake-3.6.2-win64-x64.msi

C++編譯環境

vs2010旗艦

eclipse

org.eclipse.platformversion=3.7.0

 關於ltp相關的和ubuntu下用的是同一套:ltp,ltp4j,ltp資料模型

3.2 ltp4j庫編譯

3.2.1 JDK安裝

         win7下jdk環境變數設定,略。

3.2.2 Ant安裝

         ant從官網下載對就電腦的安裝包後,到win7下解壓即可,解壓目錄可以設定。

         環境變數設定。新建ANT_HOME值為:“自己目錄\apache-ant-1.9.7”,編輯PATH,在PATH變數值的末尾新增:“;%ANT_HOME%\bin”

         驗證是否配置成功,開啟cmd,輸入ant,如果顯示:

         Buildfile:build.xml does not exist!

         Buildfailed

         這樣的話,說明配置成功,因為ant預設執行build.xml檔案,該檔案需要手動建立。

3.2.3 Cmake安裝

         cmake是從官網下載的可執行檔案形式的安裝包。下載對就係統版本,一鍵安裝即可。(http://www.cmake.org/download/)

3.2.4 編譯LTP4j

         首先下載LTP4J原始碼,下載後,我的本地目錄為:F:\LTP。

         cmd進行LTP4j的專案根目錄下,執行ant命令:

圖1

    執行成功後,LTP4j在專案下會生成output資料夾,在裡邊可找到ltp4j.jar 。

3.2.5 編譯LTP

         在編譯LTP4j的C++代理之前,需要先編譯LTP。編譯LTP主要有二步:使用工具CMake構建專案;在vs2010下編譯。

         使用工具CMake構建專案。首先下載LTP原始碼ltp-master.zip,解壓後重命名為ltp,我的存放路徑為:F:\LTP。在ltp目錄下新建一個build資料夾。開啟cmakeGUI,相關輸入設定如圖:

圖2

         點選configure,在彈出框中選擇vs2010的(結合自己電腦選擇相應的編輯器)。點選generate,執行完成。會在build下生成相應的專案配置檔案。

         用vs2010開啟build下的ALL_BUILD專案,選擇Release(*)方式構建專案。完成以後,則ltplibs會得到所想要lib庫檔案。

3.2.6 編譯ltp4j代理

         同編譯ltp4j一樣,也需要二個步驟:用cmake構建專案;用vs2010進行編譯。首先,修改ltp4j目錄下的CMakeLists.txt檔案,將LTP路徑設定為上節的ltp路徑,如圖:

         圖3

         構建VC專案。用cmake開啟ltp4j,同時在ltp4j目錄下建立一個build資料夾,如圖:

圖4

                   依次點選configure、generate。構建完畢,會在build下生成相應的專案檔案。

                   用vs2010開啟build下的專案檔案ALL_BUILD.vcxproj,選擇Release(*)方式構建專案。完畢後在ltp4j的libs會所得到需要的檔案。

         3.2節編譯中,我們需要以下檔案:1,ltp下lib中的ner.dll、parser.dll、postagger.dll、splitsnt.dll、segmentor.dll、srl.dll六個庫檔案;2,ltp4j下libs中的全部檔案;3,ltp4j下out中的ltp4j.jar包。

         同時需要下載ltp所用到資料模型ltp-data-v3.3.1.zip ,這個同ubuntu下的資料模型是同一個。下載後解壓即可,我是用的時候將其複製到專案檔案下。

    在eclipse中新建專案,將ltp4j.jar包匯入。將ltp下lib中6個庫檔案和ltp4j下libs中的全部檔案複製到專案的根目錄下。如圖:

    圖5

         至於測試程式碼,和ubuntu下的程式碼一樣,用同一套測試即可。

第四部分 結語

         本文件簡要介紹了LTP的java程式設計介面的使用方法。如開始的所說,主要LTP核心是C++開發。java介面的話,則需要編譯ltp4j和對應的ltp庫檔案。

         主要參考檔案如附錄,文中完成的測試類檔案為:NtpTest.java。

參考資料:

1,LTP官方文件:https://github.com/HIT-SCIR/ltp4j/blob/master/doc/ltp4j-document-1.0.md

2,《LTP隨筆——本地呼叫ltp之ltp4j》http://www.bubuko.com/infodetail-542352.html

3,《封裝LTP4J的本地LTML呼叫介面》http://www.tuicool.com/articles/EFj2EnQ

4,《編譯哈工大語言技術平臺雲LTP(C++)原始碼及LTP4J(Java)原始碼》http://www.tuicool.com/articles/jYbqUn