递归实现前向匹配分词

来源:互联网 发布:新理念外语网络教学app 编辑:程序博客网 时间:2024/06/07 02:25
# -*- coding: utf-8 -*-'''功能:递归实现前向匹配分词说明:zhuanma这个包借鉴自jieba分词源代码用于将任意格式编码的字符串转换为unicode编码,统一字典和待分词语句的编码后,便于句子切分和分词.Author: <jianzhang.zhang@foxmail.com>Date  : 2016-04-16'''import refrom zhuanma import strdecode# 递归前向匹配分词def seg(chunk,maxLength,dicList,result):    # 句子块长度    cLength = len(chunk)    # 句子块小于最大词长    if cLength <= maxLength:        # 判断整个句子块是否在词典中        if chunk in dicList:            result.append(chunk)        # 前向匹配分词        else:            for i in range(1,cLength):                if chunk[:-i] in dicList:                    result.append(chunk[:-i])                    seg(chunk[-i:],maxLength,dicList,result)                        # 句子块长度大于最大词长    elif cLength > maxLength:        # 按照最大词长截取子串进行分词        subChunk = chunk[:maxLength]        # 最大词长截取的子串在字典中        if subChunk in dicList:            result.append(subChunk)            seg(chunk[maxLength:],maxLength,dicList,result)        # 最大词长截取的子串不在字典中        else:            # 前向匹配分词            for i in range(1,maxLength):                if subChunk[:-i] in dicList:                    result.append(subChunk[:-i])                    seg(subChunk[-i:]+chunk[maxLength:],maxLength,dicList,result)    return resultif __name__ == "__main__":        # 导入分词字典到列表    with open('dic.txt') as f:        dicList = strdecode(f.read()).strip().split('\n')    # 确定字典中最大词长    maxLength = 0    for word in dicList:        if len(word) > maxLength:            maxLength = len(word)    # 待分词语句            sentence = strdecode("中华人民共和国成立了,中华民族迎来了新的时代")    # 用标点将句子分块    tokenList = re.findall(u"[\u4e00-\u9fa5]+",sentence,re.U)    # 用于保存分词结果的列表    result = []    # 使用前向匹配算法分词    for chunk in tokenList:        result.extend(seg(chunk,maxLength,dicList,[]))    print '\n'.join(result)    '''    >>> ================================ RESTART ================================    >>>     中华人民共和国    成立    了    中华    民族    迎来    了    新    的    时代    >>>     '''

1 0
原创粉丝点击