`
linliangyi2007
  • 浏览: 1003547 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

发布 IK Analyzer 3.2.8 for Lucene3.X

阅读更多
IK Analyzer 3.2.8版本修订
  • 1.优化了英文字符处理,支持如:C++ 等带符号单词输出
  • 2.简化了数词处理,使输出结果更符合用户观感
  • 3.改进了最大词长切分,使输出结果更符合用户观感
  • 4.性能优化,目前IK分词器的速度为约85万字/秒(1600K字节/S)
  • 5.新增IK简易查询表达式,简化用户使用


以下对新增的查询表达式做详细说明:

   IK3.2.8版本为简化用户对查询逻辑的处理,提供了基于表达式的搜索逻辑处理。它与Lucene自带表达式的不同之处,在于它采用了IKQueryParser对中文分词歧义处理的算法。相对Lucene QueryParser而言,用它生成的Query对象也许更能命中搜索结果。

表达式样例:
id='1231' && (title:'文档标题'|| content:'内容') – author='helloworld'

  • 1.表达式使用 属性名<->属性值 键值对的形式,属性值使用”’”单引号标识。
  • 2.在键值对中使用 “=”等号,表示对该属性的精确搜索(不分词),适用于对ID、编号、分类等精确值属性搜索;使用“: ”冒号表示对属性的模糊搜索(分词搜索),适用于文本内容的全文搜索。
  • 3.在使用“: ”时,连续的搜索关键字将解析为 AND 逻辑,如果关键字中带有空格,这解析为OR逻辑。如:title:'文档标题' 表示搜索title中同时包含“文档”AND“标题“的数据,title:'文档_标题' 表示搜索title中包含“文档”OR“标题“。(这个例子中,我们默认你使用的IK分词器能将”文档标题“切分为”文档“和”标题“两个词)
  • 4.表达式支持“&&”与 “||” 或“-”非的逻辑操作,以及“( )”括号优先级定义。注意“-”非逻辑不能单独使用,即 “– author='helloworld'” 是非法表达式。
  • 5.目前就是这么简单,暂不支持更复杂的搜索逻辑:).


下载地址:

IK分词器3.2.8发布包

IK分词器3.2.8源码包

PS:如果您使用的是Solr1.3或者v2.9之前的Lucene,请下载IK Analyzer3.1.6GA使用! IK Analyzer3.2.X仅支持Lucene3.0以上版本。

分词效果示例
IK Analyzer 3.2.8版本支持 细粒度切分 和 最大词长切分,以下是两种切分方式的演示样例。
文本原文1:
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了3个大版本。

最大词长分词结果:
引用
ikanalyzer | 是 | 一个 | 开源 | 的 | 基于 | java | 语言 | 开发 | 的 | 轻量级 | 的 | 中文 | 分词 | 工具包 | 从 | 2006 | 年  | 12 | 月 | 推出 | 1.0 | 版 | 开始 | ikanalyzer | 已经 | 推出 | 出了  |  3  |  个  |  大  |  版本

最细粒度分词结果:
引用
ikanalyzer | 是 | 一个 | 一 | 个 | 开源 | 的 | 基于 |  java  | 语言 | 开发 | 的 | 轻量级 | 量级 | 的 | 中文 | 分词 | 工具包 | 工具 | 从 | 2006 | 年  | 12 | 月 | 推出 | 1.0 | 版 | 开始 | ikanalyzer | 已经 | 推出 | 出了  |  3  |  个  |  大  |  版本


文本原文2:
作者博客:linliangyi2007.iteye.com   电子邮件:linliangyi2005@gmail.com

最大词长分词结果:
引用
作者 | 博客 | linliangyi2007.iteye.com | 电子邮件 | linliangyi2005@gmail.com

最细粒度分词结果:
引用
作者 | 博客 | linliangyi2007.iteye.com | linliangyi | 2007 | javaeye | com | 电子邮件 | linliangyi2005@gmail.com | linliangyi | 2005 | gmail | com


文本原文3
古田县城关六一四路四百零五号

最大词长分词结果:
引用
古田县 |  县城  |  城关 | 六一四  | 路 | 四百零五 | 号

最细粒度分词结果:
引用
古田县 | 古田 |  县城 |  城关 |  六一四 | 六一 | 四 | 路 | 四百零五 | 四 | 百 | 零 | 五 | 号


文本原文4
曙光天阔 I620r-G /A950r-F 夏普SH9020C

最大词长分词结果:
引用
曙光 | 天 | 阔 | i620r-g | a950r-f | 夏普 | sh9020c

最细粒度分词结果:
引用
曙光 | 天 | 阔 | i620r-g | i | 620 | r | g | a950r-f | a | 950 | r | f | 夏普 | sh9020c | sh | 9020 | c




分享到:
评论
44 楼 gujie890411 2012-06-06  
linliangyi2007 写道
gujie890411 写道
linliangyi2007 写道
gujie890411 写道
林前辈,你好!请教您一个问题!
我想要做中文检索的精确查询,比如

Document doc = new Document();
Field field = new Field("content","我们的中国客户是很好的!",Field.Store.YES, Field.Index.ANALYZED); 
doc.add(field);

Document doc1 = new Document();
Field field1 = new Field("content","我们的外国客户和中国客户都是是很好的!",Field.Store.YES, Field.Index.ANALYZED); 
doc1.add(field1);
输入关键词“我们的中国客户”,我希望的结果是只获得第一个doc的内容,即“我们的中国客户是很好的!”


建议使用数据库like匹配吧,你的要求根本不需要用lucene啊

林老师,你好,但是我要做的是全文检索呀,我不能将全文都放到数据库的,现在面临的难题是,我要实现先进行模糊检索,然后在结果中精确检索,费脑子啊!不知道林老师有没有好的指点。(其中在结果中检索我是用BooleanQuery实现的,英文的精确检索我用的是PhraseQuery,但是中文的精确检索(不分词的状态下我可以用WildCardQuery实现,但是如果不分词模糊检索又不行了)实现不了了,求指点!)


索引使用单字索引,StandardAnalyzer就好,搜索使用PhraseQuery就OK

ok,我试试,3q!
43 楼 linliangyi2007 2012-06-06  
gujie890411 写道
linliangyi2007 写道
gujie890411 写道
林前辈,你好!请教您一个问题!
我想要做中文检索的精确查询,比如

Document doc = new Document();
Field field = new Field("content","我们的中国客户是很好的!",Field.Store.YES, Field.Index.ANALYZED); 
doc.add(field);

Document doc1 = new Document();
Field field1 = new Field("content","我们的外国客户和中国客户都是是很好的!",Field.Store.YES, Field.Index.ANALYZED); 
doc1.add(field1);
输入关键词“我们的中国客户”,我希望的结果是只获得第一个doc的内容,即“我们的中国客户是很好的!”


建议使用数据库like匹配吧,你的要求根本不需要用lucene啊

林老师,你好,但是我要做的是全文检索呀,我不能将全文都放到数据库的,现在面临的难题是,我要实现先进行模糊检索,然后在结果中精确检索,费脑子啊!不知道林老师有没有好的指点。(其中在结果中检索我是用BooleanQuery实现的,英文的精确检索我用的是PhraseQuery,但是中文的精确检索(不分词的状态下我可以用WildCardQuery实现,但是如果不分词模糊检索又不行了)实现不了了,求指点!)


索引使用单字索引,StandardAnalyzer就好,搜索使用PhraseQuery就OK
42 楼 gujie890411 2012-06-04  
linliangyi2007 写道
gujie890411 写道
林前辈,你好!请教您一个问题!
我想要做中文检索的精确查询,比如

Document doc = new Document();
Field field = new Field("content","我们的中国客户是很好的!",Field.Store.YES, Field.Index.ANALYZED); 
doc.add(field);

Document doc1 = new Document();
Field field1 = new Field("content","我们的外国客户和中国客户都是是很好的!",Field.Store.YES, Field.Index.ANALYZED); 
doc1.add(field1);
输入关键词“我们的中国客户”,我希望的结果是只获得第一个doc的内容,即“我们的中国客户是很好的!”


建议使用数据库like匹配吧,你的要求根本不需要用lucene啊

林老师,你好,但是我要做的是全文检索呀,我不能将全文都放到数据库的,现在面临的难题是,我要实现先进行模糊检索,然后在结果中精确检索,费脑子啊!不知道林老师有没有好的指点。(其中在结果中检索我是用BooleanQuery实现的,英文的精确检索我用的是PhraseQuery,但是中文的精确检索(不分词的状态下我可以用WildCardQuery实现,但是如果不分词模糊检索又不行了)实现不了了,求指点!)
41 楼 linliangyi2007 2012-06-04  
gujie890411 写道
林前辈,你好!请教您一个问题!
我想要做中文检索的精确查询,比如

Document doc = new Document();
Field field = new Field("content","我们的中国客户是很好的!",Field.Store.YES, Field.Index.ANALYZED); 
doc.add(field);

Document doc1 = new Document();
Field field1 = new Field("content","我们的外国客户和中国客户都是是很好的!",Field.Store.YES, Field.Index.ANALYZED); 
doc1.add(field1);
输入关键词“我们的中国客户”,我希望的结果是只获得第一个doc的内容,即“我们的中国客户是很好的!”


建议使用数据库like匹配吧,你的要求根本不需要用lucene啊
40 楼 gujie890411 2012-06-03  
林前辈,你好!请教您一个问题!
我想要做中文检索的精确查询,比如

Document doc = new Document();
Field field = new Field("content","我们的中国客户是很好的!",Field.Store.YES, Field.Index.ANALYZED); 
doc.add(field);

Document doc1 = new Document();
Field field1 = new Field("content","我们的外国客户和中国客户都是是很好的!",Field.Store.YES, Field.Index.ANALYZED); 
doc1.add(field1);
输入关键词“我们的中国客户”,我希望的结果是只获得第一个doc的内容,即“我们的中国客户是很好的!”
39 楼 eyeruby 2012-05-24  
解放军 分词有2个 解放 解放军,在highlighter的时候得到
<font color='red'>解放</font><font color='red'>解放军</font>
这是不是不太合理?
38 楼 eyeruby 2012-05-24  
使用IK3.2.8 + Lucene 3.0.3,

questions:
1.
lucene3.0.3  使用Field field = new Field("content", new FileReader(f),Field.TermVector.WITH_POSITIONS_OFFSETS);
content 字段不会被存储,然后使用targetDoc.get("content")得到的是null.
后面在高亮的时候,调用highlighter.getBestFragment(TokenStream, text)
时,text是把文件再读一遍吗?
2.
TokenStream ts = new IKAnalyzer(true).tokenStream(searchField,
new FileReader(path)); //得到tokenstream
3.
highlighter.getBestFragments(ts,str, maxNumFragmentsRequired,fragmentSeparator);
str=readFile(doc.get("path"));//这样得到的

发现 搜索单个关键词(解放军)如果搜索的关键词在文章的开头(index=0)就出现,而且文章中有多处,这样第2个关键词(解放军)出现的地方的offset不对, 如果在关键词不在index=0的位置,第2个关键词的offset就对了
37 楼 linliangyi2007 2011-11-23  
trh3037 写道
林老师,你好。我发现ik好像对中英文混合,或者数字中文混合,无法分词啊。

比如有一段话“用户从2010年10月11号开始,申请宽带4M升级到10M”
我才用外部词库,
List<String> strs = new ArrayList<String>();
        strs.add("用户");
        strs.add("98升级到109");
        strs.add("2010年10月11号");
        strs.add("开始");
        strs.add("申请宽带");
        strs.add("4M升级到10M");
        Dictionary.loadExtendWords(strs);

想要的结果是:用户|2010年10月11号|开始|申请宽带|4M升级到10M。

但是实际结果是:用户|2010|年|10|月|11|号|开始|申请宽带|4m|升级到|10m|

也就是说希望“4M升级到10M”是一起的。但是分词出来的,却变成:4M|升级到|10M。

就是说在分词的时候,能否以外部词库为主?。


词库只是放中文词语的,对E文字符是无效的。
36 楼 trh3037 2011-11-18  
林老师,你好。我发现ik好像对中英文混合,或者数字中文混合,无法分词啊。

比如有一段话“用户从2010年10月11号开始,申请宽带4M升级到10M”
我才用外部词库,
List<String> strs = new ArrayList<String>();
        strs.add("用户");
        strs.add("98升级到109");
        strs.add("2010年10月11号");
        strs.add("开始");
        strs.add("申请宽带");
        strs.add("4M升级到10M");
        Dictionary.loadExtendWords(strs);

想要的结果是:用户|2010年10月11号|开始|申请宽带|4M升级到10M。

但是实际结果是:用户|2010|年|10|月|11|号|开始|申请宽带|4m|升级到|10m|

也就是说希望“4M升级到10M”是一起的。但是分词出来的,却变成:4M|升级到|10M。

就是说在分词的时候,能否以外部词库为主?。
35 楼 ynyee 2011-11-07  
大哥好,配置solr中使用IK的分词,但在ADMIN界面中测试的时候还是一个字一个字分出来的。
是不是下面的配置有问题:
    <fieldType name="text_general" class="solr.TextField">
	  <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />
      <analyzer type="index">
        <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory"
		isMaxWordLength="false"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <filter class="solr.LowerCaseFilterFactory"/>
		<filter class="solr.PorterStemFilterFactory"/>
		<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
      <analyzer type="query">
       <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory"
		isMaxWordLength="true"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.LowerCaseFilterFactory"/>
		<filter class="solr.PorterStemFilterFactory"/>
		<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
    </fieldType>
34 楼 gongzhe85 2011-11-01  
谢谢林老师,另外还有个IKParser的困惑请教

我有如下查询语句,在域text中查询:
('铁路'||'火车')&&('事故'||'出轨')
('铁路' '火车')&&('事故' '出轨')
表达的逻辑您大概能明白,就是两组词一组是实体另一组是动作,无论出现哪种组合都符合查询条件。

但是我把这两个条件的query打印出来,如下
+text:铁路 +text:火车 +text:事故 +text:出轨
text:铁路 (+text:火车 +text:事故) text:出轨
两个好象都不太符合我本来的意思。

请林老师指导下,IK中||和空格的区别还有括号的作用,另外我那种逻辑IK是否支持,谢谢啦。
33 楼 linliangyi2007 2011-10-31  
gongzhe85 写道
林老师,您好!

我想请教一下自定义词典的路径配置问题。我的程序不是web程序,而是用jar包直接在控制台运行,我把IKAnalyzer.cfg.xml和dic文件都放在资源路径下,打包时就一起打进jar包了,dic文件就不能修改了。IKAnalyzer.cfg.xml里使用绝对路径找dic也不行,请问有什么好办法吗。


跟是不是web应用无关,放在类的根目录下就好
32 楼 gongzhe85 2011-10-30  
林老师,您好!

我想请教一下自定义词典的路径配置问题。我的程序不是web程序,而是用jar包直接在控制台运行,我把IKAnalyzer.cfg.xml和dic文件都放在资源路径下,打包时就一起打进jar包了,dic文件就不能修改了。IKAnalyzer.cfg.xml里使用绝对路径找dic也不行,请问有什么好办法吗。
31 楼 elvishehai 2011-10-24  
请问下.词库的管理上,有什么好的介意了,如先查询词库中是否存在,没有的话直接添加到词库中.
30 楼 confident_f 2011-10-08  
林老师,你好。我想请教您一个问题,在一个项目里我想使用两个不同的ik分词器,简单来说,就是希望不同的ik分词器对应不同的xml配置文件,这样它们对应的扩展字典是不同的,分词的效果也就是不同的了。不知道这样能否实现,如何实现?多谢!
29 楼 privatemiao 2011-09-13  
你好!
我刚开始研究 搜索引擎。

现在正在研究 solr
使用 ik 后
还能在  schema.xml 中配置 支持 dataimport 的数据库中的字段吗?

谢谢
28 楼 mohenglyf 2011-09-07  
林老师,你好,为什么我对"古田县城关六一四路四百零五号"分词,结果跟你的结果不一样呢?
最大词长结果:
1古田县
2县城
3城关
4六一四
5六一
6四
7路
8四百零五
9四
10百
11零
12五
13号
最细粒度结果:
1古田县
2古田
3县城
4城关
5六一四
6六一
7四
8路
9四百零五
10四
11百
12零
13五
14号
27 楼 whht195444 2011-07-30  
林老师:
    刚才我看了一下,mydict.dic格式刚开始的时候我故意修改为GBK,结果没有分词成功,然后我将IKAnalyzer3.2.8 source里面的mydict.dic文件COPY到我的项目中,然后添加词组“固定床”,执行后,效果一样,对于“固定术”,程序分成了:固定 术 二个词组。
    三个文件的目录我是放在src根目录下的,有办法测试,词库读取是否成功的方法吗?
26 楼 linliangyi2007 2011-07-30  
whht195444 写道
林老师,我在扩展词库的时候为不成功呢?现先我的配置方法与内容粘在下面:
IK版本 3.2.8
  现在IKAnalyzer.cfg.xml中进行配置内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典     -->
	<entry key="ext_dict">/mydict.dic;</entry> 
	
	<!--用户可以在这里配置自己的扩展停止词字典
	<entry key="ext_stopwords">/ext_stopword.dic</entry> 
	-->
</properties>


mydict.dic内容如下:

ab
固定术
复位术
cde



分词代码如下:
   List<String> list = new ArrayList<String>();
        StringReader input = new StringReader("固定术复位术abcde");
        IKSegmentation ikSeg = new IKSegmentation(input, true);
        Lexeme lexeme;
        try {
            while ((lexeme = ikSeg.next()) != null) {
                System.out.println(lexeme.getLexemeText());
                list.add(lexeme.getLexemeText());
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


想达到的效果是:固定术 复位术 aa cde四个词组
实际效果为:固定 术 复位 术 abcde 五个词组

mydict.dic、ext_stopword.dic、IKAnalyzer.cfg.xml放在同一目录下,进行DEBUG里面运行的,还没有进行部署,



1.从中文的分词效果看,你的词典没有被正确读取,请确定你的词典编码是UTF-8,以及词典放置在classes的根路径下。
2.词典负责中文词语切分,所有英文字符在词典中都是无效的。
25 楼 whht195444 2011-07-30  
林老师,我在扩展词库的时候为不成功呢?现先我的配置方法与内容粘在下面:
IK版本 3.2.8
  现在IKAnalyzer.cfg.xml中进行配置内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典     -->
	<entry key="ext_dict">/mydict.dic;</entry> 
	
	<!--用户可以在这里配置自己的扩展停止词字典
	<entry key="ext_stopwords">/ext_stopword.dic</entry> 
	-->
</properties>


mydict.dic内容如下:

ab
固定术
复位术
cde



分词代码如下:
   List<String> list = new ArrayList<String>();
        StringReader input = new StringReader("固定术复位术abcde");
        IKSegmentation ikSeg = new IKSegmentation(input, true);
        Lexeme lexeme;
        try {
            while ((lexeme = ikSeg.next()) != null) {
                System.out.println(lexeme.getLexemeText());
                list.add(lexeme.getLexemeText());
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


想达到的效果是:固定术 复位术 aa cde四个词组
实际效果为:固定 术 复位 术 abcde 五个词组

mydict.dic、ext_stopword.dic、IKAnalyzer.cfg.xml放在同一目录下,进行DEBUG里面运行的,还没有进行部署,

相关推荐

    IKAnalyzer3.2.8 源码

    IKAnalyzer3.2.8分词器 源码,用户lucene索引开发中

    Solr3.6+IKAnalyzer3.2.8分词安装部署

    Solr是一个全文检索服务器,基于Lucene3.5开发的,我们可以在solr的基础上进行定制化的开发。新手学习记录了学习过程为后来者提供个参考吧。

    IKAnalyzer3.2.8

    IKAnalyzer是中国人自己开发的功能强大分词器,弥补了lucene自带的分词器的不足

    IKAnalyzer-3.2.8.jar

    IK Analyzer 3.2.8特性 采用了特有的“正吐迭代最细粒度切分算法“,支持细粒度和最大词长两种切分模式;具有83万字/秒(1600KB/S)的高速处理能力。 采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等...

    IK Analyzer实现Java lucene中文分词相关资源架包

    IK Analyzer是基于lucene实现的分词开源框架 需要在项目中引入: IKAnalyzer.cfg.xml IKAnalyzer2012.jar lucene-core-4.3.0.jar stopword.dic

    Apache Lucene全文检索和IKAnalyzer分词工具类

    说明:依赖jar包:lucene-core-2.3.2.jar、IKAnalyzer3.2.8.jar。 一、LuceneUtil 工具类代码: package com.zcm.lucene; import java.io.File; import java.io.IOException; import java.io.StringReader; import...

    Lucene使用

    IKAnalyzer分词 2012版不支持,采用3.2.8版 在使用2012版时异常:ClassNotFoundException: org.apache.lucene.analysis.tokenattributes.CharTermAttribute 庖丁分词 使用 paoding-analysis-2.0.4-beta.zip 版时...

    全文检索所用jar包3.6版本

    IKAnalyzer3.2.8.jar lucene-analyzers-3.5.0.jar lucene-core-3.6.1.jar lucene-highlighter-3.5.0.jar lucene-memory-3.5.0.jar

    Lucene开发所需其他架包和中文分词器

    Lucene开发所需其他架包和中文分词器(solr3.5+IKAnalyzer3.2.8),没有加入Lucene包,需要可去http://archive.apache.org/dist/lucene/java/4.10.3/下载相应包。

    springmvc 各种jar包

    28,IKAnalyzer-3.2.8.jar 29,im4java-1.4.0.jar 30,jackson-annotations-2.1.4.jar 31,jackson-core-2.1.4.jar 32,jackson-databind-2.1.4.jar 33,javassist-3.15.jar 34,jaxen-1.1.1.jar 35,jaxme-api-0.3....

Global site tag (gtag.js) - Google Analytics