1. 如何利用python对中文进行分词处理
python做中文分词处理主要有以下几种:结巴分词、NLTK、THULAC
1、fxsjy/jieba
结巴的标语是:做最好的 Python 中文分词组件,或许从现在来看它没做到最好,但是已经做到了使用的人最多。结巴分词网上的学习资料和使用案例比较多,上手相对比较轻松,速度也比较快。
结巴的优点:
支持三种分词模式
支持繁体分词
支持自定义词典
MIT 授权协议
2、THULAC:一个高效的中文词法分析工具包
前两天我在做有关于共享单车的用户反馈分类,使用jieba分词一直太过零散,分类分不好。后来江兄给我推荐了THULAC: 由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包 。THULAC的接口文档很详细,简单易上手。
THULAC分词的优点:
能力强。利用规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。
准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%
速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度达到1.3MB/s,速度比jieba慢
Python 解决中文编码问题基本可以用以下逻辑:
utf8(输入) ——> unicode(处理) ——> (输出)utf8
Python 里面处理的字符都是都是unicode 编码,因此解决编码问题的方法是把输入的文本(无论是什么编码)解码为(decode)unicode编码,然后输出时再编码(encode)成所需编码。
由于处理的一般为txt 文档,所以最简单的方法,是把txt 文档另存为utf-8 编码,然后使用Python 处理的时候解码为unicode(sometexts.decode('utf8')),输出结果回txt 的时候再编码成utf8(直接用str() 函数就可以了)。
2. python中怎样处理汉语的同义词用结巴分词
python中文分词:结巴分词
中文分词是中文文本处理的一个基础性工作,结巴分词利用进行中文分词。其基本实现原理有三点:
基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)
采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法
安装(Linux环境)
下载工具包,解压后进入目录下,运行:python setup.py install
模式
默认模式,试图将句子最精确地切开,适合文本分析
全模式,把句子中所有的可以成词的词语都扫描出来,适合搜索引擎
接口
组件只提供jieba.cut 方法用于分词
cut方法接受两个输入参数:
第一个参数为需要分词的字符串
cut_all参数用来控制分词模式
待分词的字符串可以是gbk字符串、utf-8字符串或者unicode
jieba.cut返回的结构是一个可迭代的generator,可以使用for循环来获得分词后得到的每一个词语(unicode),也可以用list(jieba.cut(...))转化为list
实例
#! -*- coding:utf-8 -*-
import jieba
seg_list = jieba.cut("我来到北京清华大学", cut_all = True)
print "Full Mode:", ' '.join(seg_list)
seg_list = jieba.cut("我来到北京清华大学")
print "Default Mode:", ' '.join(seg_list)
3. 如何用python和jieba分词,统计词频
#!python3
#-*-coding:utf-8-*-
importos,codecs
importjieba
fromcollectionsimportCounter
defget_words(txt):
seg_list=jieba.cut(txt)
c=Counter()
forxinseg_list:
iflen(x)>1andx!=' ':
c[x]+=1
print('常用词频度统计结果')
for(k,v)inc.most_common(100):
print('%s%s%s%d'%(''*(5-len(k)),k,'*'*int(v/3),v))
if__name__=='__main__':
withcodecs.open('19d.txt','r','utf8')asf:
txt=f.read()
get_words(txt)
4. python3怎么使用结巴分词
下面这个程序是对一个文本文件里的内容进行分词的程序:test.py
[python] view plain
#!/usr/bin/python
#-*-encoding:utf-8-*-
importjieba#导入jieba模块
defsplitSentence(inputFile,outputFile):
fin=open(inputFile,'r')#以读的方式打开文件
fout=open(outputFile,'w')#以写得方式打开文件
foreachLineinfin:
line=eachLine.strip().decode('utf-8','ignore')#去除每行首尾可能出现的空格,并转为Unicode进行处理
wordList=list(jieba.cut(line))#用结巴分词,对每行内容进行分词
outStr=''
forwordinwordList:
outStr+=word
outStr+='/'
fout.write(outStr.strip().encode('utf-8')+' ')#将分词好的结果写入到输出文件
fin.close()
fout.close()
splitSentence('myInput.txt','myOutput.txt')
写完程序之后,在Linux重点输入:python test.py即可运行程序进行分词。
输入的文件内容如下所示:
注意:第11行的 jieba.cut()返回的结构是一个可迭代的generator,可以用list(jieba.cut(...))转化为list
5. jieba分词(R vs. python)
自然语言处理(NLP)是机器学习重要分支之一,主要应用于篇章理解、文本摘要、情感分析、知识图谱、文本翻译等领域。而NLP应用首先是对文本进行分词,当前中文分词器有Ansj、paoding、盘古分词等多种,而最基础的分词器应该属于jieba分词器(比较见下图)。
下面将分别应用R和python对jieba分词器在中文分词、词性标注和关键词提取领域的应用进行比较。
R实现
通过函数worker()来初始化分词引擎,使用segment()进行分词。有四种分词模式:最大概率法(MP)、隐马尔科夫模型(HMM)、混合模型(Mix)及索引模型(query),默认为混合模型。具体可查看help(worker).
#install.packages('jiebaR')library(jiebaR)mixseg <- worker()segment( "这是一段测试文本" , mixseg ) #或者用以下操作mixseg['这是一段测试文本']mixseg <= "这是一段测试文本"
python实现
python中需安装jieba库,运用jieba.cut实现分词。cut_all参数为分词类型,默认为精确模式。
import jiebaseg_list = jieba.cut(u"这是一段测试文本",cut_all = False)print("Full mode: "+ ",".join(seg_list)) #默认精确模式
无论是R还是python都为utf—8编码。
R实现
可以使用<=.tagger 或者tag 来进行分词和词性标注,词性标注使用混合模型模型分词,标注采用和 ictclas 兼容的标记法。
words = "我爱北京天安门"tagger = worker("tag") #开启词性标注启发器tagger <= words # r v ns ns # "我" "爱" "北京" "天安门"
python实现
#词性标注import jieba.posseg as psegwords = pseg.cut("我爱北京天安门")for word,flag in words: print('%s, %s' %(word,flag))
R实现
R关键词提取使用逆向文件频率(IDF)文本语料库,通过worker参数“keywords”开启关键词提取启发器,topn参数为关键词的个数。
keys = worker("keywords",topn = 5, idf = IDFPATH)keys <= "会议邀请到美国密歇根大学(University of Michigan, Ann Arbor)环境健康科学系副教授奚传武博士作题为“Multibarrier approach for safe drinking waterin the US : Why it failed in Flint”的学术讲座,介绍美国密歇根Flint市饮用水污染事故的发生发展和处置等方面内容。讲座后各相关单位同志与奚传武教授就生活饮用水在线监测系统、美国水污染事件的处置方式、生活饮用水老旧管网改造、如何有效减少消毒副产物以及美国涉水产品和二次供水单位的监管模式等问题进行了探讨和交流。本次交流会是我市生活饮用水卫生管理工作洽商机制运行以来的又一次新尝试,也为我市卫生计生综合监督部门探索生活饮用水卫生安全管理模式及突发水污染事件的应对措施开拓了眼界和思路。"#结果:# 48.8677 23.4784 22.1402 20.326 18.5354 # "饮用水" "Flint" "卫生" "水污染" "生活"
python实现
python实现关键词提取可运用TF-IDF方法和TextRank方法。allowPOS参数为限定范围词性类型。
#关键词提取import jieba.analysecontent = u'会议邀请到美国密歇根大学(University of Michigan, Ann Arbor)环境健康科学系副教授奚传武博士作题为“Multibarrier approach for safe drinking waterin the US : Why it failed in Flint”的学术讲座,介绍美国密歇根Flint市饮用水污染事故的发生发展和处置等方面内容。讲座后各相关单位同志与奚传武教授就生活饮用水在线监测系统、美国水污染事件的处置方式、生活饮用水老旧管网改造、如何有效减少消毒副产物以及美国涉水产品和二次供水单位的监管模式等问题进行了探讨和交流。本次交流会是我市生活饮用水卫生管理工作洽商机制运行以来的又一次新尝试,也为我市卫生计生综合监督部门探索生活饮用水卫生安全管理模式及突发水污染事件的应对措施开拓了眼界和思路。'#基于TF-IDFkeywords = jieba.analyse.extract_tags(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords: print item[0],item[1] #基于TF-IDF结果# 饮用水 0.448327672795# Flint 0.219353532163# 卫生 0.203120821773# 水污染 0.186477211628# 生活 0.170049997544
#基于TextRankkeywords = jieba.analyse.textrank(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords: print item[0],item[1] #基于TextRank结果:# 饮用水 1.0# 美国 0.570564785973# 奚传武 0.510738424509# 单位 0.472841889334# 讲座 0.443770732053
写在文后
自然语言处理(NLP)在数据分析领域有其特殊的应用,在R中除了jiebaR包,中文分词Rwordseg包也非常常用。一般的文本挖掘步骤包括:文本获取(主要用网络爬取)——文本处理(分词、词性标注、删除停用词等)——文本分析(主题模型、情感分析)——分析可视化(词云、知识图谱等)。本文是自然语言处理的第一篇,后续将分别总结下应用深度学习Word2vec进行词嵌入以及主题模型、情感分析的常用NLP方法。
参考资料
Introction · jiebaR 中文分词 https://qinwenfeng.com/jiebaR/segment.html
知乎:【文本分析】利用jiebaR进行中文分词 https://zhuanlan.hu.com/p/24882048
雪晴数据网:全栈数据工程师养成攻略 http://www.xueqing.tv/course/73
搜狗实验室,词性标注应用 http://www.sogou.com/labs/webservice/
【R文本挖掘】中文分词Rwordseg http://blog.163.com/zzz216@yeah/blog/static/162554684201412895732586/
6. 如何用python进行海量中文分词
1、全局变量在函数中使用时需要加入global声明
2、获取网页内容存入文件时的编码为ascii进行正则匹配时需要decode为GB2312,当匹配到的中文写入文件时需要encode成GB2312写入文件。
3、中文字符匹配过滤正则表达式为ur'[\u4e00-\u9fa5]+',使用findall找到所有的中文字符存入分组
4、KEY,Value值可以使用dict存储,排序后可以使用list存储
5、字符串处理使用split分割,然后使用index截取字符串,判断哪些是名词和动词
6、命令行使用需要导入os,os.system(cmd)
7. 用python怎么能够将一句中文分割为单个的字
字符串可以直接分片或者索引访问,比如s[0]=我,s[-1]=做。等等肆键友。
如果是要转成list,可以直亮指接构造,如: l=list('abc')或者l=list(s)
分词需要相应的算法和词典支持。pymmseg-cpp是一个不错的python中文分词库。你可以试试裂槐。
https://github.com/pluskid/pymmseg-cpp/