论坛首页 Java企业应用论坛

发布IK Analyzer 3.0 中文分词器

浏览 64768 次
该帖已经被评为精华帖
作者 正文
   发表时间:2009-07-22  
langhua9527 写道
好贴
楼主能不能介绍一下分页的方法

我用的是Lucene2.4
我的程序里面是这样分页的,这样分页的坏处就是,比如说有10000条记录被查出来了,要看9000多条的时候
ScoreDoc[] hits对象就要装9000多条记录,然后再去取相应的Document
//创建Query,QueryParser对象,根据Field建立的索引的KEY来搜,并设置要搜的内容
Query query = null;
try {
	query = new QueryParser("description",new ChineseAnalyzer()).parse(keyword);
} catch (ParseException e) {
	e.printStackTrace();
	return;
}
//默认查询出来的数量
int maxFind = 50;
//offset表示分页的从多少条开始
if(offset >= 30){
   maxFind = maxFind + offset;
}
TopDocCollector collector = new TopDocCollector(maxFind);
//查找
indexSearch.search(query,collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
int max = offset+10; 
if(offset+10>hits.length){
	max = hits.length;
}
for(int i=offset;i<max;++i) {
//找到这个Document原来的索引值
int docId = hits[i].doc;
//根据这个值找到对象的Document
Document d = indexSearch.doc(docId);
Article article = new Article();
article.setId(d.get("id"));
article.setTitle(Article.addHightlights(d.get("title"), keyword));
article.setCountent(Article.addHightlights(d.get("des"), keyword));		   
list.add(article);
}



还有一个问题就是加高亮,这个怎么办啊,我都是自己写的方法来加的,这个Lucene里面非核心包有的,怎么用啊,能分享一下不

还有,我在官方看到了
http://hudson.zones.apache.org/hudson/job/Lucene-trunk/javadoc//contrib-analyzers/org/apache/lucene/analysis/cn/package-summary.html
还有这样一个类
SmartChineseAnalyzer
介绍还是比较强大的
比如说:
ChineseAnalyzer: 我-是-中-国-人
CJKAnalyzer: 我是-是中-中国-国人
SmartChineseAnalyzer: 我-是-中国-人

我一直没有下到这个JAR。。。。。你能帮一下不。。。谢谢了,非常感谢


1.关于翻页,你可以使用HitCollect用它来帮你收集制定页码内的记录id.
2.加亮问题可以用自己写的,也可以使用lucene自带的,请参考je-analyzer中关于加亮关键字部分http://phantom.iteye.com/blog/66068
3.分词算法总的分为语义分词、词典分词、机械分词,目前还流行一些按汉字单字字频为基础的分词技术,只能说他们适用于不同领域,很难绝对的说那种就好,那种不好的。试过才知道,哪个更适合。
0 请登录后投票
   发表时间:2009-07-22  
试用了一下...感觉还没有version2好用...
例如:
String text="伊藤洋华堂总府店";
StringReader reader = new StringReader(text);
TokenStream ts = analyzer.tokenStream(text, reader);
Token t = ts.next(new Token());
List<String> list = new ArrayList<String>();
while (t != null) {
System.out.println(t.term()+"   --------");
// if(t.term().length()==str.length()){
// list.clear();
// list.add(t.term());
// return list;
// }
t = ts.next(new Token());
}

输出全是一个字   (伊,藤,洋,华,堂,总,府,店)


而第二版输出是  [伊藤洋华堂总府店, 伊藤, 藤洋, 洋华, 华堂, 堂总, 总府, 府店]

请问version3有没有未知词汇二元分词

还有似乎没有以前的MIK_CAnalyzer()了..!
似乎version3扩展性前了很多.
可以自己配置词典了!
赞一个!..楼主真无私!!
0 请登录后投票
   发表时间:2009-07-22  
ziyu_1 写道
能不能有个人做个测试,测试没种中分词器的性能,看看谁的最好.
IK宣称每秒能到50W,庖丁似乎是每秒20W,差不少.
希望有个中间人做个对比测试


哈哈,本想把IK的性能提升到750000字/s左右,方法已经找到了。不过项目组的组员说,有必要嘛?目的是为啥?想想也是。分词还是以结果为主的,个人感觉效率达到10万字/秒的分词器,基本上就没有差别了。目前je ,paoding和早期的IK都能达到这个水准。

0 请登录后投票
   发表时间:2009-07-22  
fc6029585 写道
试用了一下...感觉还没有version2好用...
例如:
String text="伊藤洋华堂总府店";
StringReader reader = new StringReader(text);
TokenStream ts = analyzer.tokenStream(text, reader);
Token t = ts.next(new Token());
List<String> list = new ArrayList<String>();
while (t != null) {
System.out.println(t.term()+"   --------");
// if(t.term().length()==str.length()){
// list.clear();
// list.add(t.term());
// return list;
// }
t = ts.next(new Token());
}

输出全是一个字   (伊,藤,洋,华,堂,总,府,店)


而第二版输出是  [伊藤洋华堂总府店, 伊藤, 藤洋, 洋华, 华堂, 堂总, 总府, 府店]

请问version3有没有未知词汇二元分词

还有似乎没有以前的MIK_CAnalyzer()了..!
似乎version3扩展性前了很多.
可以自己配置词典了!
赞一个!..楼主真无私!!


3.0确实取消了2元分词,因为对未知词使用2元切分,在召回率上存在一些问题。新的切分算法配合IKQueryParser是能达到很好的搜索效果的,试试看!
0 请登录后投票
   发表时间:2009-07-22  
linliangyi2007 写道
fc6029585 写道
试用了一下...感觉还没有version2好用...
例如:
String text="伊藤洋华堂总府店";
StringReader reader = new StringReader(text);
TokenStream ts = analyzer.tokenStream(text, reader);
Token t = ts.next(new Token());
List<String> list = new ArrayList<String>();
while (t != null) {
System.out.println(t.term()+"   --------");
// if(t.term().length()==str.length()){
// list.clear();
// list.add(t.term());
// return list;
// }
t = ts.next(new Token());
}

输出全是一个字   (伊,藤,洋,华,堂,总,府,店)


而第二版输出是  [伊藤洋华堂总府店, 伊藤, 藤洋, 洋华, 华堂, 堂总, 总府, 府店]

请问version3有没有未知词汇二元分词

还有似乎没有以前的MIK_CAnalyzer()了..!
似乎version3扩展性前了很多.
可以自己配置词典了!
赞一个!..楼主真无私!!


3.0确实取消了2元分词,因为对未知词使用2元切分,在召回率上存在一些问题。新的切分算法配合IKQueryParser是能达到很好的搜索效果的,试试看!

可惜现在有很多的应用并不需要lucene
0 请登录后投票
   发表时间:2009-07-22   最后修改:2009-07-22
再问两个问题:
1.楼主能介绍一下怎么去删除和更新索引吗?

2.比如说,发表一篇文章,我在发表的时候我就去建立索引。。。
这样用Lucene马上就可以搜索到,但是也可以定时建立索引。。
这两种方法那种好一些?
0 请登录后投票
   发表时间:2009-07-22  
以前用过很多的分词器,还是ik 比较好。希望ik 越来越强。
0 请登录后投票
   发表时间:2009-07-22  
langhua9527 写道
再问两个问题:
1.楼主能介绍一下怎么去删除和更新索引吗?

2.比如说,发表一篇文章,我在发表的时候我就去建立索引。。。
这样用Lucene马上就可以搜索到,但是也可以定时建立索引。。
这两种方法那种好一些?


实时索引对lucene而言不是太好的方式,因为有并发锁问题和索引的效率问题。
如果更新频度大的话,可以设定每5分钟索引一次。如果遇到没有记录索引时,做一个算法来延长定时索引的时间。
在频繁建索引后,一定记得固定时间要优化索引,比如每天的凌晨1点。
0 请登录后投票
   发表时间:2009-07-22  
lz刚下了IKAnalyzer3[1].0GA_AllInOne_.rar 包解压
运用到 你写的lucene入门实例中 报
error:(25,33)无法访问 org.wltea.analyzer.lucene.IKAnalyzer
             错误的类文件:F://gquery\web\WEBINF\lib\IKAnalyzer3.0OGA.jar(org/wltea/analyzer/lucene/IKAnalyzer.class)
类文件具有错误的版本 50.0,应为 49.0
请删除该文件或确保该文件位于正确的类路径子目录中
0 请登录后投票
   发表时间:2009-07-22  
cs_sehu 写道
lz刚下了IKAnalyzer3[1].0GA_AllInOne_.rar 包解压
运用到 你写的lucene入门实例中 报
error:(25,33)无法访问 org.wltea.analyzer.lucene.IKAnalyzer
             错误的类文件:F://gquery\web\WEBINF\lib\IKAnalyzer3.0OGA.jar(org/wltea/analyzer/lucene/IKAnalyzer.class)
类文件具有错误的版本 50.0,应为 49.0
请删除该文件或确保该文件位于正确的类路径子目录中


你的jdk版本太低了吧,用6.0的试试

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics