1. jieba中文处理

1. jieba中文处理,第1张

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分词工具包以外,还有很多好用的中文分词工具,比如

点击window->Preference->PyDev->Eidtor->interpreter-Python选择下面的Libraries,选择New Folder,将结巴的安装目录加入即可

在Linux下使用easy_install一般安装在/usr/local/lib/Python2.7/dist-packages/jieba-0.31-py2.7.egg点击确定就可以在Eclipse中使用了,enjoying it!

把语料从数据库提取出来以后就要进行分词啦,我是在linux环境下做的,先把jieba安装好,然后找到内容是build jieba PKG-INFO setup.py test的那个文件夹(我这边是jieba-0.38),把自己的自定义词典(选用,目的是为了分出原始词库中没有的词以及优先分出一些词),停用词词典(选用),需要分词的语料文件,调用jieba的python程序都放到这个文件夹里,就可以用啦。至于词典要什么样的格式,在网上一查就可以了。

之前有看到别的例子用自定义词典替换掉jieba本身词典,但是我试了一下好像效果不行,假设原始词典中有’云‘,’计算‘而没有’云计算‘,我想要分出’云计算‘这个词,加载自定义词典可以成功,但替换原始词典就不一定成功了。(当然我说的也不一定对)

还有停用词词典,我之前是把停用词在程序里存入一个列表,然后分每个词时都循环一遍列表,这样特别浪费时间。后来把停用词做成字典就很快了。

for eachline in fin可避免memory error。如果还是报memory error,那应该就是输入语料文件单行数据多长了。

#!/usr/bin/python  #-*- encoding:utf-8 -*-  import jieba                                           #导入jieba模块import re

jieba.load_userdict("newdict.txt")                     #加载自定义词典  import jieba.posseg as pseg

def splitSentence(inputFile, outputFile):    #把停用词做成字典

stopwords = {}

fstop = open('stop_words.txt', 'r')    for eachWord in fstop:

stopwords[eachWord.strip().decode('utf-8', 'ignore')] = eachWord.strip().decode('utf-8', 'ignore')

fstop.close()

fin = open(inputFile, 'r')                                  #以读的方式打开文件

fout = open(outputFile, 'w')                                #以写得方式打开文件

jieba.enable_parallel(4)                                    #并行分词

for eachLine in fin:

line = eachLine.strip().decode('utf-8', 'ignore')       #去除每行首尾可能出现的空格,并转为Unicode进行处理

line1 = re.sub("[0-9\s+\.\!\/_,$%^*()?;:-【】+\"\']+|[+——!,:。?、~@#¥%……&*()]+".decode("utf8"), "".decode("utf8"),line)

wordList = list(jieba.cut(line1))                        #用结巴分词,对每行内容进行分词

outStr = ''

for word in wordList:            if word not in stopwords:

outStr += word

outStr += ' '

fout.write(outStr.strip().encode('utf-8') + '\n')       #将分词好的结果写入到输出文件    fin.close()

fout.close()

splitSentence('ss.txt', 'tt.txt')


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7108670.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-01
下一篇 2023-04-01

发表评论

登录后才能评论

评论列表(0条)

保存