首先先介绍一下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
(1)mmseg分词算法逻辑
每次从一个完整的句子里,按照从左向右的顺序,根据一定的规则识别出多种不同的3个词的组合,然后通过4条消歧规则的处理最终确定最佳的备选词组合,该备选词组合即为该句话最可能的符合实际场景的特征词,进而选择备选词组合中的最佳词,即第1个词,作为1次迭代的分词结果。剩余的词(去除已经在上一轮迭代中分出去的部分),将继续进行下一轮的分词运算。
规则如下:1.备选词组合的长度之和最大原则;2.备选词组合的平均词长最大原则;3.备选词组合的词长变化最小原则;4.备选词组合中,单字词的出现频率统计值最高原则,该统计值的计算方式为,取某句话中每个单字词词频的自然对数,然后将其值相加,取总和最大的词。
以下博客详细介绍了消歧规则及其实现:
https://blog.csdn.net/pwlazy/article/details/17562927
https://blog.csdn.net/Fighting_No1/article/details/50927171?locationNum=11
(2)mmseg分词器自定义词条方法
mmseg分词器使用三个词典,分别是chars.dic,units.dic,words.dic三个词典,基于词条可以将句子切分成一个个的短词,由于时间变化,新名词及专有词不断出现,现有的词典永远落后于实际的语法。所以需要提供一个自定义词典,用来存储自定义词条,作为新名词、专有词的判断。
可在词典的同一目录下构建一个名为“words-xx.dic”的词典,其中“xx”为自定义信息。再在分词器算法中加入该词典的读取和匹配即可,多读取匹配一个词典对分词器的性能影响不大,故本系统使用该方法实现自定义词条的功能。然后可在该词典中丰富大量词条,即可更为准确、合理的实现切词功能。
新闻热点词分析逻辑:
获取新闻数据---------分词---------过滤--------计算-----------评估
1. 手动获取或者Python爬取新闻数据
2. 通过mmseg分词器进行分词(因为这个分词器实现简单且高效,准度也十分高,对于新闻类的文本较为适合,因为新闻类的语言较为规范,通过中文词库即可进行较好的切词)
3. 由于切出的词有的比较没有代表性(不重要),因此需要将其过滤,减小不必要的计算。通过匹配停用词表即可实现,由于词语经过切分,通过空格进行split即可获取词汇,进行匹配过滤
4. 过滤后的词仍然存在着没有代表性的词,故通过词频统计的方式将高频词汇取出,再对其进行tfidf计算,再次对重要性评估;由于实验得知,词频高的词汇不一定重要,但是重要的一般词频都高,故先使用词频统计的方式进行筛选,再评估tfidf,将会大大提升效率
注:由于新闻文本的本来属性,标题的词汇最重要,其次是第一段,然后逐段递减,故需要在处理的时候加上权值,将会更加准确
注:偶新闻文本海量时,还需要通过聚类的方式进行区分,再计算热点词汇的重要性,分簇计算也将避免歧义,并且可在加入权值进行评估,并且对于词汇相同,词义不相同的重点词时,可以对词语补充(如加上定语,或者标注)
聚类,不可避免的是计算效率问题,实验得知,非监督学习的聚类方法,如kmeans,k均值等算法效率均不足以支撑系统的运行,耗时太长,对新闻热点词分析来说,可忽略此模块;
最后,来一句鸡汤,与诸君共勉:
像傻逼一样的坚持,终将牛逼!