文本分析4-词频统计与词云展示

笔记来自课程:玩转文本挖掘(51ct0学院),总结整理为个人学习、复习使用,供参考。


在这里插入图片描述

对小说第一章进行分词

首先重复之前的操作,读文本数据–章节标识–选取第一章–分词

读取并选取第一章

import pandas as pd
import jieba
import os
#os.chdir(r'')
import warnings
warnings.filterwarnings('ignore')
#读取文章时是一小段一小段读取的
raw=pd.read_table('金庸-射雕英雄传txt精校版.txt',names=['txt'],encoding='GBK')

#定标准
def m_head(tmpstr):
    return tmpstr[:1]
def m_mid(tmpstr):
    return tmpstr.find('回 ')
raw['head']=raw.txt.apply(m_head)
raw['mid']=raw.txt.apply(m_mid)
raw['len']=raw.txt.apply(len)

#添加章节编号
chapnum=0
for i in range(len(raw)):
    if raw['head'][i]=='第' and raw['mid'][i] >0 and raw['len'][i] < 30: #添加章节编号
        chapnum += 1
    if chapnum >= 40 and raw['txt'][i]=='附录一:成吉思汗家族': #去掉附录
        chapnum=0
    raw.loc[i,'chap']=chapnum  #添加编号一列

del raw['head']
del raw['mid']
del raw['len']

#合并一个章节为一个段落
rawgrp=raw.groupby('chap')
chapter=rawgrp.agg(sum)

在这里插入图片描述

对第一章分词

import re
param=u'[0-9’:;!"#$%&\'()*+,-./:;<=>?@,。?★、…【】《》?“”‘’![\\]^_`{|}~]+'
chapter_txt=re.sub(param,'',chapter.txt[1])

#导入分词词表
dict='金庸小说词库.txt'
jieba.load_userdict(dict)

#导入停用词表
stop=pd.read_csv('停用词.txt',names=['w'],sep='aaa',
                encoding='utf-8')

开始分词:

word_list=jieba.lcut(chapter_txt)
word_list=[word for word in word_list 
           if word !='\u3000' 
           and word not in list(stop.w)
           and len(word)>1]

print(len(word_list))
word_list[:10]

在这里插入图片描述

词频-自行编写程序

可以自行编写词频统计程序,框架为:

遍历整个list

#字典形式
word_freq={
    
    }
for key in word_list:
    if len(key)>1:
        word_freq[key]=word_freq.get(key,0)+1

print(len(word_freq))
#3896
#使用count函数
word_set=set(word_list)
word_freq=[]
for i in range(0,len(word_set)):
    if len(list(word_set)[i])>1:
        word=list(word_set)[i]
        freq=word_list.count(list(word_set)[i])
        word_freq.append((word,freq))
print(len(word_freq))
#3896

词频-使用pandas统计

df=pd.DataFrame(word_list,columns=['word'])

result=df.groupby(['word']).size() #统计分组后样本量
print(type(result))

freqlist=result.sort_values(ascending=False)
pd.DataFrame(freqlist).head(2)

在这里插入图片描述

词频-使用NLTK统计

NLTK生成的结果为频数字典,在和某些程序包对接时比较有用

import nltk
word_list[:10]

[‘第一回’, ‘风雪’, ‘惊变’, ‘钱塘江’, ‘浩浩’, ‘江水’, ‘日日夜夜’, ‘无穷’, ‘无休’, ‘浙西’]

fdist=nltk.FreqDist(word_list)
fdist

FreqDist({‘杨铁心’: 148, ‘包惜弱’: 114, ‘郭啸天’: 67, ‘官兵’: 45, ‘武官’: 42, ‘丘处机’: 36, ‘说道’: 35, ‘颜烈’: 35, ‘曲三’: 33, ‘一个’: 32, …})在这里插入图片描述
列出高频词:
在这里插入图片描述

词云展示

class wordcloud.WordCloud(

常用功能:
    font_path : 在图形中使用的字体,默认使用系统字体 
    width / height = 200 : 图形的宽度/高度
    max_words = 200 : 需要绘制的最多词条数
    stopwords = None : 停用词列表,不指定时会使用系统默认停用词列表(仅对英文有效)

字体设定:
    min_font_size = 4 /  max_font_size = None : 字符大小范围
    font_step = 1 : 字号增加的步长(比如是1增到2,还是1增到3)
    relative_scaling = .5: 词条频数比例和字号大小比例的换算关系,默认为50%(防止词频比较高的词与词频比较低的词,大小过于悬殊)
    prefer_horizontal = 0.90 : 图中词条水平显示的比例

颜色设定:    
    background_color = ”black” : 图形背景色
    mode = ”RGB”: 图形颜色编码,如果指定为"RGBA"且背景色为None时,背景色为透明
    color_func = None : 生成新颜色的函数,使用matplotlib的colormap

背景掩模:
    mask = None : 词云使用的背景图(遮罩)
)

原始文本直接绘制

WordCloud().generate(text)

这里generate实际上是generate_from_text的别名

文本需要用空格/标点符号分隔,否则不能正确分词

word_list=jieba.lcut(chapter_txt)
word_list=[word for word in word_list 
           if word !='\u3000' 
           and word not in list(stop.w)
           and len(word)>1]
import wordcloud
myfont=r'C:\Windows\Fonts\simkai.ttf'
#这里不适合中文,因为中文是没有空格分隔的
text=' '.join(word_list)
word_cl=wordcloud.WordCloud(font_path=myfont,
                               #添加参数
                               width=360,height=180,
                               mode='RGBA',
                               background_color=None).generate(text)
print(word_cl)

<wordcloud.wordcloud.WordCloud object at 0x000000001C6D4EC8>

#显示词云
import matplotlib.pyplot as plt

%matplotlib inline
plt.imshow(word_cl)
plt.axis('off') #不显示坐标轴
plt.show()

#保存图片
#text_split.to_file('词云.png')

在这里插入图片描述

基于分词频数绘制

generate( ) 的实际操作:

1.调用分词函数process_text(); 2. 调用基于频数的绘制函数fit_words( )

fit_words(dict)

实际上是generate_from_frequencies的别名

Dict:由词条和频数构成的字典

#使用上面统计频数的字典形式(或nltk形式的)
word_freq={
    
    }
for key in word_list:
    if len(key)>1:
        word_freq[key]=word_freq.get(key,0)+1
word_cl=wordcloud.WordCloud(font_path=myfont,
                           mode='RGBA',background_color=None).fit_words(word_freq)

plt.imshow(word_cl)
plt.axis('off')
plt.show()

在这里插入图片描述

词云美化

官网案例:https://amueller.github.io/word_cloud/

设置背景图片

Mask/掩模/遮罩

用于控制词云形状,指定mask后,设置的宽高值将被忽略,遮罩形状被指定图形的形状取代。除全白的部分仍然保留外,其余部分会用于绘制词云。因此背景图片的画布一定要设置为白色(#FFFFFF).

字的大小,布局和颜色也会基于Mask生成,必要时可调整颜色增强效果

调用方式:

from scipy.misc import imread

mask=imread(背景图片名称)

#from scipy.misc import imread  #报错,直接使用imageio包
from scipy import misc
import imageio #也能实现

在这里插入图片描述

word_cl=wordcloud.WordCloud(font_path=myfont,
                           mask=imageio.imread('射雕背景0.jpg'),
                           mode='RGBA',background_color=None).fit_words(word_freq)
plt.imshow(word_cl)
plt.axis('off')
plt.show()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43165880/article/details/108046036