【发布时间】:2020-12-14 12:34:45
【问题描述】:
我是文本挖掘、R 和 tidy 方法的新手,我正在寻找善意的建议来克服从 pdf 文件中读取的预处理文本字符串的障碍。具体问题是对多个字符串进行多个字符串替换。
我有来自 2 个来源的数据:
- PDF 报告:我使用 map 和 pdf_text 函数将 pdf 报告的目录读取到数据框中,该数据框创建了一个包含 3 列的小标题:page_string、文件名和页码。有 1,191 个条目,page_string 包含一个字符串,即一页 pdf 文本。
- 专业单词和替换的CSV文件:我使用了read_CSV函数来导入这个。生成的 df 有 2 列,包含 77 个条目:target_vocab(例如 social worker)和 replace_token(例如 social_worker)。
我的目标是修改主数据框中的当前字符串,在标记化之前将与 target_vocab 中的专业词匹配的字符串替换为 replace_token 中的相关复合标记。
字符串示例 - 字符串替换前后:
- “社会工作者和早期帮助人员与多机构合作伙伴合作,制定由分配的社会工作者领导的有需要的儿童计划”。
- “Social_workers 和 early_help 工作人员与多机构合作伙伴合作,制定由分配的 social_worker 领导的 CIN 计划”。
希望很清楚,我希望将“社会工作者”、“早期帮助”、“多机构”、“有需要的孩子”和“社会工作者”替换为复合标记。
我的代码:
#a bank of pdf reports and "professional_words.csv" in current working directory
library(tidyverse)
library(pdftools)
#> Using poppler version 0.73.0
library(tidytext)
library(stringr)
pdf_filenames <- list.files(pattern = "pdf$")
words_df <- read_csv("professional_words.csv", skip = 1, col_names = c("target_vocab", "replace_token"))
pattern_vector <- words_df$target_vocab
replacement_vector <- words_df$replace_token
pdf_pages_df <- map_df(pdf_filenames, ~ tibble(page_string = pdf_text(.x)) %>%
mutate(filename = .x, pagenumber = row_number()) %>%
mutate(page_string = str_replace_all(page_string,pattern_vector,replace_vector)))
在 map 函数中不起作用的位是:
mutate(page_string = str_replace_all(page_string,pattern_vector,replace_vector)))
我尝试了各种变体,包括 gsub、将其从管道中分离为单独的 map 函数等。但我的知识有限,我没有修复它。
我一直收到警告:
在 stri_replace_all_regex(string, pattern, fix_replacement(replacement), : 更长的对象长度不是 短物体长度的倍数
使用这种代码变体,我也遇到了错误:
mutate()输入page_string存在问题。 x 输入page_string不能回收到 10 号。ℹ 输入page_string是str_replace_all(page_string, pattern = pattern_vector, replacement = replace_vector)。 ℹ 输入page_string的大小必须是 10 或 1,而不是 77。
我的感觉是地图或列表功能会帮助我,但我似乎在兜圈子,我还没有找到帮助我解决问题的 Stack Overflow 响应。
【问题讨论】:
标签: r tidyverse stringr dplyr readr