首先先介绍一下mmseg分词算法,再详细分析新闻分词所用分词方式及其逻辑。
(一)mmseg分词算法mmseg是一个非常好用的分词器,开箱即用。那么为什么还要了解其算法呢?
1.没有任何一样技术可以直接适用于任何场景,了解其算法才能知道什么场景适合用这个算法。
2.了解算法才能知道最终产品的性能受到该分词环节的影响有多大,以便优化。
简介:
mmseg算法是基于词典匹配的算法;
拓展:另一分支是基于统计模型的分词方式,可Google查阅,暂不记录。
拓展:还有一种基于树的词库构建方式,非常便于分词和精确全文检索(当然查全率和查准率不可同时最优)。
算法流程:
文本通过分词系统,首先通过匹配算法和词典进行匹配,再根据消歧规则将最终的分词结果输出;
分词过程用到了三个词典:chars.dic,units.dic,words.dic
词典:chars.dic(汉字字典)
units.dic(中文单位词语)
words.dic(自定义词典)----该词典可用于自己添加新的词汇,如刚出现的一些新名词;
MMSEG分为“匹配算法(Matching algorithm)”和“消除歧义的规则(Ambiguity resolution rules)”这两部分。
“匹配算法”是说如何根据词典里保存的词语,对要切分的语句进行匹配(正向?逆向?粒度?);
“消除歧义的规则”是说当一句话可以这样分,也可以那样分的时候,用什么规则来判定使用哪种分法;
MMSEG的“匹配方法”有两种: 1.Simple方法,即简单的正向匹配,根据开头的字,列出所有可能的结果。比如“研究生命起源”,可以得到 研究 研究生 研究生命 研究生命起源 这四个匹配结果(假设这四个词都包含在词典里)。 2.Complex方法,匹配出所有的“三个词的词组”,即从某一既定的字为起始位置,得到所有可能的“以三个词为一组”的所有组合。(若一句话切分不出三个词,比如只能切成两部分,也可以存在)比如“研究生命起源”,可以得到
研_究_生
研_究_生命
研究生_命_起源
研究_生命_起源
/**
* 得到所有候选词
* @param text 文本
*/
private void getCandidateWord(String text){
candidateWord=new ArrayList();
int rest_len;
int n=text.length();
String word;
for(int offset=0;offset
关注
打赏
- ES recovery、主副分片复制会有一段时间block写入?
- 【离线】esrally实践总结
- ES写入毛刺问题?从原理到调优
- Mac上打包到Linux执行(go)、import调用本地代码(go)
- 笔记-Mac清理dns缓存
- Elasticsearch CCR源码分析(补充)
- Elasticsearch的long类型精准匹配异常?
- Elasticsearch索引生命周期管理-实测demo
- k8s-client(java)从6.0.1升级到11.0.0出现patch问题may not be specified for non-apply patch/cannot unmarshal...
- Elasticsearch出现Connection reset by peer分析