基于词表的三种分词算法

一、正向最大匹配算法

import sys 
sys.path.append('/home/aistudio/external-libraries')
def FMM(dict, sentence):

    fmmresult = []
    # 词典中最长词长度
    max_len = max([len(item) for item in dict])
    start = 0
    # FMM为正向,start从初始位置开始,指向结尾即为结束
    while start != len(sentence):
        # index的初始值为start的索引+词典中元素的最大长度或句子末尾
        index = start + max_len
        if index > len(sentence):
            index = len(sentence)
        for i in range(max_len):
            # 当分词在字典中时或分到最后一个字时,将其加入到结果列表中
            if (sentence[start:index] in dict) or (len(sentence[start:index]) == 1):
                # print(sentence[start:index], end='/')
                fmmresult.append(sentence[start:index])
                # 分出一个词,start设置到index处
                start = index
                break
            # 正向时index每次向句尾挪一位
            index += -1
    return fmmresult

二、逆向最大匹配算法

def RMM(dict, sentence):

    rmmresult = []
    # 词典中最长词长度
    max_len = max([len(item) for item in dict])
    start = len(sentence)
    # RMM为逆向,start从末尾位置开始,指向开头位置即为结束
    while start != 0:
        # 逆向时index的初始值为start的索引-词典中元素的最大长度或句子开头
        index = start - max_len
        if index < 0:
            index = 0
        for i in range(max_len):
            # 当分词在字典中时或分到最后一个字时,将其加入到结果列表中
            if (sentence[index:start] in dict) or (len(sentence[index:start]) == 1):
                # print(sentence[index:start], end='/')
                rmmresult.insert(0, sentence[index:start])
                # 分出一个词,start设置到index处
                start = index
                break
            # 逆向时index每次向句头挪一位
            index += 1
    return rmmresult

三、双向匹配算法

def BM(dict, sentence):
    # res1 与 res2 为FMM与RMM结果
    res1 = FMM(dict, sentence)
    res2 = RMM(dict, sentence)
    if len(res1) == len(res2):
        # FMM与RMM的结果相同时,取任意一个
        if res1 == res2:
            return res1
        else:
            # res1_sn 和 res2_sn 为两个分词结果的单字数量,返回单字较少的
            res1_sn = len([i for i in res1 if len(i) == 1])
            res2_sn = len([i for i in res2 if len(i) == 1])
            return res1 if res1_sn < res2_sn else res2
    else:
        # 分词数不同则取分出词较少的
        return res1 if len(res1) < len(res2) else res2

示例:

#请在此处添加代码
#代码包括定义词典,定义待分词变量,调用并且输出三种分词函数。
dict = ['我', '在', '清华大学', '读书', '专业', '是', '软件', '工程', '软件工程']
sentence = '我在清华大学读书,专业是软件工程'

print("the results of FMM :\n", FMM(dict, sentence), end="\n")

print("the results of RMM :\n", RMM(dict, sentence), end="\n")

print("the results of BM :\n", BM(dict, sentence))

详细请看:xhttps://aistudio.baidu.com/projectdetail/7514778

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

轻晃痛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值