从一开始用的分词工具一直是中科院的ICTCLAS中文词法分析系统,被称为是世界上最好的中文词法分析器,对于ICTCLAS中文词法分析器的其他信息可以Google或者百度百科寻找答案。
之前用的是ictclas4j版本,该版本ictclas4j的编码,等于是把中科院的free ictclas(c++版本)翻译了一遍,没有考虑c和
java语言的区别。
java语言中默认编码是UTF-16,字符是16位,字符串的处理方式是以字符为基本单位,而不是以
字节为基本单位。而ictclas本身是c语言实现的,字符串的基本处理单位是字节。
这就导致了ictclas4j中,很多操作是字节<-->字符之间相互转换,典型的是大量调用
String.getBytes(),StringBuffer.append(),StringBuffer.toString()方法。这几个
方法都消耗大量的cpu时间。因此分词速度比较慢。
现在用的ICTCLAS5.0版本分
词速度较快,分词速度单机 996KB/S,精度98.45%,将之前的评论挖掘算法中的分词器改为这个版本后速度有较大的提升。
ICTCLAS5.0的java版本简单用法如下:
=========================ICTCLAS5.0处理字符串:=================================
ICTCLAS50 testICTCLAS50 = new ICTCLAS50(); String argu = "."; //初始化
if (testICTCLAS50.ICTCLAS_Init(argu.getBytes("GB2312")) == false)
{
System.out.println("Init Fail!");
return;
}
String sInput = "这款手机贴膜比较难找 可能行货上市不久的原因 只有在某讯上买到了专门的s610d贴膜
";
//设置词性标注集(0 计算所二级标注集,1 计算所一级标注集,2 北大二级标注集,3 北大一级标注集)
testICTCLAS50.ICTCLAS_SetPOSmap(2);
//导入用户词典前分词
byte nativeBytes[] = testICTCLAS50.ICTCLAS_ParagraphProcess(sInput.getBytes("GB2312"), 0, 0);
//分词处理
System.out.println(nativeBytes.length); String nativeStr = new String(nativeBytes, 0, nativeBytes.length, "GB2312");
System.out.println("未导入用户词典的分词结果: " + nativeStr);
//打印结果
//导入用户字典
int nCount = 0;
String usrdir = "userdict.txt"; //用户字典路径
byte[] usrdirb = usrdir.getBytes();//将string转化为byte类型
//导入用户字典,返回导入用户词语个数第一个参数为用户字典路径,第二个参数为用户字典的编码类型(0:type
unknown;1:ASCII码;2:GB2312,GBK,GB10380;3:UTF-8;4:BIG5)
nCount = testICTCLAS50.ICTCLAS_ImportUserDictFile(usrdirb, 0);
System.out.println("导入用户词个数" + nCount);
nCount = 0;
//导入用户字典后再分词
byte nativeBytes1[] = testICTCLAS50.ICTCLAS_ParagraphProcess(sInput.getBytes("GB2312"), 2, 0);
System.out.println(nativeBytes1.length);
String nativeStr1 = new String(nativeBytes1, 0, nativeBytes1.length, "GB2312");
System.out.println("导入用户词典后的分词结果: " + nativeStr1); //保存用户字典
testICTCLAS50.ICTCLAS_SaveTheUsrDic();
//释放分词组件资源
testICTCLAS50.ICTCLAS_Exit();
=========================ICTCLAS5.0处理文件:=================================
ICTCLAS50 testICTCLAS50 = new ICTCLAS50();
//分词所需库的路径
String argu = ".";
//初始化
if (testICTCLAS50.ICTCLAS_Init(argu.getBytes("GB2312")) == false)
{
System.out.println("Init Fail!");
return;
}
//输入文件名
String Inputfilename = "test.txt";
byte[] Inputfilenameb = Inputfilename.getBytes();//将文件名string类型转为byte类型
//分词处理后输出文件名
String Outputfilename = "test_result.txt";
byte[] Outputfilenameb = Outputfilename.getBytes();//将文件名string类型转为byte类型
//文件分词(第一个参数为输入文件的名,第二个参数为文件编码类型,第三个参数为是否标记词性集1 yes,0 no,第四个参数为输出文件名)
testICTCLAS50.ICTCLAS_FileProcess(Inputfilenameb, 0, 0, Outputfilenameb);
int nCount = 0;
String usrdir = "userdict.txt"; //用户字典路径
byte[] usrdirb = usrdir.getBytes();//将string转化为byte类型
//第一个参数为用户字典路径,第二个参数为用户字典的编码类型(0:type unknown;1:ASCII码;2:GB2312,GBK,GB10380;3:UTF-8;4:BIG5)
nCount = testICTCLAS50.ICTCLAS_ImportUserDictFile(usrdirb, 0);//导入用户字典,返回导入用户词语个数
System.out.println("导入用户词个数" + nCount);
nCount = 0;
String Outputfilename1 = "testing_result.txt";
byte[] Outputfilenameb1 = Outputfilename1.getBytes();//将文件名string类型转为byte类型
//文件分词(第一个参数为输入文件的名,第二个参数为文件编码类型,第三个参数为是否标记词性集1 yes,0 no,第四个参数为输出文件名)
testICTCLAS50.ICTCLAS_FileProcess(Inputfilenameb, 0, 0, Outputfilenameb1);
关于ICTCLAS5.0配置错误的处理,这里有一篇文章挺不错: