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 相关文章推荐
最大K个数问题的Python版解法总结
Jun 16 Python
使用Eclipse如何开发python脚本
Apr 11 Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 Python
python 将md5转为16字节的方法
May 29 Python
在Python中表示一个对象的方法
Jun 25 Python
PYTHON发送邮件YAGMAIL的简单实现解析
Oct 28 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
使用python 对验证码图片进行降噪处理
Dec 18 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
Mar 09 Python
Python基于httpx模块实现发送请求
Jul 07 Python
基于Python的身份证验证识别和数据处理详解
Nov 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
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
PHP 字符串分割和比较
2009/10/06 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
javascript算法学习(直接插入排序)
2011/04/12 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
深入理解js promise chain
2016/05/05 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
pandas将numpy数组写入到csv的实例
2018/07/04 Python
python全栈知识点总结
2019/07/01 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
介绍一下Java中的static关键字
2012/05/12 面试题
法学专业毕业生自荐信范文
2013/12/18 职场文书
应届毕业生个人求职自荐信
2014/01/06 职场文书
出国导师推荐信
2014/01/16 职场文书
小学生操行评语
2014/04/22 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python