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 正则式使用心得
May 07 Python
Python中实现的RC4算法
Feb 14 Python
Python的Flask框架中@app.route的用法教程
Mar 31 Python
python中list常用操作实例详解
Jun 03 Python
python登录豆瓣并发帖的方法
Jul 08 Python
Python中遇到的小问题及解决方法汇总
Jan 11 Python
Python语言描述随机梯度下降法
Jan 04 Python
python3.5 tkinter实现页面跳转
Jan 30 Python
python实现的Iou与Giou代码
Jan 18 Python
详解pandas获取Dataframe元素值的几种方法
Jun 14 Python
Django框架请求生命周期实现原理
Nov 13 Python
python实现监听键盘
Apr 26 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中new static() 和 new self() 的区别介绍
2015/01/09 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
Vue组件化开发思考
2018/02/02 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
2019/06/10 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
Python3实现连接SQLite数据库的方法
2014/08/23 Python
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
Python爬虫包BeautifulSoup实例(三)
2018/06/17 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
windeln官方海外旗舰店:德淘超人气母婴超市
2017/12/15 全球购物
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
MySQL面试题
2014/01/12 面试题
校园网站的创业计划书范文
2013/12/30 职场文书
通用自荐信范文
2014/03/14 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
幼儿教师辞职信
2015/02/27 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS