现在的位置: 首页 > 综合 > 正文

10分钟开始使用ICTCLAS Java版——却花了我快一个小时

2013年01月01日 ⁄ 综合 ⁄ 共 2990字 ⁄ 字号 评论关闭

ICTCLAS是中科院计算所出品的中文分词程序包,在国内一直有着良好的口碑和很高的使用率。之前一直只有 C++的版本提供,而现在C#,Delphi和Java版本已经纷纷出炉。下面用一个极小的例子,让大家10分钟之内就能用上ICTCLAS ,从此也开始自己的文本分类和搜索引擎开发之路。

需要首先说明的是,不同于以前的C++版提供的JNI调用,本次使用的是纯Java版本的ICTCLAS,下载地址在http://ictclas.org/Down_OpenSrc.asp。

好,假设你已经下载了我们需要使用的Java版本ictclas4j,现在把它解压缩,然后把Data文件夹整个拷贝到Eclipse项目的文件夹下,bin目录下的org文件夹整个拷贝到你Eclipse项目的bin目录下,把src目录下的org文件夹整个拷贝到Eclipse项目的src目录下(最简单快捷的使用方式,或者你自己打成jar包,这样无论放到哪里,都可以在build path里面导入这个jar包啦)。

现在就可以在你的项目里新建一个类来试试。我新建了一个类,代码如下:

 

很显然文本“一块勤奋地漂亮的一块钱,/打造经济的航空母舰。ABCD.#$% Hello World!"n又一段文本123 3.0”就是我们用来测试的文本,其中包含了中文,英文,标点符号,乱七八糟符号(笑)及阿拉伯数字。

我们运行刚才的程序,看下输出结果:

This is OneMain

一块/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!(因为我也不知道ICTCLAS内部人员管它叫什么啦,非法字符啊,还是无效字符啊,或者其它字符啊,名字可以自己取嘛)

测试文本中还有两个叹号,一个是英文半角的!,一个是中文全角的!,两者也都被正确识别为标点符号,但英文的句号“.“就被认为是/nx啦。

测试文本中的空格被完全忽略。

好,十分简单对不对?去玩玩吧。

上面的内容来自于http://www.blogjava.net/zhenandaci/archive/2008/09/21/230269.html,然而这个10分钟的事却花了一个小时。这主要是因为我对java和ecplise工具不熟悉,在这里我把我遇到的问题记录下来,希望能够帮助想我一样,刚接触java的。

 

1. 首先我遇到的错误是:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
SegTag cannot be resolved to a type 
SegTag cannot be resolved to a type 
SegResult cannot be resolved to a type

这个错误主要是因为eclipse没有导入相应的代码(我原来天真的以为只要把代码复制过去,并且按照上面所说的那样复制相应的文件夹,就可以运行了),这个错误很容易消除(现在说起来容易,我自己可摸索了半天呢),即按F5键进行刷新,或在项目上右击,选择刷新。

 

2. 现在可以运行了吧,我高兴的按下了“Run As”按钮,但是又出现了如下错误:

 

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 

The import org.apache cannot be resolved

ReflectionToStringBuilder cannot be resolved

 

at org.ictclas4j.bean.WordTable.<init>(WordTable.java:5)

at org.ictclas4j.bean.Dictionary.init(Dictionary.java:46)

at org.ictclas4j.bean.Dictionary.<init>(Dictionary.java:38)

at org.ictclas4j.segment.SegTag.<init>(SegTag.java:28)

at Test.main(Test.java:7)

 

通过eclipse工具,找到问题出现的地方:

import org.apache.commons.lang.builder.ReflectionToStringBuilder;

可见,我们还需要一个包含ReflectionToStringBuilder的类,通过阅读原文下面的回复得知,我们还缺少一个commons-lang-2.4.jar包。好了,知道了需要什么,那就找吧。。。

但是,可笑的一幕出现了,我不知道这个包如何用到这个project里面,然后再一次请谷歌帮忙了。最后,我找到一个可行的方法:

1.在eclipse项目下新建一个文件夹lib,并把commons-lang-2.4.jar包复制到其中。

2.在左侧项目框内右击->build path->configure build path->libraries->add JARs,然后找到并选中commons-lang-2.4.jar包就行。

通过上面的操作,我终于看到了可爱的运行结果:

 

This is OneMain

一块/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  !/w 3.0/m 

 

这是我初次接触java项目,虽然代码可以运行了,但我并不清楚,是我真正找到原因和解决方法了,还是恰巧歪打正着了(希望高手不吝赐教,当然我也会开始学习这方面知识的)。总之,现在能运行了,我们可以用分词系统来做一些事情了。

 

PS:可能有人会说:“不就这个两个问题嘛,需要一个小时吗?”,呵呵,这个问题就这么放着吧!你大可一笑而过。

抱歉!评论已关闭.