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迭代器的使用方法实例
Nov 21 Python
利用ctypes提高Python的执行速度
Sep 09 Python
Python如何快速实现分布式任务
Jul 06 Python
python编写分类决策树的代码
Dec 21 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
使用python3+xlrd解析Excel的实例
May 04 Python
Python线性拟合实现函数与用法示例
Dec 13 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
python脚本监控logstash进程并邮件告警实例
Apr 28 Python
Python定时任务APScheduler安装及使用解析
Aug 07 Python
pycharm永久激活超详细教程
Oct 29 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 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使用正则表达式获取图片url的方法
2015/01/16 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
PHP操作mysql数据库分表的方法
2016/06/09 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
javascript 封装Date日期类实例详解
2017/05/28 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
解决ant design vue 表格a-table二次封装,slots渲染的问题
2020/10/28 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
简单解决Python文件中文编码问题
2015/11/22 Python
python动态网页批量爬取
2016/02/14 Python
Python编程之变量赋值操作实例分析
2017/07/24 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
python实现二分查找算法
2020/09/18 Python
Python性能测试工具Locust安装及使用
2020/12/01 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
物流仓储计划书
2014/01/10 职场文书
《小池塘》教学反思
2014/02/28 职场文书
培训班开班仪式主持词
2014/03/28 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android