文本自动分词是自然语言处理的基础性工作,推荐一款中文分词工具-----张华平博士开发的NLPIR汉语分词系统,并且使用java调用里面的工具包进行中文文本的分词,本文描述我的工具流程,希望可以借鉴。
首先,可以从http://ictclas.nlpir.org/downloads获取该软件。
下载好以后你可以看到文件包的情况:
文件包介绍
| Readme.txt-------------------------->介绍
这里我们将sample文件夹中的JnaTest_NLPIR文件项目导入到eclipse中。
打开src/code/路径下找到 NlpirTest.java 测试文件,可以运行源项目的示例文件。
这里还需要几个操作,需要将上级文件中的Data-->系统核心词库复制到项目中,并且修改词典的路径。
然后,将bin里面的CTCLAS2014----------->分词系统复制到项目中,运行 NlpirTest.java 测试文件,就可以看到结果了。
package code;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import utils.SystemParas;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class FC_Test {
// 定义接口CLibrary,继承自com.sun.jna.Library
public interface CLibrary extends Library {
// 定义并初始化接口的静态变量
CLibrary Instance = (CLibrary) Native.loadLibrary(
"ICTCLAS2014/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 static String transString(String aidString, String ori_encoding,
String new_encoding) {
try {
return new String(aidString.getBytes(ori_encoding), new_encoding);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
static String do_FC(String sInput){
String argu = "./";
// String system_charset = "GBK";//GBK----0
String system_charset = "UTF-8";
int charset_type = 1;
int init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
String nativeBytes = null;
if (0 == init_flag) {
nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg();
System.err.println("初始化失败!fail reason is "+nativeBytes);
}
try {
nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
CLibrary.Instance.NLPIR_Exit();
} catch (Exception ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
return nativeBytes;
}
public static void main(String[] args) throws Exception {
File dataImport=new File("FC_data/import.txt");
File dataExport=new File("FC_data/export.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(dataImport), "UTF-8"));
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(dataExport), "UTF-8"));
String str;
while ((str = br.readLine()) != null) {
// System.out.println(str);
String nativeBytes = do_FC(str);
wr.write(nativeBytes);
wr.newLine();
}
br.close();
wr.close();
System.out.println("------分词结束!------");
}
}
这里我增加了一个对txt文件文本进行分词的程序:
在项目中添加FC_data/文件夹,其中
FC_data/import.txt
FC_data/export.txt
分别为输入文件和输出文件,运行后结果如下: