R,字串,变异我认为-多个字符串中的多个部分字符串替换

如何解决R,字串,变异我认为-多个字符串中的多个部分字符串替换

我是文本挖掘,R和整洁方法的新手,并且正在寻找同类建议,以克服对从pdf文件读取的文本字符串进行预处理的障碍。具体的问题是用多个字符串替换多个字符串。

我有2个来源的数据:

  1. PDF报告:我已经使用map和pdf_text函数将pdf报告的目录读取到一个数据框中,该目录创建了一个包含3列的标题:page_string,filename和pagenumber。有1,191个条目,page_string包含一个字符串,是pdf文本的一页。
  2. 专业词汇和替换词的CSV文件:我已使用read_CSV函数导入此文件。结果df有2列,其中有77个条目:target_vocab(例如,社会工作者)和replace_token(例如,social_worker)。

我的目标是修改主数据框中的当前字符串,在进行标记化之前,将与target_vocab中的专业单词匹配的字符串替换为replace_token中的相关复合标记。

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

  1. “社会工作者和早期帮助人员与多机构合作伙伴一起制定由分配的社会工作者领导的有需要的儿童计划。”
  2. “社会工作者和早期帮助人员与多机构合作伙伴一起制定由分配的社会工作者领导的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))) 

在地图功能中不起作用的位是:

mutate(page_string = str_replace_all(page_string,replace_vector)))

我尝试了各种变体,包括gsub,将其从管道分离到单独的map函数等。但是由于我的有限知识,我没有修复它。

我一直有警告:

在stri_replace_all_regex中(字符串,模式, fix_replacement(replacement),:较长的对象长度不是 较短的物体长度的倍数

使用这种代码变体,我还会收到错误消息:

mutate()输入page_string的问题。 x输入 page_string无法回收为10号。ℹ输入page_stringstr_replace_all(page_string,pattern = pattern_vector,replacement = replace_vector)。 {输入page_string的大小必须为10或1,而不是77。

我的感觉是map或list函数将对我有帮助,但是我似乎正在绕圈而行,我还没有找到能够帮助我解决问题的Stack Overflow响应。

解决方法

有一种方法可以处理str_replace_all中的stringr。与其提供patternreplacement,而是将命名向量传递给pattern。类似于pattern = c("social worker" = social_worker","early help" = "early_help","multi agency" = "multi_agency")。我将从一个简单的示例开始,然后向您展示如何R从您的words_df构建该命名向量。

# Simple example
library(stringr)
string <- "The quick brown fox"
str_replace_all(string,pattern = c("brown" = "green","fox" = "badger"))
[1] "The quick green badger"

在这里,您用R构建了一些命名的替换向量来处理一些看起来像您的假数据。

# 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
,

str_replace_all不能那样工作。如果提供patternreplacement的向量,则第一个模式/替换将应用于string的第一个元素,依此类推。请参见以下示例:

library(stringr)

fruits <- c("one apple two","two pears","three bananas")
pattern_v <- c("one","two","three")
replace_v <- c("1","2","3")
str_replace_all(fruits,pattern_v,replace_v)
#> [1] "1 apple two" "2 pears"     "3 bananas"

reprex package(v0.3.0)于2020-08-25创建

请注意,在string的第二个元素中,“ two”仅被替换为“ 2”。因此,如果pattern / replacement向量的长度不等于string的长度(或倍数),则无效:

pattern_v <- c("one","two")
replace_v <- c("1","2")
str_replace_all(fruits,replace_v)
[1] "1 apple two"   "2 pears"       "three bananas"
warning:
In stri_replace_all_regex(string,pattern,fix_replacement(replacement),:
  longer object length is not a multiple of shorter object length

为避免此问题,可以为pattern传递命名向量:

str_replace_all(fruits,c("one" = "1","two" = "2","three" = "3"))
[1] "1 apple 2" "2 pears"   "3 bananas"

Ben的答案给出了一种使向量的创建变得容易的好方法:

pattern_new <- c("one","three")
names(pattern_new) <- c("1",pattern_new)
[1] "one apple two" "two pears"     "three bananas"
,

得益于快速的响应,问题得以解决,下面的工作代码可以解决我将来可能遇到的麻烦的问题:

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)))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-