结巴分词和NLTK----一套中文文本分析的组合拳

汉语是世界上最难学的语言!

有人说汉语难学难懂,那么对中文文本的分析也就相对于英文文本来说,更加困难!
在学习的过程中,我最先接触的是NLTK和jieba这两个python的自然语言包,前者,我主要是对分词后的数据进行分析;而后者,我主要用于对文章进行分词!

part.1 包的安装

pip install nltk
pip install jieba

一条文本分析的漫漫长路就此开始!

part.2 怎么使用

从这里开始,我根据着自己写的类来对这两个包进行一些简单的讲解。

2.1 引用
# coding=utf-8
# -*- coding: cp936 -*-
import jieba
import jieba.posseg as pseg
import codecs
import re
import os
import time
import string
from nltk.probability import FreqDist
open=codecs.open
2.2 自定义词典和停用词的引入

自定义词典是我们在分词的时候避免把我们需要的词组分成小词而导入的,而停用词,则是我们在分词过程中,将对我们分词过程中的干扰词排除在外的词典。

#jieba 分词可以将我们的自定义词典导入,格式 “词” “词性” “词频”
jieba.load_userdict('data/userdict.txt')

#定义一个keyword类
class keyword(object):
    def Chinese_Stopwords(self):          #导入停用词库
        stopword=[]
        cfp=open('data/stopWord.txt','r+','utf-8')   #停用词的txt文件
        for line in cfp:
            for word in line.split():
                stopword.append(word)
        cfp.close()
        return stopword
2.3 分词和挑选

先来讲讲分词,分词可以说是中文文章分析的第一步,中文不像英文,每个单词之间有空格隔开,我们首先需要对文章进行分词,也就是把长长的文本切割成单个的词,而后才能对这些词进行后续的操作。

    def Word_cut_list(self,word_str):
        #利用正则表达式去掉一些一些标点符号之类的符号。
        word_str = re.sub(r'\s+', ' ', word_str)  # trans 多空格 to空格
        word_str = re.sub(r'\n+', ' ', word_str)  # trans 换行 to空格
        word_str = re.sub(r'\t+', ' ', word_str)  # trans Tab to空格
        word_str = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——;!,”。《》,。:“?、~@#¥%……&*()1234567①②③④)]+".\
                          decode("utf8"), "".decode("utf8"), word_str)
  
        wordlist = list(jieba.cut(word_str))#jieba.cut  把字符串切割成词并添加至一个列表
        wordlist_N = []
        chinese_stopwords=self.Chinese_Stopwords()
        for word in wordlist:
            if word not in chinese_stopwords:#词语的清洗:去停用词
                if word != '\r\n'  and word!=' ' and word != '\u3000'.decode('unicode_escape') \
                        and word!='\xa0'.decode('unicode_escape'):#词语的清洗:去全角空格
                    wordlist_N.append(word)
        return wordlist_N

什么叫挑选呢?
其实在我们进行中文文本的分析时,不是每个词都有用的。那什么样的词就能表述出文章意思呢?
比如:名词!
那怎么把名词提取出来呢?👇👇👇👇👇

    def Word_pseg(self,word_str):  # 名词提取函数
        words = pseg.cut(word_str)
        word_list = []
        for wds in words:
            # 筛选自定义词典中的词,和各类名词,自定义词库的词在没设置词性的情况下默认为x词性,即词的flag词性为x
            if wds.flag == 'x' and wds.word != ' ' and wds.word != 'ns' \
                    or re.match(r'^n', wds.flag) != None \
                            and re.match(r'^nr', wds.flag) == None:
                word_list.append(wds.word)
        return word_list
2.4 排序和运行

先前,我们对分词和分词后的挑选进行了一定的分析了解,那么怎么把我们得到的这个此列表进行分析呢?简单的就是先统计词频,这样一分析,有词频,我们自然而然就想到了排序。

    def sort_item(self,item):#排序函数,正序排序
        vocab=[]
        for k,v in item:
            vocab.append((k,v))
        List=list(sorted(vocab,key=lambda v:v[1],reverse=1))
        return List

    def Run(self):
        Apage=open(self.filename,'r+','utf-8')
        Word=Apage.read()                       #先读取整篇文章
        Wordp=self.Word_pseg(Word)              #对整篇文章进行词性的挑选
        New_str=''.join(Wordp)
        Wordlist=self.Word_cut_list(New_str)    #对挑选后的文章进行分词
        Apage.close()
        return  Wordlist

    def __init__(self, filename):
        self.filename = filename

2.5 main函数的读取分析

看了那么多,我们还没用到nltk这个包,那么在这里,我们就要开始使用这个包了!
在这里我主要是对文件夹里的一些文件进行分析,然后对每篇文件的关键词进行统计了。也就是简单的词频统计排序,输出。
最初我的想法,我只输出前10个关键词,但是在我经过多次实验后,我觉得固定数目的关键词,对我们的研究很是偏颇,那么我就使用百分比来输出关键词。

if __name__=='__main__':
    b_path = 'data/all'
    a_path = 'data/Result'
    roots = os.listdir(b_path)
    alltime_s = time.time()
    for filename in roots:
        starttime = time.time()
        kw = keyword(b_path + '/' + filename)
        wl = kw.Run()
        fdist = FreqDist(wl)
        Sum = len(wl)
        pre = 0
        fn = open(a_path + '/' + filename, 'w+', 'utf-8')
        fn.write('sum:' + str(Sum) + '\r\n')
        for (s, n) in kw.sort_item(fdist.items()):
            fn.write(s + str(float(n) / Sum)+"      " +str(n)+ '\r\n')
            pre = pre + float(n) / Sum
            if pre > 0.5:
                fn.write(str(pre))
                fn.close()
                break
        endtime = time.time()
        print filename + '       完成时间:' + str(endtime - starttime)

    print "总用时:" + str(time.time() - alltime_s)

part.3 简单总结

在我们进行中文文本分析的路上,我目前做的只是冰山一角,只是简单地进行一些文本的分词统计,这还是只是个开始。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容