使用tidytext包进行整洁文本挖掘:从基础到实践
什么是整洁文本格式
在数据分析领域,整洁数据(tidy data)原则极大地简化了数据处理流程,这一原则同样适用于文本分析。整洁文本格式的核心定义是:每个标记(token)占据一行的表格结构。这里的标记可以是单词、n-gram、句子或段落等有意义的文本单元。
与传统文本存储方式(如字符串或文档-词项矩阵)相比,整洁文本格式具有显著优势:
- 每个变量对应一列
- 每个观察值对应一行
- 每种观测单位对应一个表格
这种结构使得我们可以充分利用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)
这个简单的操作完成了几个重要步骤:
- 将每行文本拆分为单词
- 自动去除标点符号
- 默认转换为小写(可通过to_lower=FALSE关闭)
- 保留原始的行号信息
简·奥斯汀小说分析实战
让我们通过分析简·奥斯汀的六部小说来展示整洁文本分析的完整流程。
数据准备
首先加载并预处理数据:
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`)
结果显示奥斯汀与勃朗特姐妹的作品用词相关性更高,这与我们的可视化观察一致。
总结
整洁文本格式为自然语言处理提供了统一、灵活的分析框架。通过将文本转换为每个标记一行的结构,我们可以:
- 轻松应用各种数据清洗和转换操作
- 无缝整合到整洁工具生态系统中
- 方便地进行跨文本比较分析
- 为更复杂的文本挖掘任务奠定基础
这种方法的优势在于其一致性和可扩展性,无论是简单的词频统计还是复杂的文本建模,都可以在同一个框架内完成。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考