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编写脚本获取手机当前应用apk的信息
Jul 21 Python
关于Python 3中print函数的换行详解
Aug 08 Python
Python pandas常用函数详解
Feb 07 Python
python自定义函数实现一个数的三次方计算方法
Jan 20 Python
Python安装Flask环境及简单应用示例
May 03 Python
python3.4 将16进制转成字符串的实例
Jun 12 Python
在交互式环境中执行Python程序过程详解
Jul 12 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
Aug 09 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
Pytorch之parameters的使用
Dec 31 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中实现crontab代码分享
2015/03/26 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
JavaScript—window对象使用示例
2013/12/09 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
Python求算数平方根和约数的方法汇总
2016/03/09 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
机器学习之KNN算法原理及Python实现方法详解
2018/07/09 Python
Python pandas.DataFrame 找出有空值的行
2019/09/09 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
学校师德承诺书
2014/05/23 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
课外访万家心得体会
2014/09/03 职场文书
入党函调证明材料
2014/12/24 职场文书
2016春节家属慰问信
2015/03/25 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书
Go web入门Go pongo2模板引擎
2022/05/20 Golang