首页 > 代码库 > ictclas4j进行中文分词

ictclas4j进行中文分词

ICTCLAS是中科院计算所开发的中文分词程序包,在国内一直有着良好的口碑和很高的使用率。之前一直只有 C++的版本提供,而现在C#,Delphi和Java版本已经纷纷出炉。下面是java版的例子。

纯Java版本的ICTCLAS(即ictclas4j),下载地址:http://pan.baidu.com/s/1jGGFXNS(这是0.9.1版的,官网经常打不开,这是我在百度云盘的分享)


1、解压缩ictclas4j

①把Data文件夹整个拷贝到Eclipse项目的文件夹下

注:需要将Data改为data,且将data目录下的BigramDict.dct改为bigramDict.dct,与代码中类Segment保持一致(不知源代码为何没改??)

public Segment(int segPathCount) {
		this.segPathCount = segPathCount;
		logger.info("Load coreDict  ...");
		coreDict = new Dictionary("data\\coreDict.dct");

		logger.info("Load bigramDict ...");
		bigramDict = new Dictionary("data\\bigramDict.dct");

		logger.info("Load tagger dict ...");
		personTagger = new PosTagger(Utility.TAG_TYPE.TT_PERSON, "data\\nr", coreDict);
		transPersonTagger = new PosTagger(Utility.TAG_TYPE.TT_TRANS_PERSON, "data\\tr", coreDict);
		placeTagger = new PosTagger(Utility.TAG_TYPE.TT_TRANS_PERSON, "data\\ns", coreDict);
		lexTagger = new PosTagger(Utility.TAG_TYPE.TT_NORMAL, "data\\lexical", coreDict);
		logger.info("Load dict is over");
	}

②把bin目录下的org文件夹整个拷贝到你Eclipse项目的bin目录下

③把src目录下的org文件夹整个拷贝到Eclipse项目的src目录下

④导入外部包commons-lang-2.0.jar、log4j-1.2.17.jar


2、测试小程序

import org.ictclas4j.bean.SegResult;
import org.ictclas4j.segment.Segment;

public class Test {
	
	public static void main(String[] args) throws Exception{  
        Segment st = new Segment(1);  
        String line = "一块勤奋地漂亮的一块钱,/打造经济的航空母舰。ABCD.#$% Hello World!\n又一段文本123辆 !3.0";  
        SegResult sr = st.split(line);  
        System.out.println(sr.getFinalResult());  
        }  
}
在网上看到很多例子还是用SegTag这个类,现在已经用Segment代替了。

运行结果如下:

一块/s 勤奋/a 地/u 漂亮/a 的/u 一/m 块/q 钱/n ,/w //nx 打造/v 经济/n 的/u 航空母舰/n 。/w ABCD.#$%/nx Hello/nx World/nx !/w 又/d 一/m 段/q 文本/n 123/m 辆/q

分词的结果是一个长长的String类数据,用空格区分出每个词,每个词还用/后面的英文标号标出了词性。

值得注意的地方:

①原文中其实有两个“一块”,一处是“一块勤奋”,这里很正确的识别为了副词,而后面的“一块钱”中的“一块”也正确的识别为数量词。
②阿拉伯数字正确识别为数词,包括小数形式的“3.0”。而英文和乱七八糟符号(包括那个不可见的换行符,你找到它在哪了吗?)则都被划为一类——/nx!
③测试文本中还有两个叹号,一个是英文半角的!,一个是中文全角的!,两者也都被正确识别为标点符号,但英文的句号“.“就被认为是/nx啦。
④测试文本中的空格被完全忽略。


3、遇到的问题:

①程序正常运行,但切分成了一个字一个字的

需要将java文件的编码格式设为gbk就ok了。

②有时会报错,应该是字符识别不了,报错如下:

Exception in thread "main" java.lang.NullPointerException
	at org.ictclas4j.bean.Dictionary.getMaxMatch(Dictionary.java:571)
打开../src/org/ictclas4j/bean中的Dictionary.java文件,修改getMaxMatch()函数,在
  for (int j = 0; j < wis.size(); j++) {  
之前加上如下语句,判断为空条件:
if (wis == null) { 
   return null; 
}

ok,现在就遇到这些问题。

转载请注明,更多内容见:http://blog.csdn.net/hwwn2009/article/details/42103939

ictclas4j进行中文分词