1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 左手Python右手R —《白夜行》wordcloud

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

时间:2020-03-23 10:29:45

相关推荐

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

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

知乎ID:

/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_0925_wordcloud_whitenight')

2wordbase<-read.csv("white_night.txt")

3dim(wordbase)

OutPut

1##[1]78511

清除小说中的各种标点符号,这里用到类似正则表达式的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##wordcnt.Var1cnt.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.Var1cnt.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格式的字体,需要手动下载。

1fromosimportpath

2fromwordcloudimportWordCloud,ImageColorGenerator

3importjieba

4importpandasaspd

5importnumpyasnp

6fromscipy.miscimportimread

7fromPILimportImage

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()forlineinopen('wordclean_list.txt','r',encoding="gbk").readlines()]

3#stopwords={}.fromkeys([line.rstrip()forlineinstoplist])#字典

4foraddin['雪穗','桐原','笹垣','友彦','唐泽','秋吉','筱冢','今枝','典子','利子','一成','']:

5stopwords.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',\

7background_color='white',max_words=500,

8max_font_size=30,

9random_state=15,

10width=1200,#图片的宽

11height=400,#图片的长

12mask=cloud_mask)

13

14WD=wd.generate(word_cut)

15

16importmatplotlib.pyplotasplt

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语言是否可以我尚不清楚,有机会再研究),字体设置不太方便。两种工具我都将继续学习,做更多更有趣的实践。

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

往期精彩:

R语言决策树:NBA球员如何拿到大合同

R语言轻巧的时间包hms

R语言中文社区终文章整理(作者篇)

R语言中文社区终文章整理(类型篇)

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

回复爬虫爬虫三大案例实战

回复Python1小时破冰入门

回复数据挖掘R语言入门及数据挖掘

回复人工智能三个月入门人工智能

回复数据分析师数据分析师成长之路

回复机器学习机器学习的商业应用

回复数据科学数据科学实战

回复常用算法 常用数据挖掘算法

给我【好看】

你也越好看!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。