纯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;
}
转载请注明,更多内容见:http://blog.csdn.net/hwwn2009/article/details/42103939