Python 红楼梦的字频与词频统计

Python 红楼梦的字频与词频统计

  • 使用jieba分词工具分词,在网上下载了一个停用词表(包括标点符号)去除停用词。
  • 使用wordcloud生成词云。
  • 其实除了停用词,程度词与否定词等也应该去除,但没有找到合适的词表。

字频:

字符 字频

了 13993
的 9862
不 9439
一 8160
道 7271
来 7189
人 6626
我 6204
是 6145
说 6108
这 5204
他 5193
你 5004
儿 4756
着 4105
去 4006
个 3983
也 3933
子 3896
玉 3877
有 3738
宝 3733
又 3677
们 3321
笑 3285
里 3084
贾 3005
只 2962
那 2932
见 2930
上 2594
好 2555
姐 2504
太 2466
家 2447
在 2401
就 2368
么 2363
便 2247
大 2219
头 2149
日 2113
听 2054
出 2051
得 2019
老 1994
下 1945
要 1866
都 1844
回 1800
知 1762
二 1755
两 1660
过 1635
还 1618
事 1580
自 1536
如 1536
话 1516
心 1502
小 1491
起 1483
看 1473
没 1448
因 1440
母 1425
凤 1407
忙 1400
之 1382
呢 1370
叫 1366
今 1353
面 1350
时 1344
些 1308
娘 1300
可 1292
等 1259
问 1242
奶 1195
什 1175
到 1165
才 1158
中 1135
吃 1123
和 1118
罢 1075
此 1034
打 1023
想 1008
夫 992
倒 989
正 950
别 949
给 937
黛 931
进 927
几 913

词频:

DataFrame就不贴在这了

前80回:

后40回:

# 如果您需要使用此代码,os.chdir路经需要指定到txt文本所在路径
# 使用Zipin函数,需要txt有read()函数可以打开的正确的编码格式
# 使用Cipin函数需要安装jieba库
# 使用word cloud函数需要安装wordcloud与matplotlib库
import os
import codecs
import jieba
import pandas as pd
from wordcloud import WordCloud
from scipy.misc import imread
import matplotlib.pyplot as plt
os.chdir("/Users/Zhaohaibo/Desktop")

class Hlm(object): 

    # —————————————————————
    # Zipin(self, readdoc, writedoc)
    # readdoc: 要读取的文件名
    # writedoc:要写入的文件名

    # output
    # 字频前100,并写入writedoc
    # —————————————————————
    def Zipin(self, readdoc, writedoc):
        word_lst = []
        word_dict = {}       
        exclude_str = ",。!?、()【】<>《》=:+-*—“”…" 
        with open(readdoc,"r") as fileIn ,open(writedoc,'w') as fileOut:

            # 添加每一个字到列表中
            for line in fileIn:
                for char in line:
                    word_lst.append(char)

            # 用字典统计每个字出现的个数       
            for char in word_lst:
                if char not in exclude_str:
                    if char.strip() not in word_dict: # strip去除各种空白
                        word_dict[char] = 1
                    else :
                        word_dict[char] += 1

            # 排序x[1]是按字频排序,x[0]则是按字排序
            lstWords = sorted(word_dict.items(), key=lambda x:x[1],  reverse=True) 

            # 输出结果 (前100)
            print ('字符\t字频')
            print ('=============')
            for e in lstWords[:100]:
                print ('%s\t%d' % e)
                fileOut.write('%s, %d\n' % e)


    # —————————————————————
    # Cipin(self, doc)
    # doc: 要读取的文件名

    # return:
    # 词频表(DataFrame格式)
    # —————————————————————
    def Cipin(self, doc):
        wdict = {}
        f = open(doc,"r")
        for line in f.readlines():
            words = jieba.cut(line)
            for w in words:
                if(w not in wdict):
                    wdict[w] = 1
                else:
                    wdict[w] += 1                
        # 导入停用词表
        stop = pd.read_csv('stoplist.txt', encoding = 'utf-8', sep = 'zhao', header = None,engine = 'python') #sep:分割符号(需要用一个确定不会出现在停用词表中的单词)
        stop.columns = ['word']    
        stop = [' '] + list(stop.word) #python读取时不会读取到空格。但空格依旧需要去除。所以加上空格; 读取后的stop是series的结构,需要转成列表
        for i in range(len(stop)):
            if(stop[i] in wdict):
                wdict.pop(stop[i])

        ind = list(wdict.keys())
        val = list(wdict.values())
        ind = pd.Series(ind)
        val = pd.Series(val)
        data =  pd.DataFrame()
        data['词'] = ind
        data['词频'] = val
        return data

    # —————————————————————
    # Ciyun(self, doc)
    # doc: 要读取的文件名

    # output: 
    # 词云图
    # —————————————————————
    def Ciyun(self,doc):
        g = open(doc,"r").read()
        back_pic = imread("aixin.jpg")  # 设置背景图片  
        wc = WordCloud( font_path='/System/Library/Fonts/STHeiti Medium.ttc',#设置字体  
                          background_color="white", #背景颜色  
                          max_words=2000,# 词云显示的最大词数  
                          mask=back_pic,#设置背景图片  
                          max_font_size=200, #字体最大值  
                          random_state=42,  
                         ).generate(g)   
        plt.figure(figsize=(64,32))
        plt.imshow(wc)
        plt.axis('off')
        plt.savefig("ciyun.jpg")
        plt.show()


    def main(self,readdoc):
        # self.Zipin(readdoc,writedoc)
        df = self.Cipin(readdoc)
        #self.Ciyun(readdoc)
        return df


if __name__ == '__main__':
    hlm = Hlm()
    hlm.Zipin("红楼梦.txt","红楼梦字频.txt")
    df_hlm1 = hlm.main("红楼梦.txt")

你可能感兴趣的:(自然语言处理)