最大概率分词

 

这里介绍一种分词的方法--最大概率分词,也叫1-gram分词,因为它不考虑上下文关系,只考虑当前词的概率。

我们需要有一个词典,里面记录每个词的频次,比如:

基于这个词典,我们可以将一句话用一个有向无环图(DAG)的表示出来,比如

这个图里面,每个节点是一个字,边为两点构成词的概率。分词的问题,就是找出这个DAG里面概率和最大的一条从开始到结束覆盖所有字的路径。比如,辣-》菜,五-》肉,盖-》饭是一条路径,辣-》辣,白-》菜,五-》花,肉-》肉,盖-》饭也是一条路径,如何找到最大的那条呢?

设\(\alpha_i\)为DAG中以i节点开始之后的部分的最优路径的概率和,j为i的邻接点,那么容易的出\(\alpha_i = \sum_jp(<i,j>)\alpha_j\),p<i,j>是词的概率。

这是一个动态规划问题,从最后一个字开始,基于以前的计算结果,逐步向前推移,直到第一个点,然后再从前往后得到最优路径。

python代码如下:

def build_DAG(sentence):
   DAG = {} #dict,key是每个word的index,value是以这个字开始能够构成的词list
   N = len(sentence)
   for k in xrange(N):
       tmp = []
       i = k
       piece = sentence[k]
       while i < N and piece in dict.FREQ:
           if dict.FREQ[piece]:
               tmp.append(i)
           i += 1
           piece = sentence[k:i + 1]
       if not tmp:
           tmp.append(k)
       DAG[k] = tmp
   return DAG
def calc_route(sentence, DAG, route):
        N = len(sentence)
        route[N] = (0, 0)
        logtotal = log(total_freq)
        for idx in xrange(N - 1, -1, -1):
            route[idx] = max((log(dict.FREQ.get(sentence[idx:x + 1]) or 1) -
                              logtotal + route[x + 1][0], x) for x in DAG[idx])
def __cut_DAG(self, sentence):
    DAG = build_DAG(sentence)
    route = {}
    calc_route(DAG, route)
    x = 0
    N = len(sentence)
    segs = []
    while x < N:
        y = route[x][1] + 1
        word = sentence[x,y]
        segs.append(word)
        x = y
时间: 2024-11-02 01:25:26

最大概率分词的相关文章

最大概率法分词及性能測试

最大概率分词是一种最主要的统计方法分词.一个待切割的字符串有多种分词结果,最大概率分词的原则是将当中概率最大的那个作为该字符串的分词结果. 第一部分 理论基础 如对一个字符串: S:有意见分歧 分词结果1: w1:有/ 意见/ 分歧/ 分词结果2: w2:有意/ 见/ 分歧/ 最大概率分词就是要求得 Max(P(w1|s),P(w2|s)) . 依据贝叶斯公式: P(w|s)=P(s|w)P(w)/P(s)                                             

最大概率法分词及性能测试

最大概率分词是一种最基本的统计方法分词.一个待分割的字符串有多种分词结果,最大概率分词的原则是将其中概率最大的那个作为该字符串的分词结果. 第一部分 理论基础 如对一个字符串: S:有意见分歧 分词结果1: w1:有/ 意见/ 分歧/ 分词结果2: w2:有意/ 见/ 分歧/ 最大概率分词就是要求得 Max(P(w1|s),P(w2|s)) . 根据贝叶斯公式: P(w|s)=P(s|w)P(w)/P(s)                                             

cppjieba分词学习笔记

cppjieba分词包主要提供中文分词.关键词提取.词性标注三种功能 一.分词 cppjieba分词用的方法是最大概率分词(MP)和隐马尔科夫模型(HMM),以及将MP和HMM结合成的MixSegment分词器.除此之外,cppjieba支持三种模式的分词: 精确模式,试图将句子最精确地切开,适合文本分析: 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学 搜索引擎模式,在精确模式的基础上,对长词再次切分,提

2-gram分词

和前一篇介绍的最大概率分词比较,2-gram分词也是一种最大概率分词,只不过在计算一个词概率的时候,它不光考虑自己,还会考虑它的前驱. 我们需要两个字典.第一个字典记录词\(w_i\)出现的频次,第二个字典记录词对儿<\(w_j,w_i\)>共同出现的频次.有这两份字典,我们就可以计算出条件概率\(p(w_i|w_j)=p(w_i,w_j)/p(w_j)\). 为了直观表示计算过程,我们还是构建出一个图出来.跟上一篇不同,这里换个方向,我们考虑结束字,而不是开始字,因为是后面的词依赖前面的词.

最大匹配分词算法

全文检索有两个重要的过程: 1分词   2倒排索引 我们先看分词算法 目前对中文分词有两个方向,其中一个是利用概率的思想对文章分词. 也就是如果两个字,一起出现的频率很高的话,我们可以假设这两个字是一个词.这里可以用一个公式衡量:M(A,B)=P(AB)/P(A)P(B),其中 A表示一个字,B表示一个字,P(AB)表示AB相邻出现的概率,P(A)表示A在这篇文章中的频度,P(B)表示B在这篇文章中的频度.用概率分词的好 处是不需要借助词典的帮助,坏处是算法比较麻烦,效率不高,也存在一定的出错率

jiba中文分词原理

中文分词就是将一个汉字序列分成一个一个单独的词. 现有的分词算法有三大类: 基于字符串匹配的分词:机械分词方法,它是按照一定的策略将待分析的字符串与一个充分大的机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功. 基于理解的分词方法:通过让计算机模拟人对句子的理解,达到识别词的效果,特点就是在分词的同时进行句法,语义的分析,利用句法信息和语义信息来处理歧义现象.通常包括三个部分:分词子系统,句法语义子系统,总控部分. 基于统计的分词方法:给出大量的已经分词的文本,利用统计机器学习模型

浅谈分词算法(2)基于词典的分词方法

[TOC] 前言 在浅谈分词算法(1)分词中的基本问题中我们探讨了分词中的基本问题,也提到了基于词典的分词方法.基于词典的分词方法是一种比较传统的方式,这类分词方法有很多,如:正向最大匹配(forward maximum matching method, FMM).逆向最大匹配(backward maximum matching method,BMM).双向扫描法.逐词遍历法.N-最短路径方法以及基于词的n-gram语法模型的分词方法等等.对于这类方法,词典的整理选择在其中占到了很重要的作用,本

中文分词选取-依概率选取

上一篇文章中介绍了一种中文分词的选取算法,本篇文章将介绍另外一种中文分词选取算法,依概率选取算法. 中文分词分词完成之后,还是上篇文章中的原则,分词结果不唯一,然后我们算法的目的是从几种分词好的算法之后选取一个作为分词的最终结果.算法会统计每个词在所有文档中的概率,该算法的中心思想是计算一个字符串中所有分词的概率之积,选取概率最大的作为分词的最终结果. 算法步骤:第一步,通过上几篇文章的的算法对字符串进行分词:第二步,扫描每一次分词结果:第三步,计算每一次分词结果的所有词的概率之积:第四步,选出

最大概率法分词中词频惩罚因子的作用探究

在最大概率法分词的程序中,由于每个词出现的次数分布非常不均匀,而且我们要计算每个词出现的概率,对于出现次数比较少的词概率就很小,求句子中词的概率之积的时候,需要将好多非常小的数作乘法,可能会将超出计算机所能表示的数的最小范围.为了便于计算,常常要将每个词的概率求对数后在进行计算,但是由于对概率求对数后变为负值,因此要求对应的相反数.所以一个词出现的次数越多,最后求得对应的值越小,我们将这个值称为这个单词的代价.单词出现的次数越多,该单词的代价越低:否则代价越高. 第一部分 公式推导 假设:单词S