论坛首页 Java企业应用论坛

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

浏览 14196 次
精华帖 (3) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-24  
gogobu 写道
有个 Compass 相关的问题想请教。

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

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


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

而 lucene QueryParser 本身也不像 Analyzer和 Similarity那样以接口设计的,它本身就是一个具体实现类。
0 请登录后投票
   发表时间:2009-11-24  
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? 还是说这两者基本上就不兼容?
0 请登录后投票
   发表时间:2009-11-24  
linliangyi,

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

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

因为如果在第一次调用IKAnalyzer时加载词典,用户感觉会比较慢,我想在tomcat容器启动的时候,加载词典,这样,用户第一次使用时就不会感觉到慢了。
0 请登录后投票
   发表时间:2009-11-24  
piziwang 写道
linliangyi,

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

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

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



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

即可。词典占用27M内存,总共27万个词元。
0 请登录后投票
   发表时间:2009-11-24  
linliangyi2007 写道
piziwang 写道
linliangyi,

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

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

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



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

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


明白,我试试,呵呵!
0 请登录后投票
   发表时间: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,搞定。
0 请登录后投票
   发表时间:2009-12-01  
林老师,请教你一个问题:
我最近在使用你的 IKAnalyzer, 我一个需求:提取关键词标签。(从一个标题中抽取有意义的标签Tag)

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

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

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

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

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

0 请登录后投票
   发表时间: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;



0 请登录后投票
   发表时间: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词典??
0 请登录后投票
   发表时间:2009-12-01  
piziwang 写道


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

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


这个也是一个问题,是会影响的。如果你既要全部的词典,又要个性化关键字,那你只能自己在分词后进行二次匹配,来决定那些词要留了。
0 请登录后投票
论坛首页 Java企业应用版

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