结巴分词源码详解

26 篇文章 0 订阅

1、调包方式

1.1 代码

split_input = "共和国成立仪式于2020年在人民大会堂召开"
split_result = jieba.cut(split_input, HMM=False)
print(list(split_result))
split_result = jieba.cut(split_input, HMM=True)
print(list(split_result))

1.2 结果

2、手工计算

2.1 读取字典

import marshal
with open("C:\\Users\\AppData\\Local\\Temp\\jieba.cache", 'rb') as cf:
    FREQ,total = marshal.load(cf)
list(FREQ.keys())[6000:6020],total

2.2 正则表达式拆分为list

### 先用正则表达式将句子拆分为list
import re
re_han=re.compile('([一-鿕a-zA-Z0-9+#&\\._%\\-]+)')
re_skip=re.compile('([一-鿕a-zA-Z0-9+#&\\._%\\-]+)')
blocks = re_han.split(split_input)
blocks
### 对于list中每一个元素,分别进行拆分,如果是特殊符号,则直接略过,所以拆分的句子为
blk = "共和国成立仪式于2020年在人民大会堂召开"

2.3 建立DAG图

### 对句子建立DAG图
def get_DAG(FREQ, sentence):
    DAG = {}
    N = len(sentence)
    for k in range(N):
        tmplist = []
        i = k
        frag = sentence[k]
        while i < N and frag in FREQ:
            if FREQ[frag]:
                tmplist.append(i)
            i += 1
            frag = sentence[k:i + 1]
        if not tmplist:
            tmplist.append(k)
        DAG[k] = tmplist
    return DAG
DAG = get_DAG(FREQ,blk)
DAG
### 所以DAG为
[blk[k:idx+1] for k,v in DAG.items()  for idx in v]

2.4 建立route概率图

### 开始计算route,也就是概率图矩阵
route={}
import numpy as np
log = np.log
def calc(sentence, DAG, route):
    N = len(sentence)
    route[N] = (0, 0)
    logtotal = log(total)
    for idx in range(N - 1, -1, -1):
        route[idx] = max((log(FREQ.get(sentence[idx:x + 1]) or 1) -
                          logtotal + route[x + 1][0], x) for x in DAG[idx])
calc(blk,DAG,route)
route

2.5 生成切分结果

### 生成切分结果
def generate_result(route,sentence):
    x = 0
    N = len(sentence)
    buf = ''
    re_eng = re.compile("[a-zA-Z0-9]")
    while x < N:
        y = route[x][1] + 1
        l_word = sentence[x:y]
        if re_eng.match(l_word) and len(l_word) == 1:
            buf += l_word
            x = y
        else:
            if buf:
                yield buf
                buf = ''
            yield l_word
            x = y
    if buf:
        yield buf
        buf = ''
results = generate_result(route,blk)
list(results)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITIRONMAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值