R、 stringr,mutate(我想)-多个字符串中的多个部分字符串替换
我不熟悉文本挖掘、R和tidy方法,我正在寻找善意的建议,以克服从pdf文件读取的预处理文本字符串的障碍。具体问题是在多个字符串上替换多个字符串 我有两个来源的数据:R、 stringr,mutate(我想)-多个字符串中的多个部分字符串替换,r,tidyverse,stringr,mutate,readr,R,Tidyverse,Stringr,Mutate,Readr,我不熟悉文本挖掘、R和tidy方法,我正在寻找善意的建议,以克服从pdf文件读取的预处理文本字符串的障碍。具体问题是在多个字符串上替换多个字符串 我有两个来源的数据: PDF报告:我使用map和PDF_文本函数将PDF报告目录读取到数据框中,该数据框创建了一个包含3列的TIBLE:page_字符串、文件名和页码。共有1191个条目,page_string包含一个字符串,即一页pdf文本 专业词汇和替换的CSV文件:我已经使用read_CSV函数导入了这个文件。生成的df有两列,共77个条目:ta
#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)))
我尝试过各种各样的变化,包括gsub,将它从管道分离到一个单独的映射函数等等。但以我有限的知识,我不会修复它
我一直得到警告:
在stri_中替换所有正则表达式(字符串、模式、,
修复替换(替换):较长的对象长度不是
较短对象长度的倍数
通过这种代码变体,我也得到了错误:
mutate()
page\u字符串
不能回收到10号大小。ℹ 输入page\u字符串
str\u replace\u all(page\u string,pattern=pattern\u vector,replacement=replace\u vector)
。ℹ 输入的页面\u字符串的大小必须为10或1,而不是77
我的感觉是map或list函数会对我有所帮助,但我似乎在兜圈子,我还没有找到一个堆栈溢出响应来帮助我解决这个问题。有一种方法可以使用stru-replace\u-all
fromstringr
。而不是提供模式和替换人t
,将命名向量传递给pattern
。类似pattern=c(“社会工作者”=社会工作者”,“早期帮助”=“早期帮助”,“多机构”=“多机构”)
。我将从一个简单的示例开始,然后向您展示如何让R
从单词中构建命名向量
# Simple example
library(stringr)
string <- "The quick brown fox"
str_replace_all(string, pattern = c("brown" = "green", "fox" = "badger"))
[1] "The quick green badger"
str\u replace\u all
不是这样工作的。如果为pattern
和replacement
提供向量,则第一个pattern/replacement将应用于string
的第一个元素,依此类推。请参见以下示例:
库(stringr)
fruits由于快速响应,问题得以解决,以下是解决我的问题的工作代码,供将来可能遇到困难的人参考:
professional_terms <- c(words_df$replace_token)
names(professional_terms) <- c(words_df$target_words)
pdf_pages_df <- map_df(pdf_filenames, ~ tibble(page_string = pdf_text(.x)) %>%
mutate(filename = .x, pagenumber = row_number(), page_string = str_replace_all(page_string,pattern = professional_terms)))
professional\u术语非常有用。对于我的学习,你能告诉我names()是如何工作的吗?当我检查命名向量替换时,我只看到替换词,而目标词是不可见的。但是它可以工作!如果使用names(object)
它将返回对象的名称(例如,data.frame中的列名)。如果您使用names(object),我不确定names()是如何工作的,但它确实起作用,这非常有帮助。我将为其他有困难的人发布我完成的代码。
# Making the fake data
words_df <- data.frame(target = c("fox", "brown", "quick"),
replacement = c("badger", "green", "versatile"))
strings_df <- data.frame(page_string = c("The quick brown fox",
"The sad yellow fox",
"The quick old dog",
"The lazy brown dog",
"The quick happy fox"))
# Making the named replacement vector from words_df
replacements <- c(words_df$replacement)
names(replacements) <- c(words_df$target)
# Doing the replacement
library(dplyr)
strings_df %>%
mutate(new_string = str_replace_all(page_string,
pattern = replacements))
# The output
page_string new_string
1 The quick brown fox The versatile green badger
2 The sad yellow fox The sad yellow badger
3 The quick old dog The versatile old dog
4 The lazy brown dog The lazy green dog
5 The quick happy fox The versatile happy badger
professional_terms <- c(words_df$replace_token)
names(professional_terms) <- c(words_df$target_words)
pdf_pages_df <- map_df(pdf_filenames, ~ tibble(page_string = pdf_text(.x)) %>%
mutate(filename = .x, pagenumber = row_number(), page_string = str_replace_all(page_string,pattern = professional_terms)))