(1)语料库格式:为了防止我们作弊,老师对汉字进行了编码,让我们对“加密后”的文本进行分词

两个竖线之间的部分对应于一个词。

首先介绍 正向最大匹配方法

第一步:数据预处理与字典形成:首先语料库转化成一个set格式,set 包含 语料库中出现的全部词

 

形成字典
import re
import cPickle as mypickle
def datafile(name,sep='|'):
    
'''use generator to create a iterable object '''
    
for line in file(name):
        
yield line.split(sep)
candidates
=datafile(r'.\data\training.txt')
p1
=re.compile('(^\s+|\s+$)')
p2
=re.compile('\d')
result
=set([])   
for m in candidates:
    singleline
=[]
    
for e in m:
        e
=p1.sub('',e)
        
if p2.match(e):
            singleline.append(e)
    
print singleline
    result
=result|set(singleline)    
f2
=file('finadictionary.data','w')
mypickle.dump(result,f2)
f2.close()
#print result
print 'finish'

 

第二步:正向最大匹配算法实现(FMM):

 

正向最大匹配
# -*- coding: cp936 -*-

class FMM(dict):
    
def __init__(self,f):           
        
import cPickle as mypickle
        self.dictionary
=mypickle.load(f)
        self.delimiter
=' '
    
    
def myFMM(self,sentence):
        MAXLEN
=20#最大单词长度
        result=[]
        
while True:
            length
=len(sentence)#sentence 为一个list,每一个元素为一个单字,length初始化为一个句子的长度,最后演变成一个词的长度
            if length>1:#单字直接默认存在,两个或两个字以上才启用查字典方法
                if length>MAXLEN:
                    length
=MAXLEN
                w
=sentence[0:length]#w为序列
                w_sent=self.delimiter.join(w)#w_sent为候选的词,属于字符串
                test=w_sent not in self.dictionary#测试字典里是不是出现了该词如果出现返回 false不出现返回true
                while test:#当前词在字典中不存在
                    length=length-1#减少一个字继续查字典
                    if length==1:
                        w_sent
=sentence[0:length][0]#单字直接默认为此
                        test=False
                    
else:    
                        w
=sentence[0:length]
                        w_sent
=self.delimiter.join(w)
                        test
=w_sent not in self.dictionary
                 
            
else:
                w_sent
=sentence[0:length][0]#单字默认为词
            result.append(w_sent)
            
print w_sent
            sentence
=sentence[length:]
            
if len(sentence)==0:
                
break
        
return result

 

 测试代码:

 

测试代码
# -*- coding: cp936 -*-
result=[]
delimiter
=' '
delimiter2
='|'
from wordsegmentation import FMMclass
import re
#获取待测试的数据
fid=file(r'C:\python26\wordsegmentation\mydictionary.data')
fmm
=FMMclass.FMM(fid)
sentence
=[]
restult
=[]
p1
=re.compile('\d+')
f
=file(r'.\corpus-test\corpus-test-digit.utf-8.txt')
for line in f:
    sentence
=p1.findall(line)
    
if len(sentence)>0:
        result_single
=fmm.myFMM(sentence)
        result
=result+result_single
    
else:
         
continue

      
#把result 变成 老师的数据格式,并且保持到文本文件reult中
s=[]
for m in result:
    m
=' '+m+' '
    s.append(m)
finalresult
=delimiter2.join(s)
finalresult
=finalresult+'|'#得到了和老师给的数据一致的格式类型
fresult=file(r'.\corpus-test\result.txt','w')
fresult.write(finalresult)
fresult.close()

print'final finish congratulations!'
    
#print result

 

 

稍后上传源码包。
posted on 2010-05-10 22:46  finallyly  阅读(1815)  评论(2编辑  收藏  举报