笔记来自课程:玩转文本挖掘(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
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生成的结果为频数字典,在和某些程序包对接时比较有用
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)
#显示词云
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()