2024年【R语言文本挖掘】:文本挖掘(以特朗普推文数据为例(1),2024年最新零基础学习大数据开发开发

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  1. ‘for’
  2. ‘a’
  3. ‘tweet’
  4. ‘endorsement’
  5. ‘when’
  6. ‘her’
  7. ‘book’
  8. ‘was’
  9. ‘launched’

默认的unnest_tokens会去除特殊符号,我们可以通过指定token,来保留这些符号

campaign_tweets[1,] %>% 
  unnest_tokens(word, text, token = "tweets") %>%
  pull(word)

  1. ‘why’
  2. ‘did’
  3. ‘@danaperino’
  4. ‘beg’
  5. ‘me’
  6. ‘for’
  7. ‘a’
  8. ‘tweet’
  9. ‘endorsement’
  10. ‘when’
  11. ‘her’
  12. ‘book’
  13. ‘was’
  14. ‘launched’

接下来我们要做的另一个小调整是删除图片链接,得到提取的word

links <- "https://t.co/[A-Za-z\\d]+|&amp;"
tweet_words <- campaign_tweets %>% 
  mutate(text = str_replace_all(text, links, ""))  %>%
  unnest_tokens(word, text, token = "tweets")

接下来我们来看一下哪些单词出现的次数最多

tweet_words %>% 
  count(word) %>%
  top_n(10, n) %>%
  mutate(word = reorder(word, n)) %>%
  arrange(desc(n))

A tibble: 10 × 2

wordn
the2329
to1410
and1239
in1185
i1143
a1112
you999
of982
is942
on874

不难理解这些词出现的次数最多。但是这些词没有提供信息。 tidytext包有这些常用词的数据库,称为停用词,在文本挖掘中:stop_words可以查看常见的停用词

head(stop_words)

A tibble: 6 × 2

wordlexicon
aSMArT
a’sSMArT
ableSMArT
aboutSMArT
aboveSMArT
accordingSMArT

接下来我们删选掉属于停用词的文本

tweet_words <- campaign_tweets %>% 
  mutate(text = str_replace_all(text, links, ""))  %>%
  unnest_tokens(word, text, token = "tweets") %>%
  filter(!word %in% stop_words$word ) 

tweet_words %>% 
  count(word) %>%
  top_n(10, n) %>%
  mutate(word = reorder(word, n)) %>%
  arrange(desc(n))

A tibble: 10 × 2

wordn
#trump2016414
hillary405
people303
#makeamericagreatagain294
america254
clinton237
poll217
crooked205
trump195
cruz159

可以看出这个时候出现最多的次数的word能给我们一些信息,但是我们还要进行一个正则删选掉一些特殊的标记

tweet_words <- campaign_tweets %>% 
  mutate(text = str_replace_all(text, links, ""))  %>%
  unnest_tokens(word, text, token = "tweets") %>%
  filter(!word %in% stop_words$word &
           !str_detect(word, "^\\d+$")) %>%
  mutate(word = str_replace(word, "^'", ""))

Using `to_lower = TrUE` with `token = 'tweets'` may not preserve UrLs.

现在我们已经将所有单词放在了一个表格中,以及有关用于撰写它们来自的推文的设备的信息,我们可以开始探索在将 Android 与 iPhone 进行比较时哪些单词更常见。

对于每个单词,我们想知道它更有可能来自 Android 推文还是 iPhone 推文。在这里我们使用优势比率指标来进行衡量。对于每个设备和一个给定的单词,我们称它为 y,我们计算 y 和非 y 单词比例之间的几率或比率,并计算这些几率的比率。这里我们将有许多比例为 0,因此我们使用0.5 校正,具体做法如下:

i

n

A

n

d

r

o

i

d

0.5

/

t

o

t

a

l

A

n

d

r

o

i

d

0.5

i

n

i

P

h

o

n

e

0.5

/

t

o

t

a

l

i

P

h

o

n

e

0.5

\frac{#in Android+0.5/totalAndroid+0.5}{ #in iPhone+0.5/totaliPhone+0.5}

#iniPhone+0.5/totaliPhone+0.5#inAndroid+0.5/totalAndroid+0.5​

android_iphone_or <- tweet_words %>%
  count(word, source) %>%
  pivot_wider(names_from = "source", values_from = "n", values_fill = 0) %>%#将长数据转换为宽数据
  mutate(or = (Android + 0.5) / (sum(Android) + 0.5) / 
           ( (iPhone + 0.5) / (sum(iPhone) + 0.5)))

因此,or值越大,证明出现在android中的频率越大

以下是 Android 的最大优势比率

android_iphone_or %>% arrange(desc(or))%>%head()

A tibble: 6 × 4

wordiPhoneAndroidor
poor01323.08133
poorly01221.37160
turnberry01119.66188
@cbsnews01017.95215
angry01017.95215
bosses01017.95215

以下是iPhone的优势比最大的几个word

android_iphone_or %>% arrange(or) %>% head()

A tibble: 6 × 4

wordiPhoneAndroidor
#makeamericagreatagain29400.001451382
#americafirst7100.005978071
#draintheswamp6300.006731214
#trump201641130.007271020
#votetrump5600.007565170
join15710.008141564

鉴于其中几个词是整体低频词,我们可以根据总频率施加一个过滤器,如下所示:

android_iphone_or %>% filter(Android+iPhone > 70) %>%
  arrange(desc(or))%>%head()

A tibble: 6 × 4

wordiPhoneAndroidor
@cnn17904.420869
republican12634.342710
bernie13593.767735
bad261043.371068
wow23742.710101
crooked491562.702752
  • 大多数主题标签来自 iPhone。事实上,几乎没有来自特朗普安卓系统的推文包含主题标签。
  • 诸如“join”和“tomorrow”之类的词,也仅来自 iPhone。 iPhone 显然负责活动公告(“明天晚上 7 点在德克萨斯州休斯顿加入我!”)

我们已经看到,从一种设备发布的文字类型比另一种设备更多。但是,我们对特定的单词不感兴趣,而是对语气感兴趣。 那么我们如何用数据来检查呢?单词可以与更基本的情绪相关联,例如愤怒、恐惧、喜悦和惊讶。

3.情绪分析:特朗普自己的推文比他的竞选推文更多负面情绪

在情感分析中,我们将一个词分配给一个或多个“情感”。尽管这种方法会遗漏与上下文相关的情绪,例如讽刺,但在对大量单词执行时,这样是有效的
情感分析的第一步是为每个单词分配一个情感。我们还将使用 textdata 包。

library(tidytext)
library(textdata)

对于我们的分析,我们有兴趣探索每条推文的不同情绪,因此我们将使用nrc 词典,包含了10种不同的情绪以及对于的单词,如下所示。第一次使用需要下载

get_sentiments("nrc") %>% head()

A tibble: 6 × 2

wordsentiment
abacustrust
abandonfear
abandonnegative
abandonsadness
abandonedanger
abandonedfear
get_sentiments("nrc") %>% count(sentiment)

A tibble: 10 × 2

sentimentn
anger1245
anticipation837
disgust1056
fear1474
joy687
negative3316
positive2308
sadness1187
surprise532
trust1230

可以看出不同的单词对应的情感。接下来我们就通过nrc词典来匹配推文中的情感

nrc <- get_sentiments("nrc") %>%
  select(word, sentiment)

我们可以使用 inner_join 组合word和sentiments,它只会保留与情绪相关联的单词。 以下是从推文中提取的7 个随机单词:

tweet_words %>% inner_join(nrc, by = "word") %>% 
  select(source, word, sentiment) %>% 
  sample_n(7)

A tibble: 7 × 3

sourcewordsentiment
iPhonehappyjoy
iPhonescumdisgust
Androidlovejoy
iPhonehurtanger
Androidfailinganticipation
iPhonevictoryanticipation
iPhonereporterpositive

现在我们准备通过比较从每个设备发布的推文的情绪来执行比较 Android 和 iPhone 的定量分析。在这里,我们可以执行逐条推文分析,为每条推文分配情绪。然而,这将具有挑战性,因为每条推文都会附有几种情感,词典中出现的每个单词都有一种情感。出于说明目的,我们将执行一个更简单的分析 :我们将计算和比较每个设备中出现的每种情绪的频率。

sentiment_counts <- tweet_words %>%
  left_join(nrc, by = "word") %>%#连接表
  count(source, sentiment) %>%#记数
  pivot_wider(names_from = "source", values_from = "n") %>%#将长数据转换为宽数据
  mutate(sentiment = replace_na(sentiment, replace = "none"))
sentiment_counts

A tibble: 11 × 3

sentimentAndroidiPhone
anger957528
anticipation909710
disgust638318
fear794486
joy687530
negative1637925
positive18051468
sadness890515
surprise518365
trust1235985
none1191110775

对于每种情绪,我们可以计算出现在设备中的几率:有情绪的词的与没有情绪的词的比例,然后计算比较两个设备的几率比。

sentiment_counts %>%
  mutate(Android = Android / (sum(Android) - Android) , 
         iPhone = iPhone / (sum(iPhone) - iPhone), 
         or = Android/iPhone) %>%
  arrange(desc(or))

A tibble: 11 × 4

sentimentAndroidiPhoneor
disgust0.029892700.018395331.6250163
anger0.045519410.030918781.4722252
negative0.080465990.055455641.4509974
sadness0.042198090.030134581.4003212
fear0.037475810.028389511.3200584
surprise0.024134560.021171691.1399446
joy0.032262610.031039531.0394039
anticipation0.043137810.042024271.0264977
trust0.059529550.059265941.0044478
positive0.089462730.090971060.9834196
none1.182820261.577598830.7497598

从结果来看,我们确实看到了一些差异,而且顺序很有趣:差异最大的三种情绪分别是disgust、anger和negative!但是这些差异仅仅是偶然的吗?为了回答这个问题,我们可以为每种情绪计算优势比的置信区间。

library(broom)
log_or <- sentiment_counts %>%
  mutate(log_or = log((Android / (sum(Android) - Android)) / #对数优势比率
      (iPhone / (sum(iPhone) - iPhone))),
          se = sqrt(1/Android + 1/(sum(Android) - Android) + #标准差
                      1/iPhone + 1/(sum(iPhone) - iPhone)),
          conf.low = log_or - qnorm(0.975)\*se,#置信区间
          conf.high = log_or + qnorm(0.975)\*se) %>%
  arrange(desc(log_or))
  
log_or

A tibble: 11 × 7

sentimentAndroidiPhonelog_orseconf.lowconf.high
disgust6383180.485517860.069402830.3494908090.62154491
anger9575280.386774990.055181470.2786213040.49492869
negative16379250.372251210.042438910.2890724710.45542995
sadness8905150.336701650.056314030.2263281720.44707513
fear7944860.277676010.058503610.1630110400.39234098
surprise5183650.130979630.06910010-0.0044540840.26641335
joy6875300.038647350.05871902-0.0764398150.15373451

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

492869 |
| negative | 1637 | 925 | 0.37225121 | 0.04243891 | 0.289072471 | 0.45542995 |
| sadness | 890 | 515 | 0.33670165 | 0.05631403 | 0.226328172 | 0.44707513 |
| fear | 794 | 486 | 0.27767601 | 0.05850361 | 0.163011040 | 0.39234098 |
| surprise | 518 | 365 | 0.13097963 | 0.06910010 | -0.004454084 | 0.26641335 |
| joy | 687 | 530 | 0.03864735 | 0.05871902 | -0.076439815 | 0.15373451 |

[外链图片转存中…(img-7cKGBYam-1715579158997)]
[外链图片转存中…(img-xQw1Sbho-1715579158997)]
[外链图片转存中…(img-4iSmnief-1715579158998)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值