R、 stringr,mutate(我想)-多个字符串中的多个部分字符串替换

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

我不熟悉文本挖掘、R和tidy方法,我正在寻找善意的建议,以克服从pdf文件读取的预处理文本字符串的障碍。具体问题是在多个字符串上替换多个字符串

我有两个来源的数据:

  • PDF报告:我使用map和PDF_文本函数将PDF报告目录读取到数据框中,该数据框创建了一个包含3列的TIBLE:page_字符串、文件名和页码。共有1191个条目,page_string包含一个字符串,即一页pdf文本
  • 专业词汇和替换的CSV文件:我已经使用read_CSV函数导入了这个文件。生成的df有两列,共77个条目:target_vocab(如社工)和replace_token(如社工)
  • 我的目标是修改主数据帧中的当前字符串,在标记化之前,将与target_vocab中的专业单词匹配的字符串替换为replace_token中的相关复合标记

    字符串示例-字符串替换前后:

  • “社会工作者和早期帮助工作人员与多机构合作伙伴合作,制定由分配的社会工作者领导的有需要儿童计划”
  • “社会工作者和早期工作者帮助员工与多机构合作伙伴合作,制定由分配的社会工作者领导的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))) 
    
    
    我尝试过各种各样的变化,包括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
    from
    stringr
    。而不是提供
    模式和
    替换人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)))