zoukankan      html  css  js  c++  java
  • 2010年分词大作业 正向最大匹配

    (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

    稍后上传源码包。
  • 相关阅读:
    差分约束系统
    LCA
    CRB and Candies LCM 性质
    【强连通分量】 Kosaraju和Tarjan算法 (标准模板+详细注释)
    最小生成树
    堆优化的迪杰斯特拉算法
    SPFA算法
    Floyd算法
    Dijkstra算法
    图论中环的判断
  • 原文地址:https://www.cnblogs.com/finallyliuyu/p/1732141.html
Copyright © 2011-2022 走看看