mmseg分词算法思路分析(中文新闻分词实测结论总结)

首先先介绍一下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<Candidate>();
        int rest_len;
        int n=text.length();
        String word;
        for(int offset=0;offset<n;offset++){
            rest_len=n-offset;
            //长度应小于剩余长度 
            for(int len=1;len<=max_len&&len<=rest_len;len++){                
                //截取部分词串
                word=text.substring(offset,offset+len);    
                //如果词典含有该词,则该词为一个候选词
                if(dict.containsKey(word)){
                    Candidate candidate=new Candidate();
                    candidate.offset=offset;
                    candidate.length=len;
                    candidate.cost=dict.get(word);
                    candidateWord.add(candidate);
                }
            }
        }
    }

 

(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均值等算法效率均不足以支撑系统的运行,耗时太长,对新闻热点词分析来说,可忽略此模块;

 

 

最后,来一句鸡汤,与诸君共勉:

像傻逼一样的坚持,终将牛逼!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值