常用工具包-哈工大語言技術平臺(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(*)方式構建專案。完成以後,則ltp的libs會得到所想要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