使用tidytext包进行整洁文本挖掘:从基础到实践

使用tidytext包进行整洁文本挖掘:从基础到实践

什么是整洁文本格式

在数据分析领域,整洁数据(tidy data)原则极大地简化了数据处理流程,这一原则同样适用于文本分析。整洁文本格式的核心定义是:每个标记(token)占据一行的表格结构。这里的标记可以是单词、n-gram、句子或段落等有意义的文本单元。

与传统文本存储方式(如字符串或文档-词项矩阵)相比,整洁文本格式具有显著优势:

  1. 每个变量对应一列
  2. 每个观察值对应一行
  3. 每种观测单位对应一个表格

这种结构使得我们可以充分利用dplyr、tidyr、ggplot2等整洁工具生态系统进行文本处理和分析。

文本数据结构的对比

理解整洁文本格式需要与其他常见文本存储方式进行对比:

  • 字符串:最基本的文本存储形式,R中的字符向量
  • 语料库(Corpus):包含原始字符串及附加元数据的对象
  • 文档-词项矩阵(DTM):稀疏矩阵,行代表文档,列代表词项,值通常为词频或TF-IDF权重

整洁文本格式的一标记一行结构为文本分析提供了统一的处理框架。

使用unnest_tokens进行文本分词

让我们通过一个实际例子来理解整洁文本的转换过程。以艾米莉·狄金森的诗作为例:

text <- c("Because I could not stop for Death -",
          "He kindly stopped for me -",
          "The Carriage held but just Ourselves -",
          "and Immortality")

首先将文本转换为数据框:

library(dplyr)
text_df <- tibble(line = 1:4, text = text)

然后使用unnest_tokens函数进行分词:

library(tidytext)
text_df %>% unnest_tokens(word, text)

这个简单的操作完成了几个重要步骤:

  1. 将每行文本拆分为单词
  2. 自动去除标点符号
  3. 默认转换为小写(可通过to_lower=FALSE关闭)
  4. 保留原始的行号信息

简·奥斯汀小说分析实战

让我们通过分析简·奥斯汀的六部小说来展示整洁文本分析的完整流程。

数据准备

首先加载并预处理数据:

library(janeaustenr)
original_books <- austen_books() %>%
  group_by(book) %>%
  mutate(linenumber = row_number(),
         chapter = cumsum(str_detect(text, 
                                     regex("^chapter [\\divxlc]",
                                           ignore_case = TRUE)))) %>%
  ungroup()

转换为整洁格式

使用unnest_tokens进行分词:

tidy_books <- original_books %>%
  unnest_tokens(word, text)

移除停用词

停用词(如"the"、"of"等)通常对分析价值不大:

data(stop_words)
tidy_books <- tidy_books %>% anti_join(stop_words)

词频统计与可视化

计算并可视化高频词:

tidy_books %>%
  count(word, sort = TRUE) %>%
  filter(n > 600) %>%
  mutate(word = reorder(word, n)) %>%
  ggplot(aes(n, word)) +
  geom_col() +
  labs(y = NULL)

跨作品词频比较分析

为了展示整洁文本分析的强大之处,我们比较简·奥斯汀、勃朗特姐妹和H.G.威尔斯作品的词频差异。

数据准备

加载并处理另外两位作者的作品:

library(gutenbergr)

# H.G.威尔斯作品
hgwells <- gutenberg_download(c(35, 36, 5230, 159)) %>%
  unnest_tokens(word, text) %>%
  anti_join(stop_words)

# 勃朗特姐妹作品
bronte <- gutenberg_download(c(1260, 768, 969, 9182, 767)) %>%
  unnest_tokens(word, text) %>%
  anti_join(stop_words)

词频比较

合并数据并计算相对频率:

frequency <- bind_rows(
  mutate(tidy_bronte, author = "Brontë Sisters"),
  mutate(tidy_hgwells, author = "H.G. Wells"), 
  mutate(tidy_books, author = "Jane Austen")) %>% 
  mutate(word = str_extract(word, "[a-z']+")) %>%
  count(author, word) %>%
  group_by(author) %>%
  mutate(proportion = n / sum(n)) %>% 
  select(-n) %>% 
  pivot_wider(names_from = author, values_from = proportion) %>%
  pivot_longer(`Brontë Sisters`:`H.G. Wells`,
               names_to = "author", values_to = "proportion")

可视化比较

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()) +
  facet_wrap(~author, ncol = 2)

相关性分析

量化不同作者间的用词相似度:

cor.test(data = frequency[frequency$author == "Brontë Sisters",],
         ~ proportion + `Jane Austen`)

cor.test(data = frequency[frequency$author == "H.G. Wells",], 
         ~ proportion + `Jane Austen`)

结果显示奥斯汀与勃朗特姐妹的作品用词相关性更高,这与我们的可视化观察一致。

总结

整洁文本格式为自然语言处理提供了统一、灵活的分析框架。通过将文本转换为每个标记一行的结构,我们可以:

  1. 轻松应用各种数据清洗和转换操作
  2. 无缝整合到整洁工具生态系统中
  3. 方便地进行跨文本比较分析
  4. 为更复杂的文本挖掘任务奠定基础

这种方法的优势在于其一致性和可扩展性,无论是简单的词频统计还是复杂的文本建模,都可以在同一个框架内完成。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌朦慧Richard

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值