加入ICTCLAS4J,一起学习分词系统
需要首先说明的是,不同于以前的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包啦)。
现在就可以在你的项目里新建一个类来试试。我新建了一个类,代码如下:
import org.ictclas4j.bean.SegResult;
import org.ictclas4j.segment.SegTag;
public class OneMain {
public static void main(String[] args) {
System.out.println("This is OneMain");
SegTag st = new SegTag(1);
SegResult sr = st
.split("一块勤奋地漂亮的一块钱,/打造经济的航空母舰。ABCD.#$% Hello World!\n又一段文本123辆 !3.0");
System.out.println(sr.getFinalResult());
}
}
很显然文本“一块勤奋地漂亮的一块钱,/打造经济的航空母舰。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啦。
测试文本中的空格被完全忽略。
好,十分简单对不对?去玩玩吧。
这个还是很不错的
呵呵
你确定你运行成功了?为什么我会出现这个错误呢:
Exception in thread "main" java.lang.NullPointerException
at org.ictclas4j.bean.Dictionary.getMaxMatch(Dictionary.java:571)
at org.ictclas4j.segment.GraphGenerate.generate(GraphGenerate.java:93)
at org.ictclas4j.segment.SegTag.split(SegTag.java:63)
at testjava.Testictclas4j.main(Testictclas4j.java:12)
以后可能还要多请你多指教啊
请教~ 急
我将OneMain.java放在哪里才能用呢?呜呜,新手,没法使用啊,请您帮助下我吧,谢谢
org.ictclas4j.bean.Dictionary.getMaxMatch(Dictionary.java:571)
org.ictclas4j.segment.GraphGenerate.generate(GraphGenerate.java:93)
org.ictclas4j.segment.SegTag.split(SegTag.java:63)
请问你的问题解决了吗?能帮我看下为什么么
ICTCLAS因为有一个卖钱的商业版,所以这个开源的版本毛病还是比较多的。比如有一些词库中不存在的词,就会扔空指针的错误,比如“深圳”,“大阪”这样的词。
还有对一些特殊的字符串模式,比如单引号隔几个字符再加一个什么什么的,就会报错(年代有些久远,记不太清了)。还有一些特殊的字符,也会报错。如果不是很重视这些偏门的东西,建议还是修改一下源代码,把这样的异常屏蔽下就好。
data位置放错了。。
java.lang.NullPointerException
at org.ictclas4j.bean.Dictionary.getMaxMatch(Dictionary.java:571)
at org.ictclas4j.segment.GraphGenerate.generate(GraphGenerate.java:93)
at org.ictclas4j.segment.SegTag.split(SegTag.java:63)
请注意,本地的Application可以找到的资源,在Web服务器中未必找得到,所以请试着把ICTCLAS的词典文件(也就是Data文件夹)放在正确的位置才可以。
谢谢。
恩,我前面也发现了应该是这个原因,甚至直接把data文件设为环境变量都不行。最后把data放在eclipse的安装目录下才可以。有办法修改这默认资源路径么?
Exception in thread "main" java.lang.NoClassDefFoundError: bean/FilesUtil
at org.ictclas4j.segment.SegTag.<init>(SegTag.java:33)
at OneMain.main(OneMain.java:11)
Caused by: java.lang.ClassNotFoundException: bean.FilesUtil
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
... 2 more
This is OneMain
我是新手 请教一下 为什么我用ICTCLAS4j
src下org.ictclas4j.bean有很多编译错误
大部分是
ReflectionToStringBuilder cannot be resolved
和
The import org.apache cannot be resolved
另外不知道您是否测试过不开源的共享版 是否提供比较全面的词库?
我只想用它来分词 完全是应用
非常感谢~
查看一下自己使用的JDK版本,保证JDK5以后.另外我没有测试过非开源版的ICTCLAS,但是据他们的文档和ICTCLAS4j的作者讲,非开源的版本词库要全得多,速度也快得多。
我装的是JDK6/ jre/ Eclipse/ XP
我仔细看了所有错误都是和ReflectionToStringBuilder有关
should be from:
import org.apache.commons.lang.builder.ReflectionToStringBuilder
但我没有org.apache
不知道它是什么时候跟着什么安装的 还是自己要额外安装jar??
哦,需要一个Apache的commons的jar包,可以去www.apache.org找到。
去了apache.org上 但是不知道怎么找到我想要的jar呢
在下载页那个非常长的目录。。。
应该怎么找commons呢
这个本来就应该是手动安装的么?
另外这个apache和 apache http server 有什么关系?
非常非常感谢伟大的Jasper同志~~
不好意思 又来麻烦请教~
我运行您的测试类之后也出现
This is OneMain
Exception in thread "main" java.lang.NullPointerException
at org.ictclas4j.bean.Dictionary.getMaxMatch(Dictionary.java:571)
at org.ictclas4j.segment.GraphGenerate.generate(GraphGenerate.java:93)
at org.ictclas4j.segment.SegTag.split(SegTag.java:63)
at OneMain.main(OneMain.java:13)
文件位置应该都是正确的
我试了把文本里的中文字去掉之后 只剩下英文的时候就运行正常
用的是英文xp eclipse里已经在preference把text的encoding改成utf-8了。
不知道还可能是什么问题呢? 非常感谢~
不是的。
我运行了为什么总出现导入包的错误啊
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
import语句一直都有问题哦