重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
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() 函数就可以了)。
下面这个程序是对一个文本文件里的内容进行分词的程序:test.py
[python] view plain copy
#!/usr/bin/python
#-*- encoding:utf-8 -*-
import jieba #导入jieba模块
def splitSentence(inputFile, outputFile):
fin = open(inputFile, 'r') #以读的方式打开文件
fout = open(outputFile, 'w') #以写得方式打开文件
for eachLine in fin:
line = eachLine.strip().decode('utf-8', 'ignore') #去除每行首尾可能出现的空格,并转为Unicode进行处理
wordList = list(jieba.cut(line)) #用结巴分词,对每行内容进行分词
outStr = ''
for word in wordList:
outStr += word
outStr += '/ '
fout.write(outStr.strip().encode('utf-8') + '\n') #将分词好的结果写入到输出文件
fin.close()
fout.close()
splitSentence('myInput.txt', 'myOutput.txt')
写完程序之后,在Linux重点输入:python test.py即可运行程序进行分词。
输入的文件内容如下所示:
经过结巴分词后,输出结果如下所示:
注意:第11行的 jieba.cut()返回的结构是一个可迭代的generator,可以用list(jieba.cut(...))转化为list
#! 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)
1 tf.contrib.learn.preprocessing.VocabularyProcessor (max_document_length, min_frequency=0, vocabulary=None, tokenizer_fn=None)
参数:
max_document_length: 文档的最大长度。如果文本的长度大于最大长度,那么它会被剪切,反之则用0填充。
min_frequency: 词频的最小值,出现次数小于最小词频则不会被收录到词表中。
vocabulary: CategoricalVocabulary 对象。
tokenizer_fn:分词函数
代码:
from tensorflow.contrib import learn
import numpy as np
max_document_length = 4
x_text =[
'i love you',
'me too'
]
vocab_processor = learn.preprocessing.VocabularyProcessor(max_document_length)
vocab_processor.fit(x_text)
print next(vocab_processor.transform(['i me too'])).tolist()
x = np.array(list(vocab_processor.fit_transform(x_text)))
print x
[1, 4, 5, 0]
[[1 2 3 0]
[4 5 0 0]]
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)
jieba是一个在中文自然语言处理中用的最多的工具包之一,它以分词起家,目前已经能够实现包括分词、词性标注以及命名实体识别等多种功能。既然Jieba是以分词起家,我们自然要首先学习Jieba的中文分词功能。Jieba提供了三种分词模式:
在jieba分词中,最常用的分词函数有两个,分别是 cut 和 cut_for_search ,分别对应于“精确模式/全模式”和“搜索引擎模式”。
当然,两者的输入参数也不一样,cut函数的输入主要有三个,分别是:
cut_for_search 函数主要有两个参数:
需要注意的是, cut 和 cut_for_search 返回的都是generator,如果想直接返回列表,需要使用 lcut 和 lcut_for_search
如果在一些特定场景中,需要使用一些特殊词汇进行分词,就需要加载自定义的分词词典:
其中,用户字典的格式为:
每一行表示一个单词,每行最多由三部分组成
如果只是少量词汇,可以使用
需要注意的是,如果没有给出词频和词性信息,在后续的处理中可能会造成一定的影响。
jieba提供了两种关键词提取算法,分别是TF-IDF以及TextRank
关于TF-IDF的原理,可以参考吴军老师的《数学之美》,里面给出了很详细的说明。本文只介绍利用TF-IDF算法提取关键词。
其中:
TextRank的用法与extract_tags的函数定义完全一致
词性标注主要是在分词的基础上,对词的词性进行判别,在jieba中可以使用如下方式进行:
在jieba中采用将目标文档按行分割,对每一行采用一个Python进程进行分词处理,然后将结果归并到一起(有点类似于MapReduce)。据说目前尚不支持Windows,仅支持Linux和MacOS。
启动并行分词使用如下命令:
关闭并行分词使用如下命令:
使用tokenize函数后,会获得一个词语信息的元组,元组中的第一个元素是分词得到的结果,第二个元素是词的起始位置,第三个元素是词的终止位置。
除了本文介绍的jieba分词工具包以外,还有很多好用的中文分词工具,比如