(1)添加項目jar包
File -> Project Structure
Libarries 添加jar包jna-4.0.0.jar
(2)將Data文件夾復制到ICTCLAS2015文件夾下
(3)聲明調用分詞器的接口,如下:
//定義接口Clibrary,繼承自com.sun.jna.Library
public interface CLibrary extends Library{
//定義並初始化接口的靜態變量,這一個語句是用來加載dll的,注意dll文件的路徑
//可以是絕對路徑也可以是相對路徑,只需要填寫dll的文件名,不能加后綴
//加載dll文件NLPIR.dll
CLibrary Instance =(CLibrary) Native.loadLibrary(
"C:\\jars\\nlpir\\bin\\ICTCLAS2015\\NLPIR",CLibrary.class);
// 初始化函數聲明
public int NLPIR_Init(String sDataPath, int encoding, String sLicenceCode);
//執行分詞函數聲明
public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
//提取關鍵詞函數聲明
public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit, boolean bWeightOut);
//提取文件中關鍵詞的函數聲明
public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit, boolean bWeightOut);
//添加用戶詞典聲明
public int NLPIR_AddUserWord(String sWord);//add by qp 2008.11.10
//刪除用戶詞典聲明
public int NLPIR_DelUsrWord(String sWord);//add by qp 2008.11.10
//獲取最后一個錯誤的說明
public String NLPIR_GetLastErrorMsg();
//退出函數聲明
public void NLPIR_Exit();
//文件分詞聲明
public void NLPIR_FileProcess(String utf8File, String utf8FileResult, int i);
}
(4)分詞器使用實例:
String system_charset="UTF-8";
//說明分詞器的bin文件所在的目錄
String dir="C:\\jars\\nlpir\\bin\\ICTCLAS2015";
int charset_type=1;
String utf8File="C:\\utf8file.txt";
String utf8FileResult ="C:\\utf8result.txt";
//初始化分詞器
int init_flag =CLibrary.Instance.NLPIR_Init(dir,charset_type,"0");
String nativeBytes=null;
if(init_flag==0){
nativeBytes=CLibrary.Instance.NLPIR_GetLastErrorMsg();
System.out.println("初始化失敗,原因為"+nativeBytes);
return;
}
String sinput="去年開始,打開百度李毅吧,滿屏的帖子大多含有“屌絲”二字,一般網友不僅不懂這詞什么意思,更難理解這個詞為什么會這么火。然而從下半年開始,“屌絲”已經覆蓋網絡各個角落,人人爭說屌絲,人人爭當屌絲。\n" +
"從遭遇惡搞到群體自嘲,“屌絲”名號橫空出世";
try{
//參數0代表不帶詞性,參數1代表帶有詞性標識
nativeBytes=CLibrary.Instance.NLPIR_ParagraphProcess(sinput,0);
System.out.println("分詞結果為:"+nativeBytes);
//添加用戶詞典
CLibrary.Instance.NLPIR_AddUserWord("滿屏的帖子 n");
CLibrary.Instance.NLPIR_AddUserWord("更難理解 n");
//執行分詞
nativeBytes=CLibrary.Instance.NLPIR_ParagraphProcess(sinput,1);
System.out.println("增加用戶詞典后分詞的結果為: " +nativeBytes);
//刪除用戶定義的詞 更難理解
CLibrary.Instance.NLPIR_DelUsrWord("更難理解");
//執行分詞
nativeBytes=CLibrary.Instance.NLPIR_ParagraphProcess(sinput,1);
System.out.println("刪除用戶詞典后分詞結果為: "+nativeBytes);
//從utf8File目錄中讀取語句進行分詞,將結果寫入utf8FileResult對應的路徑之中,保留詞性對應的標志
CLibrary.Instance.NLPIR_FileProcess(utf8File,utf8FileResult,1);
//獲取sinput中對應的關鍵詞,指定關鍵詞數目最多為3
nativeBytes=CLibrary.Instance.NLPIR_GetKeyWords(sinput,3,false);
System.out.println("關鍵詞提取結果是:"+nativeBytes);
//獲取文件中對應的關鍵詞
nativeBytes=CLibrary.Instance.NLPIR_GetFileKeyWords(utf8File,10,false);
System.out.println("關鍵詞提取結果是:"+nativeBytes);
}catch (Exception e){
e.printStackTrace();
}
(3)String編碼方式轉換函數的實現:
//轉換String的編碼方式
public static String transString(String str,String ori_encoding,String new_encoding){
try{
return new String(str.getBytes(ori_encoding),new_encoding);
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}
return null;
}
二、spark項目
請注意,一中步驟(1),(2),(3)也是必不可少的!
有了普通實現的完成,下一步我想將分詞部署在spark中,就有了下述項目。我想將文本轉換為
單詞,詞性標志 PairRDD,具體實現如下,有上面的基礎,就不在詳細解釋了。
SparkConf conf =new SparkConf().setAppName("test").setMaster("local");
JavaSparkContext sc =new JavaSparkContext(conf);
JavaRDD<String> inputs =sc.textFile("C:\\utf8file.txt");
JavaRDD<String> source=inputs.filter(
new Function<String, Boolean>() {
public Boolean call(String v1) throws Exception {
return !v1.trim().isEmpty();
}
}
);
JavaRDD<String> transmit = source.mapPartitions(
new FlatMapFunction<Iterator<String>, String>() {
public Iterable<String> call(Iterator<String> it) throws Exception {
List<String> list=new ArrayList<String>();
String dir="C:\\jars\\nlpir\\bin\\ICTCLAS2015";
int charset_type=1;
int init_flag =CLibrary.Instance.NLPIR_Init(dir,charset_type,"0");
if(init_flag==0){
throw new RuntimeException(CLibrary.Instance.NLPIR_GetLastErrorMsg());
}
try{
while(it.hasNext()){
list.add(CLibrary.Instance.NLPIR_ParagraphProcess(it.next(),1));
}
}catch (Exception e){
e.printStackTrace();
}
return list;
}
}
).filter(
new Function<String, Boolean>() {
public Boolean call(String v1) throws Exception {
return !v1.trim().isEmpty();
}
}
);
JavaRDD<String> words = transmit.flatMap(
new FlatMapFunction<String, String>() {
public Iterable<String> call(String s) throws Exception {
return Arrays.asList(s.split(" "));
}
}
).filter(
new Function<String, Boolean>() {
public Boolean call(String v1) throws Exception {
return !v1.trim().isEmpty();
}
}
);
JavaPairRDD<String, String> result = words.mapToPair(
new PairFunction<String, String, String>() {
public Tuple2<String, String> call(String s) throws Exception {
String[] split = s.split("/");
return new Tuple2<String, String>(split[0], split[1]);
}
}
);
for(Tuple2<String,String> t:result.collect())
System.out.println(t._1()+" "+t._2());
sc.stop();
程序執行結果:

scala版本
def ok(f:Iterator[String]):Iterator[String] ={
val dir="C:\\jars\\nlpir\\bin\\ICTCLAS2015"
val charset_type=1
val init_flag=CLibrary.Instance.NLPIR_Init(dir,charset_type,"0")
if(init_flag==0)
null
val buf = new ArrayBuffer[String]
for(it<-f){
buf+=(CLibrary.Instance.NLPIR_ParagraphProcess(it,0))
}
buf.iterator
}
def main(args:Array[String]): Unit = {
val conf = new SparkConf().setAppName("test").setMaster("local");
val sc = new SparkContext(conf);
val inputs = sc.textFile("c:\\utf8file.txt");
val results=inputs.mapPartitions(
ok
);
results.collect().foreach(println)
}