以前没什么经验,现在论文需要分词,不过网上的代码修改了下输出的都是乱码,弄了一天多才最终发现全部的原因就是编码不一致所致。
下面是我整个的代码:
package code;
import java.io.UnsupportedEncodingException;
import utils.SystemParas;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class NlpirTest {
// 定义接口CLibrary,继承自com.sun.jna.Library
public interface CLibrary extends Library {
// 定义并初始化接口的静态变量 这一个语句是来加载 dll的, 注意 dll文件的路径
//可以是绝对路径也可以是相对路径,只需要填写 dll的文件名,不能加后缀
CLibrary Instance = (CLibrary) Native.loadLibrary(
"D:/application/ICTCLAS2015/lib/win64/NLPIR", CLibrary.class);
// 初始化函数声明
//sDataPath: Data文件夹的路径
//encoding: 表示读取的默认编码方式
//sLicenceCode: 通常默认字符串“0”即可
//return: 返回值为0表示初始化失败,大于0表示成功
//encoding值 编码
//0 GBK
//1 UTF-8
//2 Big5
public int NLPIR_Init(String sDataPath, int encoding,
String sLicenceCode);
//执行分词函数声明
//sSrc: 需要分词的字符串
//bPOSTagged: 标志位。当为“1”时表示返回值有标注信息,“0”表示无标注
//return: String型串
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);
//添加用户词典声明、删除用户词典声明
//下面两个函数可以向分词系统添加用户自定义词,例如“ipone6 n”表示添加固定词ipone6且为名词(该系统的标注信息在压缩包的doc文件夹下)
//利用下面两个函数可以告诉系统分词的时候sWord是否为一固定词或搭配
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 int NLPIR_ImportUserDict(byte[] sPath);
public String NLPIR_GetLastErrorMsg();
//退出函数声明
public void NLPIR_Exit();
//文件分词声明
//utf8File: 待分词文件
//utf8FileResult: 存储分词结果的目标文件
//i: 是否需要标注信息的标志位。
public double NLPIR_FileProcess(String utf8File, String utf8FileResult, int i);
}
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;
}
public static void main(String[] args) throws Exception {
String argu = "D:\\application\\ICTCLAS2015";
//String system_charset = "GBK";//GBK----0
String system_charset = "UTF-8";
int charset_type = 1;
//文件分词的输入和输出
String utf8File = "test/屌丝,一个字头的诞生.TXT";
String utf8FileResult = "test/屌丝,一个字头的诞生.TXT_result.TXT";
//String utf8File = "test/测试.txt";
//String utf8FileResult = "test/测试_result.txt";
//分词系统初始化
int init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
String nativeBytes = null; //存储分词的结果
if (0 == init_flag) {
//通过NLPIR_GetLastErrorMsg获取错误日志信息
nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg();
System.err.println("初始化失败!fail reason is "+nativeBytes);
return;
}
String sInput = "去年开始,打开百度李毅吧,满屏的帖子大多含有“屌丝”二字,一般网友不仅不懂这词什么意思,更难理解这个词为什么会这么火。然而从下半年开始,“屌丝”已经覆盖网络各个角落,人人争说屌丝,人人争当屌丝。从遭遇恶搞到群体自嘲,“屌丝”名号横空出世";
//String nativeBytes = null;
try {
//参数0表示不带词性,参数1表示带有词性
nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
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);
//CLibrary.Instance.NLPIR_FileProcess(utf8File, utf8FileResult,0);
CLibrary.Instance.NLPIR_FileProcess(utf8File, utf8FileResult,1);
int nCountKey = 0;
String nativeByte = CLibrary.Instance.NLPIR_GetKeyWords(sInput,
10,false);
System.out.println("关键词提取结果是:" + nativeByte);
nativeByte = CLibrary.Instance.NLPIR_GetFileKeyWords("test/屌丝,一个字头的诞生.txt", 10,false);
System.out.println("关键词提取结果是:" + nativeByte);
CLibrary.Instance.NLPIR_Exit();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
我用的是NLPIR2015,操作系统是Win7 64位,希望用java来做,所以我直接把Data和Test文件夹拷贝到sample中的JnaTest_NLPIR根目录中。然后导入,把路径改下基本就没什么问题了。
不过刚开始用了一天多,第二天再用的时候就无故报错了,查了下是因为授权过期了,一般都能查找到他们的联系邮箱,非商用的话都是免费的,所以他们会给你解决办法。
编码出现乱码基本都是因为编码的不统一,我对txt文件分词出现乱码,解决办法就是你先看下txt的编码是什么,把它另存为就能看到编码了,我的是默认的ANSI码,我把它另存为utf-8编码的,这样分词下来结果就对了。