python实现中文分词FMM算法实例

作者:Sephiroth 时间:2022-07-31 18:40:55 

本文实例讲述了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,中文,分词
0
投稿

猜你喜欢

  • Internet Explorer 8 Beta2 功能预览

    2008-07-29 13:20:00
  • python绘制多个曲线的折线图

    2021-08-01 13:58:52
  • Python 由字符串函数名得到对应的函数(实例讲解)

    2023-07-24 07:28:29
  • C语言中操作sqlserver数据库案例教程

    2024-01-24 17:47:32
  • python3解析库pyquery的深入讲解

    2022-01-11 23:14:48
  • Request.ServerVariables各参数说明集合

    2008-11-25 18:49:00
  • Python机器学习库scikit-learn安装与基本使用教程

    2022-01-17 14:19:03
  • Python中切片的详细操作篇

    2021-11-29 13:33:26
  • python 读取文件并替换字段的实例

    2022-10-18 05:12:21
  • PHP实现从上往下打印二叉树的方法

    2023-06-25 17:40:08
  • caffe的python接口生成配置文件学习

    2023-07-09 04:46:41
  • 页面设计之个性元素与共性元素

    2008-07-17 12:36:00
  • Perl中的文件读写学习笔记

    2022-07-10 09:13:55
  • php文件上传类完整实例

    2023-11-22 04:32:28
  • python实现五子棋小程序

    2023-12-04 20:49:37
  • python实现用于测试网站访问速率的方法

    2023-07-28 19:12:02
  • JavaScript函数节流和函数去抖知识点学习

    2024-06-07 15:59:54
  • 解析SQLServer获取Excel中所有Sheet的方法

    2024-01-18 15:11:26
  • golang中的net/rpc包使用概述(小结)

    2024-05-29 22:05:54
  • python文件特定行插入和替换实例详解

    2022-05-01 11:16:27
  • asp之家 网络编程 m.aspxhome.com