Python下中文预处理

一 得到原始文本内容

  1. def FileRead(self,filePath):  
  2.     f = open(filePath)  
  3.     raw=f.read()  
  4.     return raw  

二 中文分词

参考之前的一篇博客Python下的中文分词实现

  1. def NlpirTokener(self,raw):  
  2.         result=''  
  3.         tokens = nlpir.Seg(raw)  
  4.         for w in tokens:  
  5. #           result+= w[0]+"/"+w[1] #加词性标注  
  6.             result+= w[0] +'/'#加词性标注  
  7.         return result  
  8.     def JiebaTokener(self,raw):  
  9.         result=''  
  10.         words = pseg.cut(raw) #进行分词  
  11.         result=""  #记录最终结果的变量  
  12.         for w in words:  
  13. #            result+= str(w.word)+"/"+str(w.flag) #加词性标注  
  14.              result+= str(w.word)+"/" #加词  
  15.         return result  

三 去停用词

  1. def StopwordsRm(self,words):  
  2.       result=''  
  3.       print words  
  4.       wordList=[word for word in words.split('#')]  
  5.       print wordList[:20]  
  6.       stopwords = {}.fromkeys([ line.rstrip()for line in open(conf.PreConfig.CHSTOPWORDS)])  
  7.       cleanTokens= [w for w in wordList ifw not in stopwords]  
  8.       print cleanTokens[:20]  
  9.       for c in cleanTokens:  
  10.           result+=c+"#"  
  11.       print result  
  12.      returnresult  

在这个地方我遇到了一个很烦人的问题,那就是Python的中文解码问题,在最开始的一个小时里我在在去停用词之后一直看到的结果是这样的:


\xe3\x80\x90/\xe6\x97\xa5\xe6\x9c\x9f/\xe3\这种东西没说的肯定是解码造成的,于是开始找解决的方法。

后来找到CSDN上http://blog.csdn.net/samxx8/article/details/6286407

感觉说的很详细,于是便开始尝试里面介绍的方法。

在经过一些尝试以后我发现,虽然这并不影响最后的得到分词和去除停用词的结果,但是是没有办法解决在print wordList[:20]和print cleanTokens[:20]出现的乱码让我很不爽。所以我决定继续尝试一下。在网上查找一下这个问题,发现好像很多人都曾经遇到过,并且给出来一些解决方案。从大家的博客内容了可以总结出几个问题,python对中文支持不是很好,Python 2.x对中文的支持不好,windows默认字符集下Python2.x经常会出现乱码情况,windows下的eclipse里面写的python 2.x程序对中文支持很不好。后来我还是找到了解决方案,那就是:

  1. defmdcode(self,str):  
  2.         for c in ('utf-8''gbk''gb2312'):     
  3.             try:  
  4.                 return str.decode(c).encode( 'utf-8' )  
  5.             except:  
  6.                 pass  
  7.        return 'unknown'  

自动检测转化,基本上问题上解决了。

四 半角与全角转换

参考的网上的方法( http://www.cnblogs.com/kaituorensheng/p/3554571.html)拿过来用的。

方法就是检查字符是不是全角的,是全角的就做减法变成半角的。其实我不是很懂,为什么会有全角字符这么bug的东西,给处理带来了很多麻烦。

  1. def strQ2B(self,ustring):  
  2.     """把字符串全角转半角"""  
  3.     ustring=ustring.decode('utf-8')  
  4.     rstring = ""  
  5.     for uchar in ustring:  
  6.         inside_code=ord(uchar)  
  7.         if inside_code==0x3000:  
  8.             inside_code=0x0020  
  9.         else:  
  10.             inside_code-=0xfee0  
  11.         if inside_code<0x0020 or inside_code>0x7e:      #转完之后不是半角字符则返回原来的字符  
  12.            rstring+=uchar.encode('utf-8')  
  13.         else:  
  14.             rstring+=(unichr(inside_code)).encode('utf-8')  
  15.     return rstring  

五 完整代码

  1. #coding=utf-8  
  2. ''''' 
  3. Created on 2014-3-20 
  4. 中文的预处理 
  5. @author: liTC 
  6. '''  
  7. importtime  
  8. importstring  
  9. importre  
  10. importos  
  11. importnlpir  
  12. importjieba  
  13. importjieba.posseg as pseg  
  14. fromconfig import Config as conf  
  15. importsys  
  16. reload(sys)  
  17. sys.setdefaultencoding('utf-8')  
  18.    
  19. classChPreprocess:  
  20.     def __init__(self):  
  21.         print 'Chinese Preprocess...'  
  22.     def mdcode(self,str):  
  23.         for c in ('utf-8''gbk''gb2312'):     
  24.             try:  
  25.                 return str.decode(c).encode( 'utf-8' )  
  26.             except:  
  27.                 pass  
  28.         return 'unknown'  
  29.     def FileRead(self,filePath):  
  30.         f = open(filePath,'r')  
  31.         raw=self.mdcode(f.read())  
  32.         return raw  
  33.     def NlpirTokener(self,raw):  
  34.         nlpir_result=''  
  35.         tokens = nlpir.Seg(raw)  
  36.         for w in tokens:  
  37. #           result+= w[0]+"/"+w[1] #加词性标注  
  38.             nlpir_result+= w[0] +' '#加词性标注  
  39.         return nlpir_result  
  40.     def JiebaTokener(self,raw):  
  41.         jieba_result=''  
  42.         words = pseg.cut(raw) #进行分词  
  43.         jieba_result=""  #记录最终结果的变量  
  44.         for w in words:  
  45. #            jieba_result+= str(w.word)+"/"+str(w.flag) #加词性标注  
  46.              jieba_result+=str(w.word)+" " #加词  
  47.         return jieba_result  
  48.     def StopwordsRm(self,words):  
  49.         spr_result=''  
  50.         wordList=[word for word in words.split(' ')]  
  51.         stopwords = {}.fromkeys([line.rstrip() forline inopen(conf.PreConfig.CHSTOPWORDS)])  
  52.         cleanStops= [w for w in wordList if w not in stopwords]  
  53.         cleanTokens=[self.CleanEnNum(cs) for cs in cleanStops]  
  54.         for c in cleanTokens:  
  55.             if c=='。'or  c=='?'or c=='!':  
  56.                 spr_result+='\n'  
  57.                 continue  
  58.             spr_result+=c+" "  
  59.         return spr_result  
  60.     def strQ2B(self,ustring):  
  61.         """把字符串全角转半角"""  
  62.         ustring=ustring.decode('utf-8')  
  63.         rstring = ""  
  64.         for uchar in ustring:  
  65.             inside_code=ord(uchar)  
  66.             if inside_code==0x3000:  
  67.                 inside_code=0x0020  
  68.             else:  
  69.                 inside_code-=0xfee0  
  70.             if inside_code<0x0020 or inside_code>0x7e:      #转完之后不是半角字符则返回原来的字符  
  71.                rstring+=uchar.encode('utf-8')  
  72.             else:  
  73.                 rstring+=(unichr(inside_code)).encode('utf-8')  
  74.         return rstring  
  75.     def CleanEnNum(self,raw):  
  76.         p=re.compile(r'\w*',re.L)  
  77.         clean = p.sub("", raw)  
  78. #        r =re.sub("[A-Za-z0-9
    \`\~\@#$\^&\*\(\)\={}\'\'\[
    \.\<\>\/\?\~\!\@\#\\\&\*\%]", "", s)  
  79.         return clean  
  80.     def mkdir(self,path):  
  81.         # 去除首位空格  
  82.         path=path.strip()  
  83.         # 去除尾部 \ 符号  
  84.         path=path.rstrip("\\")  
  85.         # 判断路径是否存在  
  86.         # 存在    True  
  87.         # 不存在  False  
  88.        isExists=os.path.exists(path)  
  89.         # 判断结果  
  90.         if not isExists:  
  91.             # 如果不存在则创建目录  
  92.             print path+' 创建成功'  
  93.             # 创建目录操作函数  
  94.             os.makedirs(path)  
  95.             return True  
  96.         else:  
  97.             # 如果目录存在则不创建,并提示目录已存在  
  98.             print path+' 目录已存在'  
  99.             return False  
  100.     def WriteResult(self,result,resultPath):  
  101.         self.mkdir(str(resultPath).replace(str(resultPath).split('/')[-1],''))  
  102.         f=open(resultPath,"w")  #将结果保存到另一个文档中  
  103.         f.write(result)  
  104.         f.close()  
  105.     def JiebaMain(self,dir):  
  106.       for root,dirs,files in os.walk(dir):  
  107.           for eachfiles in files:  
  108.            croupPath=os.path.join(root,eachfiles)  
  109.             print croupPath  
  110.            resultPath=conf.PreConfig.JIEBARESULTPATH+croupPath.split('/')[-2]+'/'+croupPath.split('/')[-1]              
  111.             raw=self.FileRead(croupPath).strip()  
  112.             raw=self.strQ2B(raw)  
  113.             raw=raw.replace(" ",'')  
  114.             words=self.JiebaTokener(raw)  
  115.             result=self.StopwordsRm(words)  
  116.             self.WriteResult(result,resultPath)  
  117.     def NlpirMain(self,dir):  
  118.       for root,dirs,files in os.walk(dir):  
  119.           for eachfiles in files:  
  120.            croupPath=os.path.join(root,eachfiles)  
  121.             print croupPath  
  122.            resultPath=conf.PreConfig.NLPIRRESULTPATH+croupPath.split('/')[-2]+'/'+croupPath.split('/')[-1]             
  123.             raw=self.FileRead(croupPath).strip()  
  124.             raw=self.strQ2B(raw)  
  125.             raw=raw.replace(" ",'')  
  126.             words=self.NlpirTokener(raw)  
  127.             result=self.StopwordsRm(words)  
  128.             self.WriteResult(result,resultPath)  
  129.     def LoadCroupResult(self,filepath):  
  130.         raw=chPre.FileRead(filepath)  
  131.         result=[t for t in raw.split(' ')]  
  132.         for r in result:  
  133.             print self.mdcode(r)#打印显示  
  134.         return result  
  135.     def Test(self):  
  136.         chPre=ChPreprocess()  
  137.         croupPath='/corpus/mx/6/69.TXT'  
  138.        resultPath=conf.PreConfig.NLPIRRESULTPATH+croupPath.split('/')[-2]+'/'+croupPath.split('/')[-1]             
  139. #       resultPath=conf.PreConfig.JIEBARESULTPATH+croupPath.split('/')[-2]+'/'+croupPath.split('/')[-1]             
  140.         print resultPath  
  141.        raw=chPre.FileRead(croupPath)  
  142.         raw=chPre.strQ2B(raw)  
  143.         raw=raw.replace(" ",'')  
  144.        words=chPre.NlpirTokener(raw)  
  145. #       words=chPre.JiebaTokener(raw)  
  146.        result=chPre.StopwordsRm(words)  
  147.         print result  
  148.         chPre.WriteResult(result,resultPath)  
  149.              
  150.                     
  151. chPre=ChPreprocess()  
  152. # chPre.JiebaMain(conf.PreConfig.CHCROPPATH)  
  153. chPre.NlpirMain(conf.PreConfig.CHCORUPPATH) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值