论坛首页 Java企业应用论坛

Lucene中文分词之网络隐士八卦版

浏览 6973 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-06  
俺自己搞了个Lucene中文分词,看到版上qieqie师傅发表的他自己搞的Lucene中文分词,隐士很感兴趣,想进来说两句,注册一把,晕,三天后才可以说话,刚刚可以说话。俺来介绍一下俺的中文分词实现。参考站点:http://so.mdbchina.com
俺的分词做了这么几件事:装载各类词库 —— 中文繁体转简体 —— 初步分词 —— 在初步分词基础上进行运算量可控的二次分词(运算量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 // 定义一些错误代码
时间仓促没写那么多,初次在此发技术贴,没写很长刚才被管理员封杀了,惭愧,赶紧补一些。
我这个搜索引擎支持拼音搜索,纠正错别字,繁简混杂等功能。
   发表时间:2007-02-06  
繁体转简体,繁体转简体很具有实用。
“中文打碎分析器”啥意思?对每个字索引?


把代码show出来看看,兴趣中。
0 请登录后投票
   发表时间: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逐字转换后输出,忽略不认识的字符。
0 请登录后投票
   发表时间:2007-08-04  
繁简转换不是什么难事。

有这两个文件就可以搞定big5-gb.table,gb-big5.table
0 请登录后投票
   发表时间:2007-08-04  
楼主的“中文打碎分析器”应该属于词语联想,基于拼音搜索转换过来的吧,呵呵

功fu -> 功夫 工夫  公府  贡赋  功服

对于混合搜索楼主还要花一点功夫,30分钟应该能写出来


0 请登录后投票
   发表时间:2007-08-10  
youkao 写道
楼主的“中文打碎分析器”应该属于词语联想,基于拼音搜索转换过来的吧,呵呵

功fu -> 功夫 工夫  公府  贡赋  功服

对于混合搜索楼主还要花一点功夫,30分钟应该能写出来


呵呵,多谢,这个没有做到那么细
0 请登录后投票
论坛首页 Java企业应用版

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