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实现把xml或xsl转换为html格式
Apr 08 Python
Python正则表达式教程之三:贪婪/非贪婪特性
Mar 02 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
详解django三种文件下载方式
Apr 06 Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 Python
Python 实现域名解析为ip的方法
Feb 14 Python
Python Pandas 如何shuffle(打乱)数据
Jul 30 Python
python迭代器常见用法实例分析
Nov 22 Python
python实现快递价格查询系统
Mar 03 Python
pyCharm 实现关闭代码检查
Jun 09 Python
python之pygame模块实现飞机大战完整代码
Nov 29 Python
从np.random.normal()到正态分布的拟合操作
Jun 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
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
深入探讨JavaScript String对象
2015/03/09 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
2017/03/01 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
Python去除列表中重复元素的方法
2015/03/20 Python
Python中字符串的格式化方法小结
2016/05/03 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
Python多进程写入同一文件的方法
2019/01/14 Python
python生成特定分布数的实例
2019/12/05 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
Python3列表List入门知识附实例
2020/02/09 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
煤矿班组长岗位职责
2013/12/29 职场文书
物流毕业生个人的自我评价
2014/02/13 职场文书
网络宣传方案
2014/03/15 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
社区服务活动报告
2015/02/05 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
python用字节处理文件实例讲解
2021/04/13 Python
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android