《寂静之地》(A Quiet Place) 在北美上映后即问鼎首周末票房冠军,烂番茄上新鲜度达到97%。博主观影时也是全程屏住呼吸,对疼痛与恐惧感同身受。虽然几处有逻辑硬伤,音效有时强行吓人,但情节设定和和背景乐仍十分吸引人,在影院真实地被氛围所感染,刺激而有力量。国内5月18号即将上映,推荐大家去电影院一起体验爆米花都要含着吃是一种怎样的体验。
好奇在twitter(相当于国内微博/川普的最爱)上看完这部电影发表的感受,于是用R语言的文本挖掘来展示被提到频率最高的词。
一、函数调用、数据导入、生成语料库
>install.packages("wordcloud") # 创建词云
>install.packages("tm") # 建立语料库、创建文档-词频矩阵、去噪
>install.packages("SnowballC") # 英文分词包,可实现提取词干 ;中文分词包为”Rwordseg"
>install.packages("twitteR") # 连接到推特
从推特提取文本前,需要有个人账号和建立应用程序接口(Application Programming Interface, API)以便直接控制推特。***之前做http网页一直提取不到google map的数据,就是没用到API。***
建立个人账号后可通过https://apps.twitter.com/找到自己的consumerkey和consumerSecret,然后填入下方指令 (注意前后中间都不要有空格,否则R提取不到)。
>consumer_key <- ''
>consumer_secret <- ''
>access_token <- ''
>access_secret <- ''
>setup_twitter_oauth(consumer_key, # 建立与推特的链接
consumer_secret,
access_token,
access_secret)
>tweet_full<- searchTwitter("#AQuietPlace", n=2000,lang="en") #获取两千条含电影名字的推特,注意关键词中间无空格
>tweet_no_rt<-strip_retweets(tweet_full) #删除转推后200条还剩下645条
>tweet_text <- sapply(tweet_no_rt, function(x) x$getText()) #储存文本
>tweet_text_corpus <- Corpus(VectorSource(tweet_text))
*************************************************
tm包提供五种资源读取的方式:
DataframeSource 数据库,类似csv文件
DirSource 处理目录
VectorSource 由文挡构成的向量
URISource 统一资源标识
XMLSource 可拓展标记语言
Corpus
tm中主要的管理文件的结构被称为语料库(Corpus),代表了一系列的文档集合。
动态语料库(Volatile Corpus, R内部保存):Corpus(x,readerControl=list(reader=,language)
静态语料库(Permanent Corpus, R外部保存):PCorpus(x,readerControl=list(reader=,language=), dbControl=list(dbName=“”,dbType=“DB1"))
Corpus()的结果是建立一个类似于matrix的Corpus集合,一个文件名对应一个文档内容。
*************************************************
>inspect(tweet_text_corpus) #inspect可输出语料库的内容
二、格式转化、去噪
接下来清理一下文本。主要使用tm包中的tm_map(),这个函数可以通过maps方式将转化函数实施到每一个语料上。
>tweet_text_corpus <- tm_map(tweet_text_corpus, content_transformer(gsub), pattern="\\W",replace=" ") #删除 emoji (windows系统)
>tweet_text_corpus <- tm_map(tweet_text_corpus, content_transformer(tolower)) # 转换为小写
>tweet_text_corpus <- tm_map(tweet_text_corpus, removePunctuation) #删除标点符号
>tweet_text_corpus <- tm_map(tweet_text_corpus, removeNumbers) #删除数字
>tweet_text_corpus <- tm_map(tweet_text_corpus, removeWords,stopwords("english")) #去停用词
>tweet_text_corpus <- tm_map(tweet_text_corpus, stripWhitespace)
>tweet_text_corpus <- tm_map(tweet_text_corpus, stemDocument)
三、创建词云、词频矩阵
>wordcloud(tweet_text_corpus, min.freq=5, colors=brewer.pal(7,"Dark2")) #min.freq为显示的最小词频
>inspect(tweet_text_corpus)
>myDtm <- DocumentTermMatrix(tweet_text_corpus, control = list(minWordLength = 1)) # 将处理后的语料库进行段子处理,生成词汇文档矩阵(词频权重矩阵)
>dim(myDtm)
>inspect(myDtm[20:25,85:90]) #想看DTM内容,还需使用inspect()函数
>freq<-rowSums(as.matrix(myDtm))
>ord<-order(freq,decreasing=TRUE)
>freq[head(ord)]
>findFreqTerms(myDtm, lowfreq=10) # 显示语料库中最常出现的词
四、TF-IDF和隐含语义检索
>tfidf<-weightTfIdf(myDtm)
> inspect(tfidf)
*************************************************
TF-IDF(Term Frequency - Inverse Document Frequency)是一种加权统计方法,常用于文字勘探用来评估单词对于文件的集合或词库中一份文件的重要程度。
1.计算TF(Term Frequency):假设j是【某一特定文件】,i是该文件中所使用的单词或单字, n(i,j)就是i在j当中的出现次数:
tf值越高,单词越重要。
2. 计算IDF(Inverse Document Frequency) : 假设D是【所有的文件总数】,i是网页中使用的单词,t(i)是该单词在所有文件总数中出现的【文件数】:
单词出现的机会小,与出现机会大的单词比更重要。
3. 将tf(i,j)与idf(i)相乘,以某一特定文件内的高单词频率,呈上该单词在文件总数中的低文件频率,便可以产生TF-IDF权重值且倾向于过滤掉常见单词,保留重要单词。
*************************************************
>install.packages("lsa")
>library(lsa) # latent semantic analysis
>lsa.tfidf<-lsa(tfidf,dim=5)
>doc_vec<-as.data.frame(as.matrix(lsa.tfidf$dk))
>term_vec<-as.data.frame(as.matrix(lsa.tfidf$tk))
*************************************************
潜在语义分析即通过分析文章来挖掘文章的潜在语义,此处只提供R中代码,对LSA的具体解释可参考中文译版: https://blog.csdn.net/zhzhji440/article/details/47193731
*************************************************
五、结论
通过从推特提取600多条包含'A Quiet Place'的推特,清洗后做词云、词频矩阵等,可以看到大家多提到安静、电影院、惊悚、男女主角。男主角自导自演的此部影片,在北美口碑很好,还有两周时间在内地上映,推荐大家一定去电影院屏气凝神,体验出声就会死的紧张感。
https://cosx.org/2013/01/analysis-of-weibo/此篇文章介绍了R也可以链接微博获取资料,博主学习后计划之后用此工具探索更多有趣的问题。
参考资料:
Text Mining (Big Data, Unstructured Data)
http://www.statsoft.com/Textbook/Text-Mining
潜在语义分析
https://blog.csdn.net/zhzhji440/article/details/47193731
新浪微博文本分析初探
https://cosx.org/2013/01/analysis-of-weibo/
R语言文本挖掘tm包详解
https://www.jianshu.com/p/948eef869be3