jieba建立分词DAG词图与计算全局概率

该博客介绍了如何构建DAG(有向无环图)词云和计算全局概率Route的过程。首先,通过遍历语料库构建DAG,每个字的位置作为key,其后可能的词结尾位置作为value。接着,利用动态规划从后往前计算每个字的最大概率路径,以找到最可能的词序列。此方法在自然语言处理和信息检索中具有应用价值。

2021SC@SDUSC
1、字典即为DAG,key为字所在的位置,value为从字开始能在FREQ中的匹配到的词末尾位置所在的list。DAG词云的构建过程:定义DAG空字典,用来构建DAG有向无环图,然后开始遍历词。当传入的词,在FREQ中时,就给tmplist赋值,构建字开始可能去往的所有的路径列表。查找第一个字,后继续查找第一个加第二个字构成的词是否也在语料库中,直到查不到就退出循环。当传入值,在语料库中查询不到时,就赋值给FREQ。最终得到DAG词典

    def get_DAG(self, sentence):
        self.check_initialized()
        DAG = {}
        N = len(sentence)
        for k in xrange(N):
            tmplist = []
            i = k
            frag = sentence[k]
            while i < N and frag in self.FREQ:
                if self.FREQ[frag]:
                    tmplist.append(i)
                i += 1
                frag = sentence[k:i + 1]
            if not tmplist:
                tmplist.append(k)
            DAG[k] = tmplist
        return DAG

2、计算全局概率Route
函数calc(self, sentence, DAG, route)就是计算概率的过程。其中语句 xrange(N - 1, -1, -1)是从句子的末尾开始计算,
max函数返回的是一个元组,计算方法是log(freq/total)+后一个字得到的最大概率路径的概率。这里即为动态规划查找最大概率路径。注意的是动态规划的方向是从后往前。

    def calc(self, sentence, DAG, route):
        N = len(sentence)
        route[N] = (0, 0)
        logtotal = log(self.total)
        for idx in xrange(N - 1, -1, -1):
            route[idx] = max((log(self.FREQ.get(sentence[idx:x + 1]) or 1) -
                              logtotal + route[x + 1][0], x) for x in DAG[idx])
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值