趁着清明放假的大好岁月,花了点洗衣服的时间看了点lucene的源码,主要想看看分词那部分。
luncene分词的大概过程是这样的:
1 截断单词
2 过滤干扰信息
3 写入结果

截断,对于英文来书很简单就是用空格和标点符号以及一些特殊用词,这些在系统里已经定义好,当然你也可以适时地改变一下。
过滤,在它的标准算法中会对如下的符号进行过滤:'s 'S  . 这样几种。
写入,这个顾名思义啦

下面谈谈我对中文分词的猜想,之前也用过je分词这样所谓成功作品,但无论性能还是效果都无法达到我的要求,而且它又不公开源码,令人非常失望,所以目前我使用的依然是luncene中的标准分词,也就是单字分词,但单字分词的问题也很明显消耗了极大的存储空间,目前在非压缩状态下,索引是原始文档的1.2~1.3倍之多,这是随着数据积累挺令我担心的问题。所以不得不思考中文的算法过程,我设想的算法应该是这样:
1 截断,利用分词库和常用介词表进行,其中分词库采用首字单词长度逆向排序法匹配,过程:
首先将词库按首字放入hash,然后将同首字的按照长度逆序排列
然后分词的时候先按单字分开,然后依据分词表,匹配 n次 (n是首字列表里的元素个数)并且允许重复匹配,比如中国 中国人 需要重复匹配。
之后同样去除标点符号等干扰因素。
那么我们现在来是想一下它的算法复杂度:
应该是: len(str)×n(str【i】)
试验更高级的算法在多词匹配时利用递归,将后一个字的算法也同时写入,或将减少其算法复杂度。
下周刊有时间的时候尝试写一个分词来看看,是否合理。

Tags - 分词 , 算法

你可能感兴趣的:(算法,Lucene)