基于词典的中文Uni-gram分词算法代码(正/逆最大匹配,全切分,维特比)

本文介绍了四种基于词典的Uni-gram中文分词算法:正向最大匹配、逆向最大匹配、全切分和维特比算法。提供了Python代码实现,并给出了示例。全切分算法实现较为繁琐,作者对其进行了详细编写。
摘要由CSDN通过智能技术生成

基于词典的中文Uni-gram分词算法代码(正/逆最大匹配,全切分,维特比)

简介

包含四种基于词典的Uni-gram中文分词算法代码,分别为正向最大匹配逆向最大匹配全切分维特比。前三个代码自己写的,第四个在维特比算法 实现中文分词 python实现上进行了改进。其中“全切分算法”好难写,且在网上没找到能拿来用的python代码,无奈自己写。因写的繁琐(找时间修改),所以不做解释,直接上代码和实例。(若有简洁易懂的代码可发我,谢大佬!)

正向最大匹配算法

  • 加载词典,形式为 “词”:概率

    >>>word_prob = {
         "北京":0.03,"的":0.08,"天":0.005,"气":0.005,"天    气":0.06,"真":0.04,"好":0.05,"真好":0.04,"啊":0.01,"真好啊":0.02, 
                    "今":0.01,"今天":0.07,"课程":0.06,"内容":0.06,"有":0.05,"很":0.03,"很有":0.04,"意思":0.06,"有意思":0.005,"课":0.01,
                    "程":0.005,"经常":0.08,"意见":0.08,"意":0.01,"见":0.005,"有意见":0.02,"分歧":0.04,"分":0.02, "歧":0.005}
    >>>print (sum(word_prob.values()))
    1.0000000000000002
    

    输出值为词典中所有词的概率和

  • 正向最大匹配,返回分词结果

    def Max_Matching_forward(input_str):
        max_len = max(len(w) for w in word_prob.keys())
        i = 0
        j = i+max_len
        segments = []
        while(1):
            if input_str[i:j] in word_prob.keys():
                if j >= len(input_str):
                    segments.append(input_str[i:j])
                    break
                segments.append(input_str[i:j])
                i = j
                j = i+max_len
            else:
                j -= 1
        return segments
    
  • 例子:

    >>>print(Max_Matching_forward("北京的天气真好啊"))
    ['北京', '的', '天气', '真好啊']
    >>>print(Max_Matching_forward("今天的课程内容很有意思"))
    ['今天', '的', '课程', '内容', '很有', '意思']
    >>>print(Max_Matching_forward("经常有意见分歧"))
    ['经常', '有意见', '分歧']
    

逆向最大匹配算法

  • 逆向最大匹配,返回分词结果(用正向中的词典)

    def Max_Matching_backward(input_str):
        max_len = max(len(w) for w in word_prob.keys())
        j = len(input_str)
        i = j-max_len
        segments = []
        while(1):
            if input_str[i:j] in word_prob.keys():
                if i == 0:
                    segments.append(input_str[i:j])
                    break
                segments.append(input_str[i:j])
                j = i
                i = max(i-max_len,0)
            else
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值