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

发布IKAnalyzer中文分词器V3.1.6GA

阅读更多

IKAnalyzer3.2.0稳定版已经发布,支持Lucene3.0和solr1.4
链接:http://www.iteye.com/topic/542987

V3.1.1GA -- V3.1.5GA 版本变更一览
  • 1.添加“正向最大切分算法”。
  • 2.完善IK Analyzer对solr1.3版本的集成支持
  • 3.改进对文件名、邮件地址、英文数字混合字串的切分算法
  • 4.新增对停止词(stopword)的自定义扩展
  • 5.支持对JDK1.5的版本的集成



V3.1.6GA版本变更:
新增IK Analyzer对solr1.4版本的集成支持

1.新增org.wltea.analyzer.solr.IKTokenizerFactory14,支持solr1.4的TokenizerFactory接口配置

 类org.wltea.analyzer.solr.IKTokenizerFactory14
说明:该类继承与solr1.4的BaseTokenizerFactory,是IK分词器对solr1.4项目TokenizerFactory接口的扩展实现。从版本V3.1.6起。
属性:isMaxWordLength。该属性决定分词器是否采用最大词语切分。

solr1.4配置样例
使用IKAnalyzer的配置
<schema name="example" version="1.1">
……
<fieldType name="text" class="solr.TextField">
      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
……
</schema>


使用IKTokenizerFactory14的配置
<fieldType name="text" class="solr.TextField" >
	<analyzer type="index">
		<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory14" isMaxWordLength="false"/>
……

	</analyzer>
	<analyzer type="query">
		<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory14" isMaxWordLength="true"/>
	……
	</analyzer>
</fieldType>


下载 :IKAnalyzer3.1.6GA完整包

更多详细请参看《IKAnalyzer中文分词器V3.1.6使用手册》




分享到:
评论
33 楼 zdb_cn 2014-06-03  
不能和数字一起分组,太伤了,啥时候能解决这个问题呢
32 楼 liuyu_it 2012-05-21  
我有个问题想要请教下  SOLR 用DATAIMPORT索引数据库时我的字段是CLOB,为什么有的数据可以索引,有的就会报异常啊 ArrayIndexOutOfBoundsException,里面包含HTML标签
31 楼 hs798630734 2010-11-04  
林老师,您好!我是一个刚接触lucene的java程序员,最近在用您的IKAnalyzer。遇到了些问题,希望您能帮我解答下:
Query query = IKQueryParser.parseMultiField(new String[]{"name","content"}, searchWord);//按文件名搜索
// 搜索相似度最高的5条记录
TopDocs topDocs= indexSearcher.search(query, 5);
报一个这样的异常:java.lang.ArrayIndexOutOfBoundsException: 5

就是搜索相似度最高的5条记录,记录数怎么大于5条了啊?由于刚接触,所以希望您能帮忙解答,谢谢您
30 楼 guava 2010-08-11  
/**
* 向分词结果集添加词元
* @param lexeme
*/
public void addLexeme(Lexeme lexeme){
if(!Dictionary.isStopWord(segmentBuff , lexeme.getBegin() , lexeme.getLength())){
if(lexeme.getLength()>1 && lexeme.getLexemeType()==0){
this.lexemeSet.addLexeme(lexeme);
}

}
}

作了这样的修改 ok了 谢谢
29 楼 linliangyi2007 2010-08-10  
guava 写道
在使用中有几个问题 请老师在百忙中回答一下
1 我在mydict.dic里面写了 “7仔”这个词,分词分不出来,是不是因为数字和文字混在一起就不行啊?(其他自定义的词是可以的)
2 如果我想分出来的词,都是长度为2以上的,怎么做呢?
3 我代码里写了
  Analyzer analyzer = new IKAnalyzer();
  this.iwriter =  new IndexWriter(indexDir,analyzer ,true , IndexWriter.MaxFieldLength.UNLIMITED);
  那怎么获取到 IKSegmentation ikSeg
  因为我想根据切分出来的Lexeme的Type来判断是否只是TYPE_CJK_NORMAL
  因为我只需要把这个类型的词进行索引



另外提醒你,如果可以尽可能升级Lucene到3.0并下载Ik Analyzer 3.2.3版本
28 楼 linliangyi2007 2010-08-10  
guava 写道
在使用中有几个问题 请老师在百忙中回答一下
1 我在mydict.dic里面写了 “7仔”这个词,分词分不出来,是不是因为数字和文字混在一起就不行啊?(其他自定义的词是可以的)
2 如果我想分出来的词,都是长度为2以上的,怎么做呢?
3 我代码里写了
  Analyzer analyzer = new IKAnalyzer();
  this.iwriter =  new IndexWriter(indexDir,analyzer ,true , IndexWriter.MaxFieldLength.UNLIMITED);
  那怎么获取到 IKSegmentation ikSeg
  因为我想根据切分出来的Lexeme的Type来判断是否只是TYPE_CJK_NORMAL
  因为我只需要把这个类型的词进行索引



1.词典只能处理全中文的词汇,对于数字型字符,会被分配到数字切分器处理,无法进入中文切分过程

2/3综合两个问题,我想你的需求是仅需要对词典包含的词进行切分,那么你可以修改源码, org.wltea.analyzer.cfg.Configuration类中的public static List<ISegmenter> loadSegmenter()方法,移除其中的QuantifierSegmenter和LetterSegmenter子分词器
另外,修改org.wltea.analyzer.Context中的addLexeme方法,过滤长度小于2的词语,只添加Type为TYPE_CJK_NORMAL的词元
27 楼 guava 2010-08-10  
在使用中有几个问题 请老师在百忙中回答一下
1 我在mydict.dic里面写了 “7仔”这个词,分词分不出来,是不是因为数字和文字混在一起就不行啊?(其他自定义的词是可以的)
2 如果我想分出来的词,都是长度为2以上的,怎么做呢?
3 我代码里写了
  Analyzer analyzer = new IKAnalyzer();
  this.iwriter =  new IndexWriter(indexDir,analyzer ,true , IndexWriter.MaxFieldLength.UNLIMITED);
  那怎么获取到 IKSegmentation ikSeg
  因为我想根据切分出来的Lexeme的Type来判断是否只是TYPE_CJK_NORMAL
  因为我只需要把这个类型的词进行索引
26 楼 linliangyi2007 2010-02-24  
huangfox 写道
请问
对 “玩具汽车” 进行分词被分成: “玩具”和“汽车”
但是检索需求 查“车”也能够检索出 玩具汽车
请问是否可以将“玩具汽车”
分成:




玩具
汽车
即:第一按字分;第二按词分。

若是要改源代码,怎么处理呢?
  ps:对分词源码还没有读过呢~


你可以加一个简单的单字切分的子分词器到IK中,实现IK的ISegmenter接口,并修改Configuration中的loadSegmenter方法。
同时必须使用IKAnalyzer(false)方式构造分词器,这样不会过滤重叠的单字切分。
25 楼 jacky2007 2009-12-03  
linliangyi2007 写道
jacky2007 写道
lucene3.0下出现以下错误

Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z
at org.apache.lucene.index.DocInverterPerField.processFields(DocInverterPerField.java:137)
at org.apache.lucene.index.DocFieldProcessorPerThread.processDocument(DocFieldProcessorPerThread.java:246)
at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:773)
at org.apache.lucene.index.DocumentsWriter.addDocument(DocumentsWriter.java:751)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1928)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1902)
at IKAnalyzerDemo.main(IKAnalyzerDemo.java:43)



IK3.1.6GA不支持Lucene3.0版本,原因是Lucene3.0完全改变了先前版本的analysis部分的API。在lucene2.9开始,已经声明要废除旧API,不过做了兼容处理,到了3.0则彻底删除了。

为此IK Analyzer将在下周一份发布 3.2.0版本,新版本将全面跟随lucene3.0的升级。新版本会支持lucene2.9 - lucene3.0 以及 solr1.4 ,但不再对lucene2.4的API支持。

目前3.2.0版本已经在测试阶段,您可以留下email,提前获取新版本体验。谢谢


谢谢回复.
email:ccx1999#163.com(请把#换成@)
24 楼 linliangyi2007 2009-12-03  
jacky2007 写道
lucene3.0下出现以下错误

Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z
at org.apache.lucene.index.DocInverterPerField.processFields(DocInverterPerField.java:137)
at org.apache.lucene.index.DocFieldProcessorPerThread.processDocument(DocFieldProcessorPerThread.java:246)
at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:773)
at org.apache.lucene.index.DocumentsWriter.addDocument(DocumentsWriter.java:751)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1928)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1902)
at IKAnalyzerDemo.main(IKAnalyzerDemo.java:43)



IK3.1.6GA不支持Lucene3.0版本,原因是Lucene3.0完全改变了先前版本的analysis部分的API。在lucene2.9开始,已经声明要废除旧API,不过做了兼容处理,到了3.0则彻底删除了。

为此IK Analyzer将在下周一份发布 3.2.0版本,新版本将全面跟随lucene3.0的升级。新版本会支持lucene2.9 - lucene3.0 以及 solr1.4 ,但不再对lucene2.4的API支持。

目前3.2.0版本已经在测试阶段,您可以留下email,提前获取新版本体验。谢谢
23 楼 jacky2007 2009-12-03  
lucene3.0下出现以下错误

Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z
at org.apache.lucene.index.DocInverterPerField.processFields(DocInverterPerField.java:137)
at org.apache.lucene.index.DocFieldProcessorPerThread.processDocument(DocFieldProcessorPerThread.java:246)
at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:773)
at org.apache.lucene.index.DocumentsWriter.addDocument(DocumentsWriter.java:751)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1928)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1902)
at IKAnalyzerDemo.main(IKAnalyzerDemo.java:43)
22 楼 jacky2007 2009-12-03  
在lucene3.0下使用会有错误的?
21 楼 piziwang 2009-12-01  
linliangyi2007 写道
piziwang 写道


删除原有的主词典 岂不是其他地方的lucene+IKanalyzer全文检索 就无法使用了啊?

替换IK的词典,会不会影响到内存中已经加载的IK词典??


这个也是一个问题,是会影响的。如果你既要全部的词典,又要个性化关键字,那你只能自己在分词后进行二次匹配,来决定那些词要留了。

也只能对分词后的结果再次进行二次匹配了。
谢谢您啊!呵呵

顺便问一句:网上很多论坛帖子的标签Tag是如何生成的啊??
20 楼 linliangyi2007 2009-12-01  
piziwang 写道


删除原有的主词典 岂不是其他地方的lucene+IKanalyzer全文检索 就无法使用了啊?

替换IK的词典,会不会影响到内存中已经加载的IK词典??


这个也是一个问题,是会影响的。如果你既要全部的词典,又要个性化关键字,那你只能自己在分词后进行二次匹配,来决定那些词要留了。
19 楼 piziwang 2009-12-01  
linliangyi2007 写道
piziwang 写道
林老师,请教你一个问题:
我最近在使用你的 IKAnalyzer, 我一个需求:提取关键词标签。(从一个标题中抽取有意义的标签Tag)

例如,标题: “从全文检索的数据分析来看,https数据不正确,无法还原数据。”

标题中“全文检索”、“https”、“还原” 是有意义的标签 Tag。

我使用 IKAnalyzer 对上面的标题进行分词,如何抽取出上面的标签Tag,其余的词语全部丢掉??

比如,我定义了一个词典,里面存放我们认为有意义的标签 Tag,根据这个标签词典进行标题内容的标签Tag抽取?

myTag.dict
全文
https
还原
手机报警
电信扩容
信息碰撞
关系图
......



如果你需要信息抽取,你可以尝试使用IKSegmentation进行分词,并使用自定义的词典代替IK的词典(换句话说,删除原有的主词典)。
程序如下:
List<String> testStr = new ArrayList<String>(); 
testStr.add("IKAnalyzer 是一个开源的,基于java 语言开发的轻量级的中文分词工具包。从2006 年12月推出1.0 版开始, IKAnalyzer 已经推出了3 个大版本。"); 
 
for(String t : testStr){
System.out.println(t); 
IKSegmentation ikSeg = new IKSegmentation(new StringReader(t) , false);
try {
Lexeme l = null;
while( (l = ikSeg.next()) != null){
System.out.println(l);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("***************"); 
}


再根据切分出来的Lexeme的Type来判断是不是词典中的词,以下是Type的分类。
	//lexemeType常量
	//普通词元
	public static final int TYPE_CJK_NORMAL = 0;
	//姓氏
	public static final int TYPE_CJK_SN = 1;
	//尾缀
	public static final int TYPE_CJK_SF = 2;
	//未知的
	public static final int TYPE_CJK_UNKNOWN = 3;
	//数词
	public static final int TYPE_NUM = 10;
	//量词
	public static final int TYPE_NUMCOUNT = 11;
	//英文
	public static final int TYPE_LETTER = 20;




"如果你需要信息抽取,你可以尝试使用IKSegmentation进行分词,并使用自定义的词典代替IK的词典(换句话说,删除原有的主词典)。"

删除原有的主词典 岂不是其他地方的lucene+IKanalyzer全文检索 就无法使用了啊?

替换IK的词典,会不会影响到内存中已经加载的IK词典??
18 楼 linliangyi2007 2009-12-01  
piziwang 写道
林老师,请教你一个问题:
我最近在使用你的 IKAnalyzer, 我一个需求:提取关键词标签。(从一个标题中抽取有意义的标签Tag)

例如,标题: “从全文检索的数据分析来看,https数据不正确,无法还原数据。”

标题中“全文检索”、“https”、“还原” 是有意义的标签 Tag。

我使用 IKAnalyzer 对上面的标题进行分词,如何抽取出上面的标签Tag,其余的词语全部丢掉??

比如,我定义了一个词典,里面存放我们认为有意义的标签 Tag,根据这个标签词典进行标题内容的标签Tag抽取?

myTag.dict
全文
https
还原
手机报警
电信扩容
信息碰撞
关系图
......



如果你需要信息抽取,你可以尝试使用IKSegmentation进行分词,并使用自定义的词典代替IK的词典(换句话说,删除原有的主词典)。
程序如下:
List<String> testStr = new ArrayList<String>(); 
testStr.add("IKAnalyzer 是一个开源的,基于java 语言开发的轻量级的中文分词工具包。从2006 年12月推出1.0 版开始, IKAnalyzer 已经推出了3 个大版本。"); 
 
for(String t : testStr){
System.out.println(t); 
IKSegmentation ikSeg = new IKSegmentation(new StringReader(t) , false);
try {
Lexeme l = null;
while( (l = ikSeg.next()) != null){
System.out.println(l);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("***************"); 
}


再根据切分出来的Lexeme的Type来判断是不是词典中的词,以下是Type的分类。
	//lexemeType常量
	//普通词元
	public static final int TYPE_CJK_NORMAL = 0;
	//姓氏
	public static final int TYPE_CJK_SN = 1;
	//尾缀
	public static final int TYPE_CJK_SF = 2;
	//未知的
	public static final int TYPE_CJK_UNKNOWN = 3;
	//数词
	public static final int TYPE_NUM = 10;
	//量词
	public static final int TYPE_NUMCOUNT = 11;
	//英文
	public static final int TYPE_LETTER = 20;



17 楼 piziwang 2009-12-01  
林老师,请教你一个问题:
我最近在使用你的 IKAnalyzer, 我一个需求:提取关键词标签。(从一个标题中抽取有意义的标签Tag)

例如,标题: “从全文检索的数据分析来看,https数据不正确,无法还原数据。”

标题中“全文检索”、“https”、“还原” 是有意义的标签 Tag。

我使用 IKAnalyzer 对上面的标题进行分词,如何抽取出上面的标签Tag,其余的词语全部丢掉??

比如,我定义了一个词典,里面存放我们认为有意义的标签 Tag,根据这个标签词典进行标题内容的标签Tag抽取?

myTag.dict
全文
https
还原
手机报警
电信扩容
信息碰撞
关系图
......

16 楼 gogobu 2009-11-25  
gogobu 写道
linliangyi2007 写道
gogobu 写道
有个 Compass 相关的问题想请教。

IKAnalyzer 和 IKSimilarity 目前都是直接继承了 Lucene,所以直接接入 Compass 没有问题。但 IKQueryParser 好象不是,无法直接替代 lucene 的 QueryParser。

请问有什么方法可以把 IKQueryParser 集成到 Compass 里面?谢谢!


IKQueryParser 与 lucene QueryParser并不是接口实现关系。IKQueryParser是为了实现分词歧义的组合优化而设计的,并不像 lucene QueryParser那样可以解析lucene的查询表达式。只是命名的时候,不知道叫啥最合适,最后还是选择了QueryParser。

而 lucene QueryParser 本身也不像 Analyzer和 Similarity那样以接口设计的,它本身就是一个具体实现类。


明白了,谢谢。如果我还是想用上 IKQueryParser,是不是可以自己实现一个类重载 lucene QueryParser,然后在里面调用 IKQueryParser? 还是说这两者基本上就不兼容?


自问自答,按照Compass的框架写了个简单的custom QueryParser,搞定。
15 楼 piziwang 2009-11-24  
linliangyi2007 写道
piziwang 写道
linliangyi,

如何在tomcat启动的时候,就加载 IKAnalyzer的词典?

而不是在第一次调用IKAnalyzer时加载词典。

因为如果在第一次调用IKAnalyzer时加载词典,用户感觉会比较慢,我想在tomcat容器启动的时候,加载词典,这样,用户第一次使用时就不会感觉到慢了。



创建一个Tomcat的ContextListener(这个知道吧),在初始化方法中调用
org.wltea.analyzer.dic.Dictionary.getInstance();

即可。词典占用27M内存,总共27万个词元。


明白,我试试,呵呵!
14 楼 linliangyi2007 2009-11-24  
piziwang 写道
linliangyi,

如何在tomcat启动的时候,就加载 IKAnalyzer的词典?

而不是在第一次调用IKAnalyzer时加载词典。

因为如果在第一次调用IKAnalyzer时加载词典,用户感觉会比较慢,我想在tomcat容器启动的时候,加载词典,这样,用户第一次使用时就不会感觉到慢了。



创建一个Tomcat的ContextListener(这个知道吧),在初始化方法中调用
org.wltea.analyzer.dic.Dictionary.getInstance();

即可。词典占用27M内存,总共27万个词元。

相关推荐

Global site tag (gtag.js) - Google Analytics