Twitter文本勘探-惊悚片《寂静之地》

《寂静之地》(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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353