(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'
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
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
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
稍后上传源码包。