浏览 6973 次
锁定老帖子 主题:Lucene中文分词之网络隐士八卦版
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-02-06
http://so.mdbchina.com
俺自己搞了个Lucene中文分词,看到版上qieqie师傅发表的他自己搞的Lucene中文分词,隐士很感兴趣,想进来说两句,注册一把,晕,三天后才可以说话,刚刚可以说话。俺来介绍一下俺的中文分词实现。参考站点:俺的分词做了这么几件事:装载各类词库 —— 中文繁体转简体 —— 初步分词 —— 在初步分词基础上进行运算量可控的二次分词(运算量o(n),n句子长度) —— 计算十几个分词结果的score —— 得到score最高的那个分词组合 —— 输出结果。 其中句子长度一般不必过滤,中文句子不会很长,遇标点符号即断开,所以n不会很大,o(n)完全可以承受。 类结构: 1 public class ChineseSimplificationFilter extends TokenFilter // 繁体转简体的filter 2 public class ChineseBreakDownAnalyzer extends Analyzer // 将中文打碎分析器,主要用来索引搜索关键词,实现相关搜索的功能 3 public class ChineseCCAnalyzer extends Analyzer // 上面提到的中文分词分析器 4 public class ChineseCCTokenizer extends Tokenizer implements ChineseTokenizerConstants // 对StandardTokenizer的Hack 5 public interface ChineseTokenizerConstants extends StandardTokenizerConstants // 此接口暂时为空,留待以后扩充 6 public class ChineseTokenizerTokenManager implements StandardTokenizerConstants // 对StandardTokenizerTokenManager的Hack 7 public class ChineseTokenMgrError extends Error // 定义一些错误代码 时间仓促没写那么多,初次在此发技术贴,没写很长刚才被管理员封杀了,惭愧,赶紧补一些。 我这个搜索引擎支持拼音搜索,纠正错别字,繁简混杂等功能。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-02-06
繁体转简体,繁体转简体很具有实用。
“中文打碎分析器”啥意思?对每个字索引? 把代码show出来看看,兴趣中。 |
|
返回顶楼 | |
发表时间:2007-02-06
Qieqie 写道 繁体转简体,繁体转简体很具有实用。
“中文打碎分析器”啥意思?对每个字索引? 把代码show出来看看,兴趣中。 哦,这个我解释一下,一般最普通的是把中文一个字一个字索引,或者是两个字两个字索引,我这个ChineseBreakDownAnalyzer是先把文字每个字拆成一个token,然后从繁体转到简体,主要是为了索引搜索关键词,可以看我那个网站下面的相关搜索,输入“门徒”,相关搜索是:血门徒,门(空格)徒,刘德华 门徒,…… 如果采用一般的分词,如果“门徒”是一个词组,是无法得到这样的结果的。其代码相当简单: public class ChineseBreakDownAnalyzer extends Analyzer { public ChineseBreakDownAnalyzer() { } @Override public TokenStream tokenStream(String fieldName, Reader reader) { TokenStream result = new StandardTokenizer(reader); result = new ChineseSimplificationFilter(result); result = new StandardFilter(result); result = new LowerCaseFilter(result); return result; } } 这样做的好处是不必拘泥于词组的约束,相关搜索只要有个字沾边就可以,至于结果顺序,lucene的相关度+setBoost(搜索量通过一定算法换算成浮点数)的效果足够好了。 public class ChineseSimplificationFilter extends TokenFilter { public ChineseSimplificationFilter(TokenStream input) { super(input); } @Override public Token next() throws IOException { Token t = input.next(); if (t == null) return null; SimplificationManager manager = SimplificationManager.getInstance(); t.termText = manager.simplify(t.termText); return t; } } SimplificationManager也很简单,是一个有两千多条繁简数据的HashMap<String, String>,HashMap在并发只读的时候没有问题。将输入的String逐字转换后输出,忽略不认识的字符。 |
|
返回顶楼 | |
发表时间:2007-08-04
繁简转换不是什么难事。
有这两个文件就可以搞定big5-gb.table,gb-big5.table |
|
返回顶楼 | |
发表时间:2007-08-04
楼主的“中文打碎分析器”应该属于词语联想,基于拼音搜索转换过来的吧,呵呵
功fu -> 功夫 工夫 公府 贡赋 功服 对于混合搜索楼主还要花一点功夫,30分钟应该能写出来 |
|
返回顶楼 | |
发表时间:2007-08-10
youkao 写道 楼主的“中文打碎分析器”应该属于词语联想,基于拼音搜索转换过来的吧,呵呵
呵呵,多谢,这个没有做到那么细
功fu -> 功夫 工夫 公府 贡赋 功服 对于混合搜索楼主还要花一点功夫,30分钟应该能写出来 |
|
返回顶楼 | |