python英文分词工具(python分词处理的函数)
用Python实现英文文章难度评级
By Jiaxian Shi
英文文章的难度从直觉上来讲可以从以下两方面来定义:
句子的难易程度可以从句子的长度和复杂性(从句数量,嵌套)方面来考虑。词汇的难易程度可以从词汇的长度和使用频率(专业词汇,罕见词汇)方面来考虑。通过查阅维基百科等相关资料,发现目前普遍得到运用的可读性标准为Flesch–Kincaid可读性测试指标。Flesch–Kincaid可读性测试指标由两个指标构成:Flesch Reading Ease(FRE)和Flesch–Kincaid Grade Level(FKGL)。与我们的直觉一致,两者都使用了类似的方法:句子长度和词汇长度(由音节数确定,不单纯考虑字母数)。由于两个指标对句子长度和词汇长度所采取的权重不同(包括正负号),所以两个指标的意义相反:FRE数值越高,文章就越简单,可读性也越高。而FKGL数值越高,文章就越复杂,文章的可读性也就越低。
使用Python强大的自然语言处理(NLP)包NLTK,来实现下述3个功能:
其中,断句使用NLTK提供的非监督学习的预训练模型tokenizers/punkt/english.pickle,分词则使用NLTK推荐的word_tokenize函数(使用TreebankWordTokenizer和PunktSentenceTokenizer模块),分音节则使用NLTK供的SyllableTokenizer模块。需要注意的是,分词会将标点符号分为一个单词,需要手动去除。同时,分音节时会讲英语中的连字符“-”分为一个音节,也需要手动去除。另外,文章需要进行预处理,去除回车符和空格,并将非标准标点符号转换为英文标准标点符号。
统计出句数,词数和音节数后,即可根据上文提供的公式计算出FRE和FKGL了。本程序使用4段不同类型的英文文章分别计算FRG和FKGL,并使用matplotlib模块绘制出柱状图已做比较。
文章:
比较结果如下图所示:
可以发现,文章的难度为:儿童文学侦探小说杂志文章学术论文,这与我们的实际感受是一致的。
python jieba什么用
用来分词的,jieba 可以:
把一句话拆分成多个词。
从一句话(一段话)中提取最重要的几个关键词。
最常用的功能应该就是这些吧,分词之后结合 TF-IDF,就可以开始做搜索工具和相关推荐了。
部分常用分词工具使用整理
以下分词工具均能在Python环境中直接调用(排名不分先后)。
1、jieba(结巴分词) 免费使用
2、HanLP(汉语言处理包) 免费使用
3、SnowNLP(中文的类库) 免费使用
4、FoolNLTK(中文处理工具包) 免费使用
5、Jiagu(甲骨NLP) 免费使用
6、pyltp(哈工大语言云) 商用需要付费
7、THULAC(清华中文词法分析工具包) 商用需要付费
8、NLPIR(汉语分词系统) 付费使用
1、jieba(结巴分词)
“结巴”中文分词:做最好的 Python 中文分词组件。
项目Github地址:jieba
安装 :
pip install jieba
使用 :
import jieba
jieba.initialize()
text = '化妆和服装'
words = jieba.cut(text)
words = list(words)
print(words)
2、HanLP(汉语言处理包)
HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。
项目Github地址:pyhanlp
安装:
pip install pyhanlp
使用 :
import pyhanlp
text = '化妆和服装'
words = []
for term in pyhanlp.HanLP.segment(text):
words.append(term.word)
print(words)
3、SnowNLP(中文的类库)
SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。
项目Github地址:snownlp
安装:
pip install snownlp
使用:
import snownlp
text = '化妆和服装'
words = snownlp.SnowNLP(text).words
print(words)
4、FoolNLTK(中文处理工具包)
可能不是最快的开源中文分词,但很可能是最准的开源中文分词。
项目Github地址:FoolNLTK
安装:
pip install foolnltk
使用:
import fool
text = '化妆和服装'
words = fool.cut(text)
print(words)
5、Jiagu(甲骨NLP)
基于BiLSTM模型,使用大规模语料训练而成。将提供中文分词、词性标注、命名实体识别、关键词抽取、文本摘要、新词发现等常用自然语言处理功能。参考了各大工具优缺点制作,将Jiagu回馈给大家。
项目Github地址:jiagu
安装:
pip3 install jiagu
使用:
import jiagu
jiagu.init()
text = '化妆和服装'
words = jiagu.seg(text)
print(words)
6、pyltp(哈工大语言云)
pyltp 是 LTP 的 Python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能。
项目Github地址:pyltp,3.4模型下载链接:网盘
安装:
pip install pyltp
使用:
import pyltp
segmentor = pyltp.Segmentor()
segmentor.load('model/ltp_data_v3.4.0/cws.model') # 模型放置的路径
text = '化妆和服装'
words = segmentor.segment(text)
words = list(words)
print(words)
7、THULAC(清华中文词法分析工具包)
THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与 社会 人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。
项目Github地址:THULAC-Python
安装:
pip install thulac
使用:
import thulac
thu = thulac.thulac(seg_only=True)
text = '化妆和服装'
words = thu.cut(text, text=True).split()
print(words)
NLPIR(汉语分词系统)
主要功能包括中文分词;英文分词;词性标注;命名实体识别;新词识别;关键词提取;支持用户专业词典与微博分析。NLPIR系统支持多种编码、多种操作系统、多种开发语言与平台。
项目Github地址:pynlpir
安装:
pip install pynlpir
下载证书覆盖到安装目录,NLPIR.user 例如安装目录:/usr/lib64/python3.4/site-packages/pynlpir/Data
使用 :
import pynlpir
pynlpir.open()
text = '化妆和服装'
words = pynlpir.segment(text, pos_tagging=False)
print(words)
pynlpir.close()
如何利用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() 函数就可以了)。
一个txt文档,已经用结巴分词分完词,怎么用python工具对这个分完词的文档进行计算统计词频,求脚本,非
#!/usr/bin/env?python3
#-*-?coding:utf-8?-*-
import?os,random
#假设要读取文件名为aa,位于当前路径
filename='aa.txt'
dirname=os.getcwd()
f_n=os.path.join(dirname,filename)
#注释掉的程序段,用于测试脚本,它生成20行数据,每行有1-20随机个数字,每个数字随机1-20
'''
test=''
for?i?in?range(20):
????for?j?in?range(random.randint(1,20)):
????????test+=str(random.randint(1,20))+'?'
????test+='\n'
with?open(f_n,'w')?as?wf:
????wf.write(test)
'''
with?open(f_n)?as?f:
????s=f.readlines()
#将每一行数据去掉首尾的空格和换行符,然后用空格分割,再组成一维列表
words=[]
for?line?in?s:
????words.extend(line.strip().split('?'))
#格式化要输出的每行数据,首尾各占8位,中间占18位
def?geshi(a,b,c):
????return?alignment(str(a))+alignment(str(b),18)+alignment(str(c))+'\n'
#中英文混合对齐?,参考?,二楼
#汉字与字母?格式化占位?format对齐出错?对不齐?汉字对齐数字?汉字对齐字母?中文对齐英文
#alignment函数用于英汉混合对齐、汉字英文对齐、汉英对齐、中英对齐
def?alignment(str1,?space=8,?align?=?'left'):
????length?=?len(str1.encode('gb2312'))
????space?=?space?-?length?if?space?=length?else?0
????if?align?in?['left','l','L','Left','LEFT']:
????????str1?=?str1?+?'?'?*?space
????elif?align?in?['right','r','R','Right','RIGHT']:
????????str1?=?'?'*?space?+str1
????elif?align?in?['center','c','C','Center','CENTER','centre']:
????????str1?=?'?'?*?(space?//2)?+str1?+?'?'*?(space?-?space?//?2)
????return?str1
w_s=geshi('序号','词','频率')
#由(词,频率)元组构成列表,先按频率降序排序,再按词升序排序,多级排序,一组升,一组降,高级sorted
wordcount=sorted([(w,words.count(w))?for?w?in?set(words)],key=lambda?l:(-l[1],l[0]))
#要输出的数据,每一行由:序号(占8位)词(占20位)频率(占8位)+'\n'构成,序号=List.index(element)+1
for?(w,c)?in?wordcount:????
????w_s+=geshi(wordcount.index((w,c))+1,w,c)
#将统计结果写入文件ar.txt中
writefile='ar.txt'
w_n=os.path.join(dirname,writefile)
with?open(w_n,'w')?as?wf:
????wf.write(w_s)
如何用python和jieba分词,统计词频?
?#!?python3
#?-*-?coding:?utf-8?-*-
import?os,?codecs
import?jieba
from?collections?import?Counter
?
def?get_words(txt):
????seg_list?=?jieba.cut(txt)
????c?=?Counter()
????for?x?in?seg_list:
????????if?len(x)1?and?x?!=?'\r\n':
????????????c[x]?+=?1
????print('常用词频度统计结果')
????for?(k,v)?in?c.most_common(100):
????????print('%s%s?%s??%d'?%?('??'*(5-len(k)),?k,?'*'*int(v/3),?v))
?
if?__name__?==?'__main__':
????with?codecs.open('19d.txt',?'r',?'utf8')?as?f:
????????txt?=?f.read()
????get_words(txt)