左手Python右手R —《白夜行》wordcloud

2019年2月1日 326点热度 0人点赞 0条评论

图片

作者:胡言  R语言中文社区专栏作者

知乎ID:

https://www.zhihu.com/people/hu-yan-81-25

前言

我的天空里没有太阳,总是黑夜,但并不暗,因为有东西代替了太阳。虽然没有太阳那么明亮,但对我来说已经足够。凭借着这份光,我便能把黑夜当成白天。你明白吗?我从来就没有太阳,所以不怕失去。”

每每读完一本东野圭吾的书,我都要感慨一次:《白夜行》真是太好看了!

本文利用R和python分别对该书做分词并画词云,为今后更深一层的文本分析打基础。


一、R语言wordcloud

R语言最常用的分词包为jiebaR和Rwordseg,jiebaR分词对名称识别更有优势,Rwordseg效率更高。安装包时需要为电脑安装java,安装过程较繁琐,请各位看官自行百度。

1library(rJava)
2library(Rwordseg)
3library(wordcloud2)

将《白夜行》小说txt版本读入R,查看wordbase有7851行:

1setwd('C:/Users/Administrator/Documents/GitHub/play_20180925_wordcloud_whitenight')
2wordbase<-read.csv("white_night.txt")
3dim(wordbase)

OutPut

1## [1] 7851 1

清除小说中的各种标点符号,这里用到类似正则表达式的gsub()函数:

1word_clean<-NULL
2word_clean$msg <- gsub(pattern = " ", replacement ="", wordbase[,1]) 
3word_clean$msg <- gsub("\t""", word_clean$msg) 
4word_clean$msg <- gsub(",""???", word_clean$msg)
5word_clean$msg <- gsub("~|'""", word_clean$msg)
6word_clean$msg <- gsub("\\\"""", word_clean$msg)
7#head(word_clean)


将清理后的文本进行分词,此处手动加入不希望被拆散的词“亮司”、“雪穗”,jieba包对人名的识别很厉害,在后文python部分我们可以看一下二者的对比:

1insertWords(c('亮司','雪穗'))
2seg_word<-segmentCN(as.character(word_clean))
3head(seg_word)


OutPut

1## [1] "c" "阿" "日本" "第一" "畅销书" "作家"

segmentCN()函数将文本拆成了单个的词汇。

将分词后的结果做频数统计:

1words=unlist(lapply(X=seg_word, FUN=segmentCN))
2word=lapply(X=seg_word, FUN=strsplit, " "
3v=table(unlist(word))
4v<-rev(sort(v))
5d<-data.frame(word=names(v),cnt=v)
6d=subset(d, nchar(as.character(d$word))>1)
7d[1:30,]


OutPut

 1## word cnt.Var1 cnt.Freq
2## 22 雪穗 雪穗 823
3## 23 没有 没有 806
4## 28 什么 什么 716
5## 49 知道 知道 483
6## 60 一个 一个 410
7## 66 一成 一成 369
8## 67 他们 他们 355
9## 72 这么 这么 341
10## 73 自己 自己 335
11## 74 因为 因为 332
12## 77 这个 这个 313


上述结果为部分截取,我们可以看到雪穗是小说中出现次数最多的词,而亮司却不在前10位。

但是出现次数最多的词汇里,“没有”、“什么”、“一个”等词没有任何意义,因为任何作品都会

用到这些最常用的词,所以我们下一步需要去掉停用词stopwords。

 1write.table(v,file="word_result2.txt")
2ssc=read.table("word_result2.txt",header=TRUE)
3class(ssc)
4ssc[1:10,]
5ssc=as.matrix(d)
6stopwords=read.table("wordclean_list.txt")
7class(stopwords)
8stopwords=as.vector(stopwords[,1])
9wordResult=removeWords(ssc,stopwords)
10#去
11kkk=which(wordResult[,2]=="")
12wordResult=wordResult[-kkk,][,2:3]
13wordResult[1:40,]

OutPut

 1## cnt.Var1 cnt.Freq
2## 22 "雪穗" "823" 
3## 90 "男子" "285" 
4## 118 "调查" "218" 
5## 121 "警察" "215" 
6## 122 "电话" "214" 
7## 123 "东西" "212" 
8## 131 "回答" "195" 
9## 132 "发现" "195" 
10## 137 "工作" "189" 
11## 149 "公司" "173" 
12## 155 "声音" "167"

去停用词后,出现频数很高的词汇,我们明显可以感到《白夜行》特有的严肃和悲凉的气息。

终于可以画词云了,

星星词云:

1write.table(wordResult,'white_night_cloud.txt')
2mydata<-read.table('white_night_cloud.txt')
3#mydata<-filter(mydata,mydata$cnt>=10)
4wordcloud2(mydata,size=1,fontFamily='宋体')

图片

可怜的亮司,存在感太低了

亮司与雪穗:

1write.table(wordResult,'white_night_cloud.txt')
2mydata<-read.table('white_night_cloud.txt')
3#mydata<-filter(mydata,mydata$cnt>=10)
4wordcloud2(mydata,size=4,fontFamily='楷体',figPath='boyandgirl.jpg')

图片

只想和你手牵着手再阳光下漫步

二、python---wordcloud

python同样可以画词云,用到jieba、wordcloud模块。

画词云的过程中需要用到ttf格式的字体,需要手动下载。

1from os import path
2from wordcloud import WordCloud, ImageColorGenerator
3import jieba
4import pandas as pd
5import numpy as np
6from scipy.misc import imread
7from PIL import Image

1

读取文本

用同样的文本,即《白夜行》小说的txt文件,

1txt=open('white_night.txt',encoding="gbk")
2line=txt.readlines()   #读取文字
3type(line)             #list无法完成jieba分词
4line=','.join(line)    #将list转化为str
5type(line)


2

构建停用词表

1stoplist=open('wordclean_list.txt',encoding="gbk")
2stopwords = [line.strip() for line in open('wordclean_list.txt''r',encoding="gbk").readlines()]
3#stopwords
={}.fromkeys([line.rstrip() for line in stoplist])    #字典
4for add in ['雪穗','桐原','笹垣','友彦','唐泽','秋吉','筱冢','今枝','典子','利子','一成','']:
5     stopwords.append(add)
6#stopwords=','.join(stopwords)   此处不需要转化为string

3

jieba分词

1word_list=jieba.cut(line,cut_all=False)
2#word_cut=','.join(word_list)
3word_cut=list(word_list)
4type(word_cut

4

画词云

 1cloud_mask = np.array(Image.open('/Users/huxugang/Github/boyandgirl.jpeg'))
2
3back_color = imread('/Users/huxugang/Github/boyandgirl.jpeg')
4image_colors = ImageColorGenerator(back_color)
5
6wd=WordCloud(font_path='/Users/huxugang/Github/wordcloud_whitenight/simhei.ttf',\
7             background_color='white',max_words=500,
8             max_font_size=30,
9             random_state=15,
10             width=1200,  # 图片的宽
11             height=400,  #图片的长
12             mask=cloud_mask)
13
14WD=wd.generate(word_cut)
15
16import matplotlib.pyplot as plt
17WD.to_file('whitenight.jpg')
18# 显示词云图片
19plt.figure(figsize=(10,10))
20plt.axis('off')  #去掉坐标轴
21plt.imshow(WD.recolor(color_func=image_colors))
22#plt.show()

图片

我从来就没有太阳,所以不怕失去。

比较R语言和python,个人感觉R语言的wordcloud更人性化一下,字体设置更方便,更漂亮。

python画的词云可以实现字体颜色向背景图片同化(R语言是否可以我尚不清楚,有机会再研究),字体设置不太方便。两种工具我都将继续学习,做更多更有趣的实践。

愿世间没有伤害,愿天底下的雪穗和亮司都能无忧无虑地成长,快乐幸福地度过一生。

图片


往期精彩:


图片

公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战
回复 Python       1小时破冰入门
回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习     机器学习的商业应用
回复 数据科学     数据科学实战
回复 常用算法     常用数据挖掘算法

给我【好看】

你也越好看!

图片
71600左手Python右手R —《白夜行》wordcloud

这个人很懒,什么都没留下

文章评论