作者:鲁伟
一个数据科学践行者的学习日记。数据挖掘与机器学习,R与Python,理论与实践并行。个人公众号:数据科学家养成记 (微信ID:louwill12)
虽然现在NLP(自然语言处理)技术那么发达,但作为一个有志于在数据科学领域内搞出点动静的年轻人来说,用R来做一点文本挖掘还各种出错,各种困难不断,确实是有点说不过去。前两天看到R语言中文社区分享的一个关于jiebaR包分词工具的文章,于是也想尝个鲜,便琢磨着搞个东西给大家看看。在CSDN和知乎上看到有大神拿《笑傲江湖》、《全唐诗》之类的小说和古籍来分析,想着我就用周杰伦的13张专辑的歌词来简单地做个分词和文本分析吧。
虽然是听了十几年的周杰伦,各种周氏情歌和中国风也算信手拈来,但昨天把13张专辑和十几首单曲的歌词整理成规范的txt文档也着实花了不少时间,这篇文章没做多少深度的分析,只是用杰伦的歌词基于jiebaR包做了简单的分词并用wordcloud2包做了几个词云图,在NLP和文本挖掘领域目前了解不多,但还是胡适那句话:“怕什么真理无穷尽,有一寸得一寸的欢喜!”
5分钟上手jiebaR
jiebaR是一款灵活高效的中文分词包,底层用的是C++,所以有C语言基础的同学用Rcpp包来调用可能会更方便。
jiebaR包的安装:
install.packages("jiebaR")
library(jiebaR)
先看一个例子直接上手jiebaR:
wk = worker()
wk["天青色等烟雨,而我在等你"]
[1] "天" "青色" "等" "烟雨" "而" "我" "在" "等" "你"
wk["亲爱的爱上你从那天起甜蜜的很轻易"]
[1] "亲爱" "的" "爱上你" "从" "那天" "起" "甜蜜" "的"
[9] "很" "轻易"
也可以使用segment函数进行分词:
segment( "故事的小黄花,从出生那天就飘着",wk)
[1] "故事" "的" "小黄花" "从" "出生" "那天" "就" "飘"
[9] "着"
以上就是jiebaR包进行分词的基本用法啦,想了解其背后的自定义操作符、项目源代码、分词引擎以及配置词典等内容的同学可以去github上稍微搜寻一下即可。
基于jiebaR的周杰伦歌词文本分析
原本以为歌词整理起来很容易,没想到着实被坑了一把。费了好大劲把全部13张专辑和单曲的歌词整理到txt中,读取的时候又各种乱码,调试了多次才得以继续做下去。
歌词准备完毕,那就开始写jiebaR分词吧。
导入jiebaR和wordcloud2包:
library(jiebaR)
library(wordcloud2)
读取歌词文档:
jc<-scan("D:/Rdata/datasets/Jaychou.txt",sep="\n",what="",encoding="UTF-8")
注意sep和encoding这两个参数,很容易出现乱码,稍加注意即可。
查看表头检查下,第一首是《可爱女人》哈:
head(jc)
[1] "《JAY》\n《可爱女人》\n想要有直升机 想要和你飞到宇宙去\n想要和你融化在一起 融化在银河里"
[2] "我每天每天每天在想想想想着你\n这样的甜蜜 让我开始相信命运\n感谢地心引力 让我碰到你\n漂亮的让我面红的可爱女人"
[3] "温柔的让我心疼的可爱女人"
[4] "透明的让我感动的可爱女人"
[5] "坏坏的让我疯狂的可爱女人"
[6] "世界这样大而我而我只是只小小小的蚂蚁\n但我要尽全力全力全力保护你\n《完美主义》\n如果说怀疑 可以造句 如果说分离 能够翻译"
配置参数,对文本进行分词:
先看《可爱女人》的分词效果:
mixseg<-worker()
segment(head(jc),mixseg)
[1] "JAY" "可爱" "女人" "想要" "有" "直升机"
[7] "想要" "和" "你" "飞到" "宇宙" "去"
[13] "想要" "和" "你" "融化" "在" "一起"
[19] "融化" "在" "银河" "里" "我" "每天"
[25] "每天" "每天" "在" "想想" "想想" "着"
[31] "你" "这样" "的" "甜蜜" "让" "我"
[37] "开始" "相信" "命运" "感谢" "地心引力" "让"
[43] "我" "碰到" "你" "漂亮" "的" "让"
[49] "我" "面红" "的" "可爱" "女人" "温柔"
[55] "的" "让" "我" "心疼" "的" "可爱"
[61] "女人" "透明" "的" "让" "我" "感动"
[67] "的" "可爱" "女人" "坏坏" "的" "让"
[73] "我" "疯狂" "的" "可爱" "女人" "世界"
[79] "这样" "大而" "我" "而" "我" "只是"
[85] "只" "小" "小小的" "蚂蚁" "但" "我"
[91] "要" "尽全力" "全力" "全力" "保护" "你"
[97] "完美主义" "如果说" "怀疑" "可以" "造句" "如果说"[103] "分离" "能够" "翻译"
对全文进行分词:
jc2<-segment(jc,mixseg)
length(jc2)#查看分词后的向量长度
[1] 35252
查看jc2的前50的词频统计:
sort(table(jc2),decreasing=T)[1:50]
在不做筛选的情况下jc2的词频统计结果都是常见的单个字,并无多少参考意义,因此我们对jc2进行筛选。
筛选字符串长度介于2-6的词并进行前50的词频统计:
jc3<-jc2[nchar(jc2)>1 & nchar(jc2)<7]
sort(table(jc3),decreasing=T)[1:50]
筛选字符串长度介于3-7的词并进行前50的词频统计:
jc4<-jc2[nchar(jc2)>2 & nchar(jc2)<8]
sort(table(jc4),decreasing=T)[1:50]
hey What 为什么 come Jay 看不见 冰淇淋 you 土耳其 轻轻地 是不是
59 34 26 23 21 20 17 16 16 14 14
Girl 干什么 美人鱼 周杰伦 我爱你 来不及 Now Repeat see 舍不得 aMEI
12 12 12 12 11 10
(贴出的一点词频统计结果比较乱,凑合着看下)
wordFreq100=sort(table(jc4),decreasing=T)[1:100]
wordFreq100
wordcloud2(wordFreq100,size = 1,shape = 'pentagon')
可以看出我伦对于土耳其冰淇淋是真爱哈哈,还动不动就关灯什么的。个别能上次词频统计的都是某一首歌的原因,比如说在《公公偏头痛》这首歌里面“公公他偏头痛”就重复了n次,直接导入“偏头痛”三个字上榜。至于两个词和四个词的词频和词云图在这里就省略不放了,有兴趣的同学或者是喜欢周杰伦歌的同学可以自己去试下代码哈。
最后简单看个杰伦的季节爱好:
table(jc3)["春天"]
春天
2
table(jc3)["夏天"]
夏天
9
table(jc3)["秋天"]
秋天
10
table(jc3)["冬天"]
冬天
14
四季分明,我伦对秋天和夏天那是真爱,毕竟我伦主打忧郁冬日风。
小结
限于篇幅,关于jiebaR包的其他用法和更深入的讨论就有待各位同学自己去探索啦,这里仅仅是把我前几天的一个想法简单的实现了下,但也没有做更深入的分析,关于NLP 和R语言文本挖掘,我们都还有很长的一段路要走。
微信回复关键字即可学习
回复 R R语言快速入门免费视频 回复 统计 统计方法及其在R中的实现回复 用户画像 民生银行客户画像搭建与应用 回复 大数据 大数据系列免费视频教程回复 可视化 利用R语言做数据可视化回复 数据挖掘 数据挖掘算法原理解释与应用回复 机器学习 R&Python机器学习入门