您的位置:首页 > 其它

加入ICTCLAS4J,一起学习分词系统

2010-03-23 23:07 309 查看
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包啦)。

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

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啦。

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

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

发表于 2008-09-21 16:35 Jasper 阅读(4126) 评论(27) 编辑 收藏 所属分类: 文本分类技术Java技术



评论

这样的分词程序有很多,呵呵~~这个也不错。

# re: 10分钟开始使用ICTCLAS Java版
我用的是庖丁解牛2.0beta版的,就是没有词性标注
这个还是很不错的
呵呵
tinypig 评论于 2008-09-22 20:06 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
我使用了下,不行啊!!
你确定你运行成功了?为什么我会出现这个错误呢:
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)
tinypig 评论于 2008-09-22 20:36 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
啊,你提醒了我,文章中关于Data文件夹放置的位置是错的,正确的位置应该是你建的Eclipse项目的文件夹下,而不是bin目录下,这回应该可以了吧。
Jasper 评论于 2008-09-23 00:13 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
可以了。 谢谢
以后可能还要多请你多指教啊
tinypig 评论于 2008-09-23 17:16 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
Ok,谢谢
norm 评论于 2008-12-17 16:08 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版[未登录]
在那个onemail类中可以运行,但是一放到jsp中就出错。一样的代码
请教~ 急
海洋 评论于 2009-01-31 19:30 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
你好,我在JDK的环境下如何调用ictclas4j?
我将OneMain.java放在哪里才能用呢?呜呜,新手,没法使用啊,请您帮助下我吧,谢谢
yjwmylm 评论于 2009-03-19 11:41 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
你好,我把ictclas4j放到JDK1.6下使用,也碰到了java.lang.NullPointerException
org.ictclas4j.bean.Dictionary.getMaxMatch(Dictionary.java:571)
org.ictclas4j.segment.GraphGenerate.generate(GraphGenerate.java:93)
org.ictclas4j.segment.SegTag.split(SegTag.java:63)
请问你的问题解决了吗?能帮我看下为什么么
yjwmylm 评论于 2009-03-22 15:01 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
@yjwmylm
ICTCLAS因为有一个卖钱的商业版,所以这个开源的版本毛病还是比较多的。比如有一些词库中不存在的词,就会扔空指针的错误,比如“深圳”,“大阪”这样的词。
还有对一些特殊的字符串模式,比如单引号隔几个字符再加一个什么什么的,就会报错(年代有些久远,记不太清了)。还有一些特殊的字符,也会报错。如果不是很重视这些偏门的东西,建议还是修改一下源代码,把这样的异常屏蔽下就好。
Jasper 评论于 2009-03-22 15:24 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
@yjwmylm
data位置放错了。。
www 评论于 2009-03-29 16:27 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
我用这个在本地是可以使用的,可是在建立web project的时候就会出错。在这一句时SegResult sr = st.split(input);
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)
tttt 评论于 2009-06-09 16:40 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
我终于能用了,谢谢!
hust 评论于 2009-06-09 16:44 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
jsp传的字符串是正确的,即使直接用新建的字符串,还是会出现同样的问题。同样的使用java application 运行又是没问题。
tttt 评论于 2009-06-09 16:51 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
@tttt
请注意,本地的Application可以找到的资源,在Web服务器中未必找得到,所以请试着把ICTCLAS的词典文件(也就是Data文件夹)放在正确的位置才可以。
Jasper 评论于 2009-06-09 17:32 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
@Jasper
谢谢。
恩,我前面也发现了应该是这个原因,甚至直接把data文件设为环境变量都不行。最后把data放在eclipse的安装目录下才可以。有办法修改这默认资源路径么?
tttt 评论于 2009-06-09 18:05 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
我的怎么出这个问题啊 ?
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
jia15679 评论于 2009-07-28 19:32 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
你好Jasper
我是新手 请教一下 为什么我用ICTCLAS4j
src下org.ictclas4j.bean有很多编译错误
大部分是
ReflectionToStringBuilder cannot be resolved

The import org.apache cannot be resolved

另外不知道您是否测试过不开源的共享版 是否提供比较全面的词库?
我只想用它来分词 完全是应用
非常感谢~
Miao 评论于 2009-08-02 22:06 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版[未登录]
@Miao
查看一下自己使用的JDK版本,保证JDK5以后.另外我没有测试过非开源版的ICTCLAS,但是据他们的文档和ICTCLAS4j的作者讲,非开源的版本词库要全得多,速度也快得多。
Jasper 评论于 2009-08-03 08:46 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
hi Jasper非常感谢

我装的是JDK6/ jre/ Eclipse/ XP
我仔细看了所有错误都是和ReflectionToStringBuilder有关
should be from:
import org.apache.commons.lang.builder.ReflectionToStringBuilder

但我没有org.apache
不知道它是什么时候跟着什么安装的 还是自己要额外安装jar??
Miao 评论于 2009-08-03 22:40 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版[未登录]
@Miao
哦,需要一个Apache的commons的jar包,可以去www.apache.org找到。
Jasper 评论于 2009-08-03 22:46 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
恩谢谢我刚找到。。。 是google到的
去了apache.org上 但是不知道怎么找到我想要的jar呢
在下载页那个非常长的目录。。。
应该怎么找commons呢

这个本来就应该是手动安装的么?

另外这个apache和 apache http server 有什么关系?

非常非常感谢伟大的Jasper同志~~
Miao 评论于 2009-08-03 23:38 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
hi Jasper~ (again ;p)
不好意思 又来麻烦请教~
我运行您的测试类之后也出现
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了。
不知道还可能是什么问题呢? 非常感谢~
Miao 评论于 2009-08-04 05:05 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
改成gbk 之后终于ok了 非常感谢 :) 好心情~
Miao 评论于 2009-08-04 05:15 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版
你是刘群老师的学生吗?
rubby 评论于 2009-08-04 22:43 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版[未登录]
@rubby
不是的。
Jasper 评论于 2009-08-05 08:56 回复 更多评论

# re: 10分钟开始使用ICTCLAS Java版[未登录]
你好~~
我运行了为什么总出现导入包的错误啊

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语句一直都有问题哦

# re: 10分钟开始使用ICTCLAS Java版[未登录] hiswing 评论于 2008-09-21 19:48 回复 更多评论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: