如何通过匹配参考值替换子字符串值

问题描述

我有话语的语音转录:

str <- c("aɪ nəʊ ɪts ɪts ðə sɪksθ əv ʤuːn","wɛl ðə ʧæp nɛkst dɔːz ˈfaɪndɪŋ ɪt ˈvɛri əˈmjuːzɪŋ","lʌvli bu(ː)ˈkeɪ əv ˈflaʊəz fə mi wɛl ðæts ɪt","ðeə raɪt ləʊ ɪn ðə liːg ɑːnt ðeɪ","kɔː wi θɔːt wi wɪʃt wiːd lɛft ˈɜːlɪə naʊ","aɪ nəʊ s ðə biː ðə bɪg bɔɪ ðeɪl","jeə bət ɪt s ə məʊl aɪ kən əˈʃʊə juː","ɑː ʤəst eə haʊ aɪ juːzd tə dʊ jɪəz əˈgəʊ","jeə dəʊnt ˈwʌri əˈbaʊt mi æn aɪm ɔːlˈraɪt")

我想用数字代替所有的双峰; diphthong及其匹配的替换号存储在参考数据框中:

ref <- data.frame(
  diphthong = c("ɪə","eɪ","ʊə","ɔɪ","aɪ","eə","aʊ","əʊ"),replacement = 1:8
)

我可以使用gsub分别替换每个二元音,将结果存储在一个新向量中,替换该新向量中的下一个二元音,依此类推:

a <- gsub("ɪə","1",str)
b <- gsub("eɪ","2",a)
c <- gsub("ʊə","3",b)
d <- gsub("ɔɪ","4",c)
e <- gsub("aɪ","5",d)
f <- gsub("eə","6",e)
g <- gsub("aʊ","7",f)
h <- gsub("əʊ","8",g)

虽然这可以为我带来预期的效果(请参见下文),但此方法是重复性的,而且远非优雅。如何一口气完成替换?

预期结果

[1] "5 n8 ɪts ɪts ðə sɪksθ əv ʤuːn"                    "wɛl ðə ʧæp nɛkst dɔːz ˈf5ndɪŋ ɪt ˈvɛri əˈmjuːzɪŋ"
[3] "lʌvli bu(ː)ˈk2 əv ˈfla3z fə mi wɛl ðæts ɪt"       "ð6 r5t l8 ɪn ðə liːg ɑːnt ð2"                    
[5] "kɔː wi θɔːt wi wɪʃt wiːd lɛft ˈɜːl1 n7"           "5 n8 s ðə biː ðə bɪg b4 ð2l"                     
[7] "j6 bət ɪt s ə m8l 5 kən əˈʃ3 juː"                 "ɑː ʤəst 6 h7 5 juːzd tə dʊ j1z əˈg8"             
[9] "j6 d8nt ˈwʌri əˈb7t mi æn 5m ɔːlˈr5t"

解决方法

您可以创建一个简单的for循环:

for(i in seq_len(nrow(ref))) {
  str <- gsub(ref$diphthong[i],ref$replacement[i],str)
}
,

足够:

ref

其中ref <- setNames(as.character(1:8),c("ɪə","eɪ","ʊə","ɔɪ","aɪ","eə","aʊ","əʊ")) 定义为:

ref

如果ref <- setNames(as.character(ref$replacement),ref$diphthong) 已被定义为数据帧,则可以通过以下方式将其转换为命名向量:

python -m ipykernel install --user --name=testenv
,

您可以从diphthong数据中创建一个正则表达式来匹配每个单独的diphthong,并在数据上使用一次传递,将每个匹配项替换为替换列中的相应值:

library(stringr)
str <- c("aɪ nəʊ ɪts ɪts ðə sɪksθ əv ʤuːn","wɛl ðə ʧæp nɛkst dɔːz ˈfaɪndɪŋ ɪt ˈvɛri əˈmjuːzɪŋ","lʌvli bu(ː)ˈkeɪ əv ˈflaʊəz fə mi wɛl ðæts ɪt","ðeə raɪt ləʊ ɪn ðə liːg ɑːnt ðeɪ","kɔː wi θɔːt wi wɪʃt wiːd lɛft ˈɜːlɪə naʊ","aɪ nəʊ s ðə biː ðə bɪg bɔɪ ðeɪl","jeə bət ɪt s ə məʊl aɪ kən əˈʃʊə juː","ɑː ʤəst eə haʊ aɪ juːzd tə dʊ jɪəz əˈgəʊ","jeə dəʊnt ˈwʌri əˈbaʊt mi æn aɪm ɔːlˈraɪt")
 
ref <- data.frame(
   diphthong = c("ɪə","əʊ"),replacement = 1:8
)
pat <- paste(ref$diphthong,collapse="|")
str_replace_all(str,pat,function(x) ref$replacement[ref$diphthong==x])

请参见R demo。输出:

[1] "5 n8 ɪts ɪts ðə sɪksθ əv ʤuːn"                   
[2] "wɛl ðə ʧæp nɛkst dɔːz ˈf5ndɪŋ ɪt ˈvɛri əˈmjuːzɪŋ"
[3] "lʌvli bu(ː)ˈk2 əv ˈfl7əz fə mi wɛl ðæts ɪt"      
[4] "ð6 r5t l8 ɪn ðə liːg ɑːnt ð2"                    
[5] "kɔː wi θɔːt wi wɪʃt wiːd lɛft ˈɜːl1 n7"          
[6] "5 n8 s ðə biː ðə bɪg b4 ð2l"                     
[7] "j6 bət ɪt s ə m8l 5 kən əˈʃ3 juː"                
[8] "ɑː ʤəst 6 h7 5 juːzd tə dʊ j1z əˈg8"             
[9] "j6 d8nt ˈwʌri əˈb7t mi æn 5m ɔːlˈr5t"            

在这种情况下,正则表达式是使用paste(ref$diphthong,collapse="|")构建的,它只是基于交替的模式ɪə|eɪ|ʊə|ɔɪ|aɪ|eə|aʊ|əʊref$replacement[ref$diphthong==x]部分将找到的diphthong映射为其替换值。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...