【无标题】

NLP之逆向最大匹配算法(BMM)

逆水舟行

于 2017-10-25 19:50:19 发布

4254
 收藏 2
分类专栏: nlp 文章标签: nlp BMM
版权

nlp
专栏收录该内容
1 篇文章0 订阅
订阅专栏
算法概述
BMM是一个基于词典的分词算法,与之相似的还有正向最大匹配算法(FMM)和双向匹配算法(BM)。
算法的大致过程为:
1、输入最大词长maxWordLength,字典wordDict,待分句子。
2、从待分句子的末尾开始向前截取长度为maxWordLength的子句,进行分词。
3、对一个子句的分词过程为,首先判断子句是否在字典中,若在,则保存这个子句,并从原句中删除这个子句,转到2。
若不在,则判断子句长度是否为1,若为1,则将单字保存,从原句中删除单字,转到2。若不为1,则将子句中最右边的一个字删除,形成新的子句,转到3。

代码实现
"""逆向最大匹配算法"""
def BMM(wordDict, maxWordLength, sentence):
    """
        @:param:
        wordDict:分词字典
        maxWordLength:最大词长
        sentence:待分句子,不要有标点符号
        @:return:
        result:分词结果,是句子分词的逆序
    """
    result = []
    while len(sentence) != 0:
        #最大词长大于待分句子时,重置最大词长
        if len(sentence) < maxWordLength:
            maxWordLength = len(sentence)
        #待分子句
        segWord = sentence[len(sentence)-maxWordLength:len(sentence)]
        while not(segWord in wordDict):
            #while 循环结束有两种情况,1是segWord存在于字典中,
            #2是,segWord为单字。
            #防止初始segWord长度为1,出错
            if len(segWord) > 1:
                segWord = segWord[1:]
            else:
                #result.append(segWord)
                #sentence = sentence[:len(sentence)-1]
                break

        #第二个循环结束,则将分词结果保存到result
        #并从原句中删除已分词
        result.append(segWord)
        sentence = sentence[:len(sentence)-len(segWord)]
    return result


运行结果
def main():
    maxWordLength, sougoDict = readDict("sougoDict.txt")

    sentence1 = "今天天气怎么样"
    result1 = BMM(sougoDict, maxWordLength, sentence1)
    printResult(result1)

    sentence2 = "最高买价和最低买价分别是多少"
    result2 = BMM(sougoDict, maxWordLength, sentence2)
    printResult(result2)

    sentence3 = "乱七八糟的字绗舆硎闿庹"
    result3 = BMM(sougoDict, maxWordLength, sentence3)
    printResult(result3)

运行结果


说明
这个代码只是一个基础版本,没有经过完整测试,仅供参考,如有什么问题,还望多多指教。

分词词典
分词词典是从参考文章《千万级巨型汉语词库分享》中截取出的一小部分,共有30万常用词,需说明的是字典不是最新的。
下载链接

参考文章
中文分词入门之最大匹配法
千万级巨型汉语词库分享
————————————————
版权声明:本文为CSDN博主「逆水舟行」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013782172/article/details/78345675

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值