玩蛇网提供最新Python编程技术信息以及Python资源下载!
您现在的位置: 玩蛇网首页 > Python源码实例_Python程序源代码_网站项目下载 > 正文内容

Python FMM算法的中文分词器实现方法源码

Python入门佳作 经典教程的全新修订 10个项目引人入胜
玩蛇网推荐图文教程:python黑客多线程扫描器

这是一篇基于Python代码使用FMM算法达到中文分词效果实现方法的文章。中文语句分词因为编码的关系在Python语言中并不是很好处理,关于中文乱码与编码的问题解决方法,可以参考玩蛇网的Python中文乱码与编码的问题 超高清视频教程

本文的Python代码中用到了FMM算法,想要知道FMM算法是什么?大家可以自行百度一下,这里就是最简单思想是:使用贪心算法向前找n个,如果这n个组成的词在词典中出现,就通过;如果没有出现,那么找n-1个,一样一直继续下去;假如n个词在词典中出现,这时就要从n+1位置继续找下去,一直到句子的结束为止。

Python FMM算法的中文分词器实现方法源码如下:

python re正则表达式使用方法

python FMM算法中文分词

import re
#导入re模块(Regular Expression正则表达式)   

def PreProcess(sentence,edcode="utf-8"):   
    sentence = sentence.decode(edcode)   
    sentence=re.sub(u"[。,,!……!《》<>\"'::?\?、\|“”‘’;]"," ",sentence)   
    return sentence   
  
def FMM(sentence,diction,result = [],maxwordLength = 4,edcode="utf-8"):   
    i = 0   
    sentence = PreProcess(sentence,edcode)   
    length = len(sentence)   
    
    while i < length:  
        # find the ascii word   
        tempi=i   
        tok=sentence[i:i+1]   
        while re.search("[0-9A-Za-z\-\+#@_\.]{1}",tok)<>None:   
            i= i+1   
            tok=sentence[i:i+1]   
        if i-tempi>0:   
            result.append(sentence[tempi:i].lower().encode(edcode))  
        # find chinese word   
        left = len(sentence[i:])   
        if left == 1:   
            """go to 4 step over the FMM"""  
            """should we add the last one? Yes, if not blank"""  
            if sentence[i:] <> " ":   
                result.append(sentence[i:].encode(edcode))   
            return result   
        m = min(left,maxwordLength)   

#www.iplaypython.com
           
        for j in xrange(m,0,-1):   
            leftword = sentence[i:j+i].encode(edcode)  
         #   print leftword.decode(edcode)   
            if LookUp(leftword,diction):  
                # find the left word in dictionary  
                # it's the right one   
                i = j+i   
                result.append(leftword)   
                break  
            elif j == 1:   
                """only one word, add into result, if not blank"""  
                if leftword.decode(edcode) <> " ":   
                    result.append(leftword)   
                i = i+1   
            else:   
                continue  
    return result   

def LookUp(word,dictionary):   
    if dictionary.has_key(word):   
        return True   
    return False   

def ConvertGBKtoUTF(sentence):   
    return sentence.decode('gbk').encode('utf-8')  
dictions = {}   
dictions["ab"] = 1   
dictions["cd"] = 2   
dictions["abc"] = 1   
dictions["ss"] = 1   
dictions[ConvertGBKtoUTF("好的")] = 1   
dictions[ConvertGBKtoUTF("真的")] = 1   

sentence = "asdfa好的是这样吗vasdiw呀真的daf dasfiw asid是吗?"  

s = FMM(ConvertGBKtoUTF(sentence),dictions)   
for i in s:   
    print i.decode("utf-8")  
test = open("test.txt","r")   

for line in test:   
    s = FMM(CovertGBKtoUTF(line),dictions)   
    for i in s:   
        print i.decode("utf-8")  

Python中文分词的代码中多次出现了"utf-8"、'gbk'、decode、encode这类编python码转换的函数方法。对于大多数字初学python的朋友们来说,这是一个难点,并不容易理解。但一但理解透彻了又会感觉十分的简单。

这个基于Python FMM算法的中文分词器实现方法源码就这样了,能达要需要的效果实现,当然也可以再做更好的更改。希望和大家有更多的交流,有问题也可以在下面的评论区中一起学习交流。

玩蛇网文章,转载请注明出处和来源网址:http://www.iplaypython.com/code/c2717.html



微信公众号搜索"玩蛇网Python之家"加关注,每日最新的Python资讯、图文视频教程可以让你一手全掌握。强烈推荐关注!

微信扫描下图可直接关注

玩蛇网PythonQQ群,欢迎加入: ① 240764603 玩蛇网Python新手群
出炉日期:2015-12-21 10:13 玩蛇网 www.iplaypython.com

我要分享到:
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules