編譯哈工大語言技術平臺雲LTP(C++)源碼及LTP4J(Java)源碼

JDK:java version 「1.8.0_31」
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
OS:win7 64bit
cmake:V2.8.12/V3.2.2
LTP:V3.2.0
LTP4J:V1.0
Microsoft VS C++:V2010html

編譯LTP4J.jar

下載Ant

ltp4j的源碼使用ant進行編譯,首先須要下載ant,點我下載java

配置Ant環境變量

個人電腦—>屬性—>高級系統設置—>環境變量
新建ANT_HOME值爲:「D:\apache-ant-1.9.4」
編輯PATH,在PATH變量值的末尾添加:「;%ANT_HOME%\bin」
驗證是否配置成功,打開cmd,輸入ant:linux

C:\Users\TKPad>ant
Buildfile: build.xml does not exist!
Build failed

這樣的話,說明配置成功,由於ant默認運行build.xml文件,該文件須要手動建立。c++

編譯LTP4J

首先須要下載ltp4j源代碼,下載完成以後,解壓,好比個人地址爲:D:\ltp4j-master(推薦重命名爲ltp4j),打開cmd,進入d盤ltp4j項目根目錄下,運行ant命令,獲得:git

D:\ltp4j>ant
Buildfile: D:\ltp4j\build.xml
clean:
[delete] Deleting directory D:\ltp4j\output
compile:
[mkdir] Created dir: D:\ltp4j\output\classes
[javac] D:\ltp4j\build.xml:17: warning: ‘includeantruntime’ was not set, def
aulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 7 source files to D:\ltp4j\output\classes
jar:
[mkdir] Created dir: D:\ltp4j\output\jar
[jar] Building jar: D:\ltp4j\output\jar\ltp4j.jar
main:
BUILD SUCCESSFUL
Total time: 4 seconds

說明編譯成功!查看目錄:D:\ltp4j\output\jar,發現存在ltp4j.jar文件,這時該Jar包就可使用了。github

編譯C++代理程序

安裝CMake

ltp4j使用的C++代理程序使用編譯工具CMake構建項目。 在編譯代理程序以前,你須要首先安裝CMake。 CMake的網站在這裏。若是你是Windows用戶,請下載CMake的二進制安裝包;若是你是Linux,Mac OS或Cygwin的用戶,能夠經過編譯源碼的方式安裝CMake,固然,你也可使用Linux的軟件源來安裝。shell

下載地址點這裏,我選擇的是Windows ZIP cmake-3.2.2-win32-x86.zipexpress

下載LTP的C++源碼

下載地址,下載完成以後解壓,個人存放路徑爲:D:\ltp-master(推薦重命名爲ltp)。apache

配置LTP的安裝路徑

修改D:\ltp4j目錄下的CMakeLists.txt文件,修改以下部分的斜體加粗部分爲你本身的LTP源碼路徑windows

find_package(JNI)
set (LTP_HOME 「D:/ltp」 CACHE STRING 「Use to specified ltp path」)
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/libs)
set (JNI_SOURCE_DIR ${PROJECT_SOURCE_DIR}/jni)

構建VC Project

在項目文件夾下新建一個名爲build的文件夾,使用CMake Gui,在source code中填入項目文件夾,在binaries中填入build文件夾。而後Configure —> Generate。

在點擊configure以後出現以下錯誤:

The C compiler identification is unknown The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:2 (project): No CMAKE_C_COMPILER could be found.
CMake Error at CMakeLists.txt:2 (project): No CMAKE_CXX_COMPILER could be found.Configuring incomplete, errors occurred!
See also 「D:/ltp4j/build/CMakeFiles/CMakeOutput.log」.
See also 「D:/ltp4j/build/CMakeFiles/CMakeError.log」.

那麼多是你的電腦上尚未C++編譯環境,須要安裝Microsoft Visual Studio C++,VS 2010 express版下載地址爲:點我下載VS2010

安裝完成以後,再次編譯,若是出現:

The C compiler 「C:/Program Files (x86)/Microsoft Visual Studio 10.0/VC/bin/cl.exe」 is not able to compile a simple test program.

那麼參考文章裏面的解決辦法,說簡單點就是以管理員權限運行c1.exe
解決辦法以下:

  1. Right-Click->Properties on cl.exe in your VS install directory (the exact path appears in the CMake error);
  2. Choose the Compatibility Tab;
  3. Check 「Run this program as administrator」 in the 「Privilege Level」 box.

以後再次嘗試編譯,出現以下錯誤: 

CMake Error at CMakeLists.txt:2 (project):
Cannot enable 64-bit tools with Visual Studio 2010 Express.
Install the Microsoft Windows SDK v7.1 to get 64-bit tools:
http://msdn.microsoft.com/en-us/windows/bb980924.aspx
Configuring incomplete, errors occurred!

主要是由於32位版本不兼容形成的,打開地址,點擊download下載Microsoft Windows SDK for Windows 7 and .NET Framework 4,下載完成以後運行便是在線安裝的形式。若是以cmd命令行的形式運行cmake,須要將cmake的bin目錄路徑加入到操做系統的path變量中。

在configure階段,再次出錯

The C compiler identification is MSVC 16.0.30319.1
The CXX compiler identification is MSVC 16.0.30319.1
Check for working C compiler using: Visual Studio 10
Check for working C compiler using: Visual Studio 10 — broken
CMake Error at D:/cmake-2.8.12.1-win32-x86/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:61 (message):
The C compiler 「C:/Program Files (x86)/Microsoft Visual Studio
10.0/VC/bin/cl.exe」 is not able to compile a simple test program.
It fails with the following output:
Change Dir: D:/ltp4j/build/CMakeFiles/CMakeTmp
Run Build Command:C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
cmTryCompileExec1255268599.vcxproj /p:Configuration=Debug
/p:VisualStudioVersion=10.0
Microsoft(R) 生成引擎版本 4.0.30319.17929
[Microsoft .NET Framework 版本 4.0.30319.18063]
版權全部(C) Microsoft Corporation 2007。保留全部權利。
生成啓動時間爲 2015/5/6 9:46:05。
節點 1
上的項目「D:\ltp4j\build\CMakeFiles\CMakeTmp\cmTryCompileExec1255268599.vcxproj」(默認目標)。
PrepareForBuild:
正在建立目錄「cmTryCompileExec1255268599.dir\Debug\」。
正在建立目錄「D:\ltp4j\build\CMakeFiles\CMakeTmp\Debug\」。
InitializeBuildStatus: 正在建立「cmTryCompileExec1255268599.dir\Debug\cmTryCompileExec1255268599.unsuccessfulbuild」,由於已指定「AlwaysCreate」。
ClCompile:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\CL.exe /c /Zi /W3 /WX- /Od /Ob0 /Oy- /D WIN32 /D _WINDOWS /D _DEBUG /D 「CMAKE_INTDIR=\」Debug\」」 /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo」cmTryCompileExec1255268599.dir\Debug\「 /Fd」cmTryCompileExec1255268599.dir\Debug\vc100.pdb」 /Gd /TC /analyze- /errorReport:queue testCCompiler.c
用於 80x86 的 Microsoft (R) 32 位 C/C++ 優化編譯器 16.00.30319.01 版
版權全部(C) Microsoft Corporation。保留全部權利。
cl /c /Zi /W3 /WX- /Od /Ob0 /Oy- /D WIN32 /D _WINDOWS /D _DEBUG /D 「CMAKE_INTDIR=\」Debug\」」 /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo」cmTryCompileExec1255268599.dir\Debug\「 /Fd」cmTryCompileExec1255268599.dir\Debug\vc100.pdb」 /Gd /TC /analyze- /errorReport:queue testCCompiler.c
testCCompiler.c
ManifestResourceCompile:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\rc.exe /nologo /fo」cmTryCompileExec1255268599.dir\Debug\cmTryCompileExec1255268599.exe.embed.manifest.res」 cmTryCompileExec1255268599.dir\Debug\cmTryCompileExec1255268599_manifest.rc
Link:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\link.exe /ERRORREPORT:QUEUE /OUT:」D:\ltp4j\build\CMakeFiles\CMakeTmp\Debug\cmTryCompileExec1255268599.exe」 /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /ManifestFile:」cmTryCompileExec1255268599.dir\Debug\cmTryCompileExec1255268599.exe.intermediate.manifest」 /MANIFESTUAC:」level=’asInvoker’ uiAccess=’false’」 /DEBUG /PDB:」D:/ltp4j/build/CMakeFiles/CMakeTmp/Debug/cmTryCompileExec1255268599.pdb」 /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:」D:/ltp4j/build/CMakeFiles/CMakeTmp/Debug/cmTryCompileExec1255268599.lib」 /MACHINE:X86 cmTryCompileExec1255268599.dir\Debug\cmTryCompileExec1255268599.exe.embed.manifest.res
cmTryCompileExec1255268599.dir\Debug\testCCompiler.obj /machine:X86 /debug
LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 文件無效或損壞
[D:\ltp4j\build\CMakeFiles\CMakeTmp\cmTryCompileExec1255268599.vcxproj]
已完成生成項目「D:\ltp4j\build\CMakeFiles\CMakeTmp\cmTryCompileExec1255268599.vcxproj」(默認目標)的操做
失敗。
生成失敗。
「D:\ltp4j\build\CMakeFiles\CMakeTmp\cmTryCompileExec1255268599.vcxproj」(默認目標)
(1) ->
(Link 目標) ->
LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 文件無效或損壞 [D:\ltp4j\build\CMakeFiles\CMakeTmp\cmTryCompileExec1255268599.vcxproj]
0 個警告
1 個錯誤
已用時間 00:00:00.81
CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
CMakeLists.txt:2 (project)
Configuring incomplete, errors occurred!
See also 「D:/ltp4j/build/CMakeFiles/CMakeOutput.log」.
See also 「D:/ltp4j/build/CMakeFiles/CMakeError.log」.

該問題多是因爲.NET Framework 4.5致使,解決辦法是:

CMake doesn’t seem to work if .net 4.5 is installed. If you run into this issue you have to uninstall .net 4.5. Uninstalling .net 4.5 seems to break Visual Studio so then you have to re-install VS2010.

簡單點說就是,卸載.net 4.5,安裝.net 4.0(若是電腦已經安裝,就沒必要裝了),在卸載.net 4.5會破壞VS2010,因此須要從新再安裝一遍VS2010。參考文章1參考文章2;安裝完畢以後,從新以管理員身份的權限運行cmake-gui.exe,點擊configure以後,會彈出對話框,若是是VC++2010的話,建議選擇Visual Studio 10,以下圖:

點擊finish->configure,此時進度條開始變爲綠色滾動。

The C compiler identification is MSVC 16.0.30319.1
The CXX compiler identification is MSVC 16.0.30319.1
Check for working C compiler using: Visual Studio 10
Check for working C compiler using: Visual Studio 10 — works
Detecting C compiler ABI info
Detecting C compiler ABI info - done
Check for working CXX compiler using: Visual Studio 10
Check for working CXX compiler using: Visual Studio 10 — works
Detecting CXX compiler ABI info
Detecting CXX compiler ABI info - done
Found JNI: D:/Program Files/Java/jdk1.8.0_31/lib/jawt.lib
Configuring done

configure結束以後點擊generate。
若是您依然沒有運行成功,那麼建議使用cmake3.x以前的版本,緣由是:

Visual Studio 11 Win64 is the wrong generator for Visual Studio 2013. You need to use Visual Studio 12 2013 Win64 if you are using cmake-3.x or Visual Studio 12 Win64 for cmake-2.8.x.

cmake3.x以前的版本下載地址:http://www.cmake.org/files/v2.8/

編譯源碼

構建後獲得ALL_BUILD、RUN_TESTS、ZERO_CHECK三個VC Project。使用VS打開ALL_BUILD項目,選擇Release(*)方式構建項目。

(注:boost::multi_array與VS2010不兼容的bug已經在3.1.0中獲得修復,3.1.x及以上版本已經可使用Debug方式構建,但出於效率考慮,仍舊建議使用Release方式構建。)

注意事項

  • 該處編譯須要設置Java環境變量JAVA_HOME。
  • 須要保持c++編譯器與JDK同是32位或者64位,不然JVM不能加載生成的動態庫

編譯源碼出現

LINK : fatal error LNK1104: cannot open file ‘kernel32.lib’

緣由是

Check the VC++ directories, in VS 2010 these can be found in your project properties. Check whether 「$(WindowsSdkDir)\lib」 is included in the directories list, if not, manually add it. If you’re building for X64 platform, you should select X64 from the 「Platform」 ComboBox, and make sure that 「$(WindowsSdkDir)\lib\x64」 is included in the directories list.

若是X64目錄不包含在庫目錄中,須要手動添加到庫目錄中。以下圖所示

編譯LTP

再次編譯LTP4J出現以下錯誤:

LINK : fatal error LNK1181: cannot open input file ‘postagger.lib’
LINK : fatal error LNK1181: cannot open input file ‘ner.lib’

這是由於在編譯LTP4J以前須要編譯LTP,使用cmake構建LTP,以下圖

以後在LTP的build目錄下會生成VS Project,用VS打開D:\ltp\build\ALL_BUILD.vcxproj,使用Release X64方式進行編譯,若是順利的話,編譯結果見下圖

再次編譯LTP4J

在LTP編譯成功以後,將D:\ltp\lib\Release下的全部文件拷貝到D:\ltp4j\build目錄下,而後在VS中打開D:\ltp4j\build\ALL_BUILD.vcxproj,選擇Release X64進行編譯,編譯結果以下:

1>——— 已啓動生成: 項目: ZERO_CHECK, 配置: Release x64 ———
2>——— 已啓動生成: 項目: split_sentence_jni, 配置: Release x64 ———
3>——— 已啓動生成: 項目: segmentor_jni, 配置: Release x64 ———
4>——— 已啓動生成: 項目: srl_jni, 配置: Release x64 ———
5>——— 已啓動生成: 項目: parser_jni, 配置: Release x64 ———
2> Creating library D:/ltp4j/libs/Release/split_sentence_jni.lib and object D:/ltp4j/libs/Release/split_sentence_jni.exp
3> Creating library D:/ltp4j/libs/Release/segmentor_jni.lib and object D:/ltp4j/libs/Release/segmentor_jni.exp
3> segmentor_jni.vcxproj -> D:\ltp4j\libs\Release\segmentor_jni.dll
4> Creating library D:/ltp4j/libs/Release/srl_jni.lib and object D:/ltp4j/libs/Release/srl_jni.exp
5> Creating library D:/ltp4j/libs/Release/parser_jni.lib and object D:/ltp4j/libs/Release/parser_jni.exp
2> split_sentence_jni.vcxproj -> D:\ltp4j\libs\Release\split_sentence_jni.dll
5> parser_jni.vcxproj -> D:\ltp4j\libs\Release\parser_jni.dll
4> srl_jni.vcxproj -> D:\ltp4j\libs\Release\srl_jni.dll
6>——— 已啓動生成: 項目: ner_jni, 配置: Release x64 ———
7>——— 已啓動生成: 項目: postagger_jni, 配置: Release x64 ———
6> Creating library D:/ltp4j/libs/Release/ner_jni.lib and object D:/ltp4j/libs/Release/ner_jni.exp
7> Creating library D:/ltp4j/libs/Release/postagger_jni.lib and object D:/ltp4j/libs/Release/postagger_jni.exp
6> ner_jni.vcxproj -> D:\ltp4j\libs\Release\ner_jni.dll
7> postagger_jni.vcxproj -> D:\ltp4j\libs\Release\postagger_jni.dll
8>——— 已跳過生成: 項目: ALL_BUILD, 配置: Release x64 ———
8>沒有爲此解決方案配置選中要生成的項目
========== 生成: 成功 7 個,失敗 0 個,最新 0 個,跳過 1 個 ==========

在Eclipse中使用離線版LTP

配置Eclipse中項目所需資源

在Eclipse中新建Java Project

  • 導入ltp4j.jar
  • windows下將ltp4j的libs文件夾中生成的全部動態庫、以及原ltp lib文件夾下的splitsnt、segmentor、postagger、ner、parser、srl 6個動態庫拷貝到項目根目錄
  • linux下export LD_LIBRARY_PATH=#jni動態庫路徑#
    配置完成以後,項目視圖以下所示:

 

本地接口使用示例

分詞接口

import java.util.ArrayList;
import java.util.List;

import edu.hit.ir.ltp4j.Segmentor;

/**
 * 
 * <p>
 * ClassName TestSegment
 * </p>
 * <p>
 * Description 分詞接口
 * </p>
 * 
 * @author TKPad wangx89@126.com
 *         <p>
 *         Date 2015年5月7日 下午10:09:23
 *         </p>
 * @version V1.0.0
 *
 */
public class TestSegment {
	public static void main(String[] args) {
		// /MyTest/
		if (Segmentor.create("ltp_data/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();
	}
}

詞性標註接口

import java.util.ArrayList;
import java.util.List;

import edu.hit.ir.ltp4j.Postagger;

/**
 * 
 * <p>
 * ClassName TestPostag
 * </p>
 * <p>
 * Description 詞性標註接口
 * </p>
 * 
 * @author TKPad wangx89@126.com
 *         <p>
 *         Date 2015年5月7日 下午10:09:55
 *         </p>
 * @version V1.0.0
 *
 */
public class TestPostag {
	public static void main(String[] args) {
		if (Postagger.create("ltp_data/pos.model") < 0) {
			System.err.println("load failed");
			return;
		}

		List<String> words = new ArrayList<String>();
		words.add("我");
		words.add("是");
		words.add("中國");
		words.add("人");
		List<String> postags = new ArrayList<String>();

		int size = 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();
	}
}

命名實體識別接口

import java.util.ArrayList;
import java.util.List;

import edu.hit.ir.ltp4j.NER;

/**
 * 
 * <p>
 * ClassName TestNer
 * </p>
 * <p>
 * Description 命名實體識別接口
 * </p>
 * 
 * @author TKPad wangx89@126.com
 *         <p>
 *         Date 2015年5月7日 下午10:08:26
 *         </p>
 * @version V1.0.0
 *
 */
public class TestNer {

	public static void main(String[] args) {
		if (NER.create("ltp_data/ner.model") < 0) {
			System.err.println("load failed");
			return;
		}
		List<String> words = new ArrayList<String>();
		List<String> tags = new ArrayList<String>();
		List<String> ners = new ArrayList<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();

	}
}

依存句法分析接口

import java.util.ArrayList;
import java.util.List;

import edu.hit.ir.ltp4j.Parser;

/**
 * 
 * <p>
 * ClassName TestParser
 * </p>
 * <p>
 * Description 依存句法分析接口
 * </p>
 * 
 * @author TKPad wangx89@126.com
 *         <p>
 *         Date 2015年5月7日 下午10:11:09
 *         </p>
 * @version V1.0.0
 *
 */
public class TestParser {

	public static void main(String[] args) {
		if (Parser.create("ltp_data/parser.model") < 0) {
			System.err.println("load failed");
			return;
		}
		List<String> words = new ArrayList<String>();
		List<String> tags = new ArrayList<String>();
		words.add("一把手");
		tags.add("n");
		words.add("親自");
		tags.add("d");
		words.add("過問");
		tags.add("v");
		words.add("。");
		tags.add("wp");
		List<Integer> heads = new ArrayList<Integer>();
		List<String> deprels = new ArrayList<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();
	}
}

語義角色標註接口

等等,最後一步

注意點
在ltp4j中提供的ltp_data中的model僅僅是做爲你測試代碼的正確性,其並不是完整的model,若是須要在生產環境中使用,須要到這裏下載完整版的model,將下載的完整版ltp_data拷貝到項目中便可。

其餘錯誤

Cannot open include file: ‘ammintrin.h’: No such file or directory

參考文章:
http://wishmesh.com/2011/04/fatal-error-c1083-cannot-open-include-file-ammintrin-h-no-such-file-or-directory/

https://connect.microsoft.com/VisualStudio/feedback/details/660584/

參考資料:
【1】哈工大LTP官網
【2】LTP4J的github地址
【3】LTP的github地址
【4】LTP3.0參考文檔
【5】LTP4J1.0參考文檔
【6】VS2010與64位系統
【7】安裝 Microsoft Visual C++ 2010 和 Microsoft Windows SDK 7.1

相關文章
相關標籤/搜索