用python做NLP:中文文本预处理

一 得到原始文本内容

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

二 中文分词

  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

网上评测的结果来看

在Python下可以采用的较好的中文分词工具是结巴中文分词和中科院的分词系统。

对于这两个工具进行测试。

1 安装结巴中文分词工具

在32位,Windows7 ,Python2.7下安装最新的结巴中文分词工具。

具体步骤:

(1)下载链接https://github.com/fxsjy/jieba,内含安装说明

(2)下载后解压缩到目录下,如C:/ jieba-master

(3)进入目录下,执行指令python setup.py install,完成安装

(4)进行测试,与Java下的NLPIR/ICTCLAS2013进行比较

  1. #coding=utf-8
  2. '''''
  3. Created on 2014-3-19
  4. 测试结巴中文分词工具
  5. @author: liTC
  6. '''
  7. import jieba
  8. import jieba.posseg as pseg
  9. import time
  10. t1=time.time()
  11. #f=open("t_with_splitter.txt","r")#读取文本
  12. #string=f.read().decode("utf-8")
  13. string='祖籍浙江省温州市,1975年2月28日出生于浙江温州,歌手。1987年考上浙江温州清县小百花越剧团,在团里唱小生。'
  14. words = pseg.cut(string)#进行分词
  15. result="" #记录最终结果的变量
  16. for w in words:
  17. result+= str(w.word)+"/"+str(w.flag) #加词性标注
  18. print result
  19. f=open("t_with_POS_tag.txt","w") #将结果保存到另一个文档中
  20. f.write(result)
  21. f.close()
  22. t2=time.time()
  23. print("分词及词性标注完成,耗时:"+str(t2-t1)+"秒。") #反馈结果

测试一:

测试的语句是:“祖籍浙江省温州市,1975年2月28日出生于浙江温州,歌手。1987年考上浙江温州清县小百花越剧团,在团里唱小生。”

NLPIR/ICTCLAS2013的结果是:

祖籍/n 浙江省/ns 温州市/ns ,/wd 1975年/t 2月/t 28日/t 出生/vi 于/p 浙江/ns 温州/ns ,/wd 歌手/n 。/wj 1987年/t 考上/v 浙江/ns 温州/ns 清/a 县/n 小/a 百花/n 越剧团/n ,/wd 在/p 团里/n 唱/v 小生/n _

结巴中文分词的结果是:

祖籍/n浙江省/ns温州市/ns,/x1975/m年/m2/m月/m28/m日出/v生于/v浙江/ns温州/ns,/x歌手/n。/x1987/m年/m考上/v浙江/ns温州/ns清县/ns小/n百花/n越剧团/nt,/x在/p团里/n唱/v小生/n(分词及词性标注完成,耗时:1.96300005913秒)

测试二:

测试的语句是:工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作

NLPIR/ICTCLAS2013的结果是:

工/n 信/n 处女/n 干事/n 每月/r 经过/p 下属/v 科室/n 都/d 要/v 亲口/d 交代/v 24/m 口/q 交换机/n 等/udeng 技术性/n 器件/n 的/ude1 安装/vn 工作/vn _

结巴中文分词的结果是:

工信处/n女干事/n每月/r经过/p下属/v科室/n都/d要/v亲口/n交代/n24/m口/n交换机/n等/u技术性/n器件/n的/uj安装/v工作/vn(分词及词性标注完成,耗时:1.93799996376秒。)

从以上的两个句子的分词来看结巴中文分词的结果都略好于NLPIR/ICTCLAS2013的结果,但是不能排除这两个是特例的可能性。而且可以看出结巴中文分词似乎是采取长词优先的方法所以会在长词错分成短词的情况下性能要好,但是也无法评价如果是其他的实验条件下这是否是个好的处理方式。

2 安装Python下的NLPIR/ICTCLAS2014

在32位,Windows7 ,Python2.7下安装最新的NLPIR/ICTCLAS2014。

具体步骤:

(1)下载链接http://ictclas.nlpir.org/downloads

(2)参照安装流程http://1988eiying.blog.163.com/blog/static/7232177620141233525469/,解压之后目录如下:

(3)将【Data】整个文件夹拷贝到【sample】--【pythonsample】下

(4)将【lib】文件夹里的各个型号的dll 拷贝到【pythonsample】 --【nlpir】里,替换原来的旧的dll,文件名字要对应更改,如拷过来的是win32下的NLPIR.dll,要对应的改成NLPIR32.dll 放到【pythonsample】 --【nlpir】里

(5)打开【pythonsample】里的nlpir.py ,将libFile = './nlpir/NLPIR64.dll' 这一句 里的dll改成对应自己系统版本的dll,例如是32位的,就改成libFile= './nlpir/NLPIR32.dll'

(6)将Data,nlpir,__init__.py,nlpir.py拷贝到项目代码下,运行nlpir.py测试是否可以分词

(7)在ICTCLAS2014Test.py中import nlpir用于实测,与结巴中文分词进行比较

  1. #coding=utf-8
  2. '''''
  3. Created on 2014-3-19
  4. 测试NLPIR/ICTCLAS2014分词工具
  5. @author: liTC
  6. '''
  7. import nlpir
  8. import time
  9. t1=time.time()
  10. #f=open("t_with_splitter.txt","r")#读取文本
  11. #string=f.read().decode("utf-8")
  12. string='工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'
  13. words =nlpir.Seg(string) #进行分词
  14. result="" #记录最终结果的变量
  15. for w in words:
  16. result+= w[0]+"/"+w[1]#加词性标注
  17. print result
  18. f=open("t_with_POS_tag.txt","w") #将结果保存到另一个文档中
  19. f.write(result)
  20. f.close()
  21. t2=time.time()
  22. print("分词及词性标注完成,耗时:"+str(t2-t1)+"秒。") #反馈结果

测试一:

测试的语句是:“祖籍浙江省温州市,1975年2月28日出生于浙江温州,歌手。1987年考上浙江温州清县小百花越剧团,在团里唱小生。”

NLPIR/ICTCLAS2014的结果是:

祖籍/n浙江省/ns温州市/ns,/wd1975年/t2月/t28日/t出生/vi于/p浙江/ns温州/ns,/wd歌手/n。/wj1987年/t考上/v浙江/ns温州/ns清/a县/n小/a百花/n越剧团/n,/wd在/p团里/n唱/v小生/n。/wj(分词及词性标注完成,耗时:0.00100016593933秒)

测试二:

测试的语句是:工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作

NLPIR/ICTCLAS2014的结果是:

工/n信/n处女/n干事/n每月/r经过/p下属/v科室/n都/d要/v亲口/d交代/v24/m口/q交换机/n等/udeng技术性/n器件/n的/ude1安装/vn工作/vn(分词及词性标注完成,耗时:0.00200009346008秒。)

从以上的两个句子的分词来看NLPIR/ICTCLAS2014相对于NLPIR/ICTCLAS2013结果几乎没有变化,结巴中文分词的结果都略好于NLPIR/ICTCLAS2014的结果,但是NLPIR/ICTCLAS2014要比结巴中文分词至少快1000倍,如果用于科研结巴中文分词或许可以获得容忍,但是要是用于产品,绝对是选NLPIR/ICTCLAS2014。

三 去停用词

  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

http://blog.csdn.net/caicai1617/article/details/22042101

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2017-05-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏练小习的专栏

搞来两端模拟自由落体与抛物运动的JS玩

这里有更详细的讲解呵呵 http://www.cnblogs.com/cloudgamer/archive/2009/01/06/Tween.html 自由...

2118
来自专栏木子昭的博客

Django网页模板的继承include与复用extends

Django使用网页模板的方式分为两种, 一是建立代码块, 在新的页面导入代码块, 关键词为include 二是建立模板,新的页面在模板基础上扩充, 关键词为e...

1541
来自专栏机器学习算法与Python学习

工具 | jieba分词快速入门

全自动安装:easy_install jieba 或者 pip install jieba

1782
来自专栏小俊博客

[测评]KYRAHOSTLA CN2 VPS测评

2895
来自专栏小俊博客

[主机测评]真云数据(VMSSR) 洛杉矶I型测评

最近博主买了真云数据的洛杉矶I型这款,HHD硬盘,从测试看,硬盘I/O非常OK,有500-900左右,据商家说是HHD阵列RAID10,堪比 SSD 盘,不过一...

2862
来自专栏小俊博客

[测评]云端互联德国芬兰建站型NAT机器测评

1673
来自专栏FreeBuf

如何做一个完全体的阿尔法狗

在去年3月份一场人机大战吸引了全世界的眼光,当镜头追随着 李世石、戴密斯甚至是跟这场比赛相关的每一个人时,一个人却尽可能地避开了所有的视线,尽可能把自己变成隐形...

3546
来自专栏小白课代表

学术 | SCI论文下载

SCI(Scientific Citation Index)是美国科学信息研究所(ISI) 编辑出版的引文索引类刊物,创刊于1964年。分印刷版、光盘版和联机板...

561
来自专栏游戏杂谈

游戏繁体化那些让人蛋疼的事儿

项目首先从国内开始做,然后跟台湾那边谈了合作,要发行台湾版本。这过程中遇到一些问题,特别的坑,特此记录一下

1202
来自专栏疯狂的小程序

微信小程序「学科排名」发布了

前几天,教育部公布了《全国第四轮学科评估结果》,在手机上看起来不太方便,于是本人就“撸起袖子加油干”,写了一套脚本把数据收集了一下,做成了微信小程序,叫「学科排...

2509

扫码关注云+社区