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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
Django中URL视图函数的一些高级概念介绍
Jul 20 Python
python3 shelve模块的详解
Jul 08 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
django连接oracle时setting 配置方法
Aug 29 Python
Python3将数据保存为txt文件的方法
Sep 12 Python
python3使用GUI统计代码量
Sep 18 Python
python开发前景如何
Jun 11 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
python属于哪种语言
Aug 16 Python
Python 制作查询商品历史价格的小工具
Oct 20 Python
Python OpenCV超详细讲解基本功能
Apr 02 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
yii2安装详细流程
2018/05/23 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
深入理解Promise.all
2018/08/08 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
2018/02/18 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
python实现归并排序算法
2018/11/22 Python
wxPython实现带颜色的进度条
2019/11/19 Python
python爬虫---requests库的用法详解
2020/09/28 Python
美国最值得信赖的宠物药房:Allivet
2019/03/23 全球购物
舞蹈比赛获奖感言
2014/02/04 职场文书
超市创业计划书
2014/04/24 职场文书
作风年建设汇报材料
2014/08/14 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
党支部书记岗位职责
2015/02/15 职场文书
java解析XML详解
2021/07/09 Java/Android
Android studio 简单计算器的编写
2022/05/20 Java/Android