gensimNltknltk

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

2017-05-08  本文已影响5360人  Hellooooooworld

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

有人说汉语难学难懂,那么对中文文本的分析也就相对于英文文本来说,更加困难!
在学习的过程中,我最先接触的是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 简单总结

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

上一篇下一篇

猜你喜欢

热点阅读