如何绑定和绘制两本书的词频相似度?

How Can I Bind and Graph Two Books for Similarity of Word Frequency?

我正在使用 Text Mining with R: A Tidy Approach by Julia Silge & David Robinson 尝试装订和绘制两本书,第一本是简·奥斯汀的(说服,阅读“说服”),第二本是Charlotte Bronte(读作“janeyre”),以便根据词频比较它们并绘制它们。之后,我想添加奥斯汀的 6 本书和夏洛蒂·勃朗特的 4 本书的完整语料库,因为我试图了解作者个人语言的一致性。

为了做到这一点,我尝试修改了 Silge & Robinson 书中第一章中关于词频部分的一些代码。

library(tidyverse)
library(dplyr)
library(gutenbergr)
library(tidytext)
library(stringr)
library(ggplot2)

persua <- gutenberg_download(c(105))
tidy_persua <- persua %>%
unnest_tokens(word, text) %>%
count(word, sort = TRUE) 

library(dplyr)
library(gutenbergr)
library(tidytext)
janeyre<- gutenberg_download(c(1260))
tidy_janeyre <- janeyre%>%
unnest_tokens(word, text) %>%
count(word, sort = TRUE) 

library(tidyr)

frequency <- bind_rows(mutate(tidy_persua, author = "Jane Austen"),                              
                      (mutate(tidy_janeyre, author = "Charlotte Bronte")) %>%   
mutate(word = str_extract(word, "[a-z']+")) %>%
count(author, word) %>%
group_by(author) %>%
mutate(proportion = n / sum(n)) %>% 

select(-n) %>% 传播(作者,比例)%>% 收集(作者,比例,Charlotte BronteJane Austen

library(scales)
ggplot(frequency, aes(x = proportion, y =  `Jane Austen`, 
                  color = abs(`Jane Austen` - proportion))) +
geom_abline(color = "gray40", lty = 2) +
geom_jitter(alpha = 0.1, size = 2.5, width = 0.3, height = 0.3) +
geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
scale_x_log10(labels = percent_format()) +
scale_y_log10(labels = percent_format()) +
scale_color_gradient(limits = c(0, 0.001), 
                   low = "darkslategray4", high = "gray75") +
facet_wrap(~author, ncol = 2) +
theme(legend.position="none") +
labs(y = "Jane Austen", x = NULL)

但是,在最后的代码序列中,我收到了一些错误消息,这让我很困惑,因为我没有足够的 R 代码使用经验。

对于预期输出应该是什么,您并没有真正的问题或示例。而且我不确定计算您在这里尝试的比较类型的比例的最佳做法是什么...但是以下 reprex 显示了一些似乎有效的东西,对您发布的代码进行了相对较小的修改。

我的计算方法是 proportion 一位作者出现某个词的次数相对于两位作者使用该词的总次数。

值得注意的是,您的字数统计似乎不正确。我正在使用 pivot_wider(values_fn = sum) 来处理计算比例

后出现的一些重复
library(tidyverse)
library(dplyr)
library(gutenbergr)
library(tidytext)
library(stringr)
library(tidyr)
library(ggplot2)
library(scales, warn.conflicts=FALSE)

persua <- gutenberg_download(c(105))
#> Determining mirror for Project Gutenberg from http://www.gutenberg.org/robot/harvest
#> Using mirror http://aleph.gutenberg.org

tidy_persua <- persua %>%
  unnest_tokens(word, text) %>%
  count(word, sort = TRUE) 

janeyre <- gutenberg_download(c(1260))

tidy_janeyre <- janeyre %>%
  unnest_tokens(word, text) %>%
  count(word, sort = TRUE) 

frequency <- bind_rows(mutate(tidy_persua, author = "Jane Austen"),
                       mutate(tidy_janeyre, author = "Charlotte Bronte")) %>% 
                         mutate(word = str_extract(word, "[a-z']+")) %>%
                         group_by(word) %>%
                         mutate(proportion = n / sum(n)) %>%
                         select(-n) %>%
                         pivot_wider(names_from = author, values_from = proportion, values_fn = sum) 

ggplot(frequency, aes(x = `Charlotte Bronte`, y =  `Jane Austen`, 
                      color = abs(`Jane Austen` - `Charlotte Bronte`))) +
  geom_abline(color = "gray40", lty = 2) +
  geom_jitter(alpha = 0.1, size = 2.5, width = 0.3, height = 0.3) +
  geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
  scale_x_log10(labels = percent_format()) +
  scale_y_log10(labels = percent_format()) +
  scale_color_gradient(limits = c(0, 0.001), 
                       low = "darkslategray4", high = "gray75") +
  theme(legend.position="none") +
  labs(y = "Jane Austen", x = "Charlotte Bronte")

编辑:这是一个工作版本,它是 https://www.tidytextmining.com/tidytext.html 示例的直接克隆——但适用于您的两本书。它不会生成最令人兴奋的图形。

frequency <- bind_rows(mutate(tidy_persua, author = "Jane Austen"),
                       mutate(tidy_janeyre, author = "Charlotte Bronte")) %>% 
  mutate(word = str_extract(word, "[a-z']+")) %>%
  count(author, word) %>%
  group_by(author) %>%
  mutate(proportion = n / sum(n)) %>% 
  select(-n) %>% 
  spread(author, proportion) %>% 
  gather(author, proportion, `Charlotte Bronte`)

ggplot(frequency, aes(x = proportion, y = `Jane Austen`, 
                      color = abs(`Jane Austen` - proportion))) +
  geom_abline(color = "gray40", lty = 2) +
  geom_jitter(alpha = 0.1, size = 2.5, width = 0.3, height = 0.3) +
  geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
  scale_x_log10(labels = percent_format()) +
  scale_y_log10(labels = percent_format()) +
  scale_color_gradient(limits = c(0, 0.001), 
                       low = "darkslategray4", high = "gray75") +
  facet_wrap(~author, ncol = 2) +
  theme(legend.position="none") +
  labs(y = "Jane Austen", x = NULL)