python实现中文分词FMM算法实例


Posted in Python onJuly 10, 2015

本文实例讲述了python实现中文分词FMM算法。分享给大家供大家参考。具体分析如下:

FMM算法的最简单思想是使用贪心算法向前找n个,如果这n个组成的词在词典中出现,就ok,如果没有出现,那么找n-1个...然后继续下去。假如n个词在词典中出现,那么从n+1位置继续找下去,直到句子结束。

import re  
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)  
    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")

运行结果如下:

asdfa
好的




vasdiw

真的
daf
dasfiw
asid


希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python的Django框架安装全攻略
Jul 15 Python
利用python爬取斗鱼app中照片方法实例
Dec 03 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 Python
Django自定义用户登录认证示例代码
Jun 30 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
Oct 24 Python
Pygame的程序开始示例代码
May 07 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
May 26 Python
Python包资源下载路径报404解决方案
Nov 05 Python
LyScript实现绕过反调试保护的示例详解
Aug 14 Python
Python实现的最近最少使用算法
Jul 10 #Python
Python导入oracle数据的方法
Jul 10 #Python
Python验证码识别的方法
Jul 10 #Python
Python实现大文件排序的方法
Jul 10 #Python
Python实现telnet服务器的方法
Jul 10 #Python
Python读写unicode文件的方法
Jul 10 #Python
Python实现提取谷歌音乐搜索结果的方法
Jul 10 #Python
You might like
PHP网页游戏学习之Xnova(ogame)源码解读(四)
2014/06/23 PHP
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
如何在 Vue.js 中使用第三方js库
2017/04/25 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
python time模块用法实例详解
2014/09/11 Python
python学习基础之循环import及import过程
2018/04/22 Python
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
python中scikit-learn机器代码实例
2018/08/05 Python
详解django中使用定时任务的方法
2018/09/27 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
百度软件工程师职位
2013/02/14 面试题
银行办公室岗位职责
2014/03/10 职场文书
家长高考寄语
2015/02/27 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
Python基础之Socket通信原理
2021/04/22 Python
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python
Go语言 详解net的tcp服务
2022/04/14 Golang
解决Oracle数据库用户密码过期
2022/05/11 Oracle