NLPIR2015分词的乱码问题

以前没什么经验,现在论文需要分词,不过网上的代码修改了下输出的都是乱码,弄了一天多才最终发现全部的原因就是编码不一致所致。

下面是我整个的代码:

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编码的,这样分词下来结果就对了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值