网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- ‘for’
- ‘a’
- ‘tweet’
- ‘endorsement’
- ‘when’
- ‘her’
- ‘book’
- ‘was’
- ‘launched’
默认的unnest_tokens会去除特殊符号,我们可以通过指定token,来保留这些符号
campaign_tweets[1,] %>%
unnest_tokens(word, text, token = "tweets") %>%
pull(word)
- ‘why’
- ‘did’
- ‘@danaperino’
- ‘beg’
- ‘me’
- ‘for’
- ‘a’
- ‘tweet’
- ‘endorsement’
- ‘when’
- ‘her’
- ‘book’
- ‘was’
- ‘launched’
接下来我们要做的另一个小调整是删除图片链接,得到提取的
word
links <- "https://t.co/[A-Za-z\\d]+|&"
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
word | n |
---|---|
the | 2329 |
to | 1410 |
and | 1239 |
in | 1185 |
i | 1143 |
a | 1112 |
you | 999 |
of | 982 |
is | 942 |
on | 874 |
不难理解这些词出现的次数最多。但是这些词没有提供信息。 tidytext包有这些常用词的数据库,称为停用词,在文本挖掘中:
stop_words
可以查看常见的停用词
head(stop_words)
A tibble: 6 × 2
word | lexicon |
---|---|
a | SMArT |
a’s | SMArT |
able | SMArT |
about | SMArT |
above | SMArT |
according | SMArT |
接下来我们删选掉属于停用词的文本
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
word | n |
---|---|
#trump2016 | 414 |
hillary | 405 |
people | 303 |
#makeamericagreatagain | 294 |
america | 254 |
clinton | 237 |
poll | 217 |
crooked | 205 |
trump | 195 |
cruz | 159 |
可以看出这个时候出现最多的次数的
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
word | iPhone | Android | or |
---|---|---|---|
poor | 0 | 13 | 23.08133 |
poorly | 0 | 12 | 21.37160 |
turnberry | 0 | 11 | 19.66188 |
@cbsnews | 0 | 10 | 17.95215 |
angry | 0 | 10 | 17.95215 |
bosses | 0 | 10 | 17.95215 |
以下是iPhone的优势比最大的几个
word
android_iphone_or %>% arrange(or) %>% head()
A tibble: 6 × 4
word | iPhone | Android | or |
---|---|---|---|
#makeamericagreatagain | 294 | 0 | 0.001451382 |
#americafirst | 71 | 0 | 0.005978071 |
#draintheswamp | 63 | 0 | 0.006731214 |
#trump2016 | 411 | 3 | 0.007271020 |
#votetrump | 56 | 0 | 0.007565170 |
join | 157 | 1 | 0.008141564 |
鉴于其中几个词是整体低频词,我们可以根据总频率施加一个过滤器,如下所示:
android_iphone_or %>% filter(Android+iPhone > 70) %>%
arrange(desc(or))%>%head()
A tibble: 6 × 4
word | iPhone | Android | or |
---|---|---|---|
@cnn | 17 | 90 | 4.420869 |
republican | 12 | 63 | 4.342710 |
bernie | 13 | 59 | 3.767735 |
bad | 26 | 104 | 3.371068 |
wow | 23 | 74 | 2.710101 |
crooked | 49 | 156 | 2.702752 |
- 大多数主题标签来自 iPhone。事实上,几乎没有来自特朗普安卓系统的推文包含主题标签。
- 诸如“join”和“tomorrow”之类的词,也仅来自 iPhone。 iPhone 显然负责活动公告(“明天晚上 7 点在德克萨斯州休斯顿加入我!”)
我们已经看到,从一种设备发布的文字类型比另一种设备更多。但是,我们对特定的单词不感兴趣,而是对语气感兴趣。 那么我们如何用数据来检查呢?单词可以与更基本的情绪相关联,例如愤怒、恐惧、喜悦和惊讶。
3.情绪分析:特朗普自己的推文比他的竞选推文更多负面情绪
在情感分析中,我们将一个词分配给一个或多个“情感”。尽管这种方法会遗漏与上下文相关的情绪,例如讽刺,但在对大量单词执行时,这样是有效的
情感分析的第一步是为每个单词分配一个情感。我们还将使用 textdata 包。
library(tidytext)
library(textdata)
对于我们的分析,我们有兴趣探索每条推文的不同情绪,因此我们将使用
nrc
词典,包含了10种不同的情绪以及对于的单词,如下所示。第一次使用需要下载
get_sentiments("nrc") %>% head()
A tibble: 6 × 2
word | sentiment |
---|---|
abacus | trust |
abandon | fear |
abandon | negative |
abandon | sadness |
abandoned | anger |
abandoned | fear |
get_sentiments("nrc") %>% count(sentiment)
A tibble: 10 × 2
sentiment | n |
---|---|
anger | 1245 |
anticipation | 837 |
disgust | 1056 |
fear | 1474 |
joy | 687 |
negative | 3316 |
positive | 2308 |
sadness | 1187 |
surprise | 532 |
trust | 1230 |
可以看出不同的单词对应的情感。接下来我们就通过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
source | word | sentiment |
---|---|---|
iPhone | happy | joy |
iPhone | scum | disgust |
Android | love | joy |
iPhone | hurt | anger |
Android | failing | anticipation |
iPhone | victory | anticipation |
iPhone | reporter | positive |
现在我们准备通过比较从每个设备发布的推文的情绪来执行比较 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
sentiment | Android | iPhone |
---|---|---|
anger | 957 | 528 |
anticipation | 909 | 710 |
disgust | 638 | 318 |
fear | 794 | 486 |
joy | 687 | 530 |
negative | 1637 | 925 |
positive | 1805 | 1468 |
sadness | 890 | 515 |
surprise | 518 | 365 |
trust | 1235 | 985 |
none | 11911 | 10775 |
对于每种情绪,我们可以计算出现在设备中的几率:有情绪的词的与没有情绪的词的比例,然后计算比较两个设备的几率比。
sentiment_counts %>%
mutate(Android = Android / (sum(Android) - Android) ,
iPhone = iPhone / (sum(iPhone) - iPhone),
or = Android/iPhone) %>%
arrange(desc(or))
A tibble: 11 × 4
sentiment | Android | iPhone | or |
---|---|---|---|
disgust | 0.02989270 | 0.01839533 | 1.6250163 |
anger | 0.04551941 | 0.03091878 | 1.4722252 |
negative | 0.08046599 | 0.05545564 | 1.4509974 |
sadness | 0.04219809 | 0.03013458 | 1.4003212 |
fear | 0.03747581 | 0.02838951 | 1.3200584 |
surprise | 0.02413456 | 0.02117169 | 1.1399446 |
joy | 0.03226261 | 0.03103953 | 1.0394039 |
anticipation | 0.04313781 | 0.04202427 | 1.0264977 |
trust | 0.05952955 | 0.05926594 | 1.0044478 |
positive | 0.08946273 | 0.09097106 | 0.9834196 |
none | 1.18282026 | 1.57759883 | 0.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
sentiment | Android | iPhone | log_or | se | conf.low | conf.high |
---|---|---|---|---|---|---|
disgust | 638 | 318 | 0.48551786 | 0.06940283 | 0.349490809 | 0.62154491 |
anger | 957 | 528 | 0.38677499 | 0.05518147 | 0.278621304 | 0.49492869 |
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 |
既有适合小白学习的零基础资料,也有适合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%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新