NLP基础:分词算法实战

本文详细介绍了分词算法,包括前向最大匹配、后向最大匹配、双向最大匹配,以及利用语言模型(Viterbi和Dijkstra算法优化)进行分词。通过实例展示了各方法的实现结果,探讨了不同算法的时间复杂度和效果,指出可以使用更复杂的模型如HMM提升分词准确性。
摘要由CSDN通过智能技术生成

1. 前向最大匹配法

1.1 加载词库

#加载词库,为减少索引的时间,词库的保存形式是字典,key为词, value是id
with open("././data/word2id.pkl", 'rb') as f:
    dic_words = pickle.load(f)
    print("Load vocabulary success!!")

1.2 前向最大匹配实现

def forward_max_matching(input_str, max_length):
    """
    利用递归前向最大匹配分词
    :param input_str :输入的字符串
    :return :以“/”为分割符返回分词结果

    """
    max_len = min(max_length, len(input_str))
    # result = []
    # if len(input_str) >= max_len:
    if len(input_str) < 1:
        return " "
    else:
        for end_index in range(max_len, 0, -1):
            if input_str[:end_index] in dic_words:
                return input_str[:end_index] + "/" + forward_max_matching(input_str[end_index:], max_length)
# 测试
print("forward_max_matching:{}".format(forward_max_matching("北京的天气真好啊", 5)[:-2]))
print("forward_max_matching:{}".format(forward_max_matching("今天的课程内容很有意思", 5)[:-2]))
print("forward_max_matching:{}".format(forward_max_matching("经常有意见分歧", 5)[:-2]))

1.3 前向最大匹配实现结果

Load vocabulary success!!
forward_max_matching:北京/的/天气/真好/啊
forward_max_matching:今天/的/课程/内容/很/有意思
forward_max_matching:经常/有意/见/分歧
Process finished with exit code 0

2. 后向最大匹配法

2.1 加载词库与实现

import pickle

#加载词库,为减少索引的时间,词库的保存形式是字典,key为词, value是id
with open("././data/word2id.pkl", 'rb') as f:
    dic_words = pickle.load(f)
    print("Load vocabulary success!!")

def backward_max_matching(input_str, max_length):

    """
    利用递归实现后向最大匹配分词
    :param input_str :输入的字符串
    :return :以"/"为分隔符返回分词列表

    """
    max_len = min(max_length, len(input_str))
    if len(input_str) < 1:
        return " "
    else:
        for end_index in range(-1 * max_len, 0):
            word = input_str[end_index:]
            if word in dic_words:
                # result = result + [word] + backward_max_matching(input_str[:end_index])

                return backward_max_matching(input_str[:end_index], max_length) + "/" + word
print("backward_max_matching:{}".format(backward_max_matching("北京的天气真好啊", 5)[2:]))
print("backward_max_matching:{}".format(backward_max_matching("今天的课程内容很有意思", 5)[2:]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值