如何正确将音素转写字符串分割为单个音素段?
解决音素分割时长元音被拆分的问题
你遇到的核心问题是正则表达式的匹配顺序:你的phonemes向量里,单字符的短元音i排在双字符的长元音iː前面,导致正则引擎优先匹配了短的i,而不是完整的iː,最终把长元音拆成了两个部分。
解决方案:调整音素匹配顺序
正则的交替匹配是从左到右尝试的,所以我们只需要把多字符的音素(双元音、长元音、塞擦音)都放在单字符音素的前面,让引擎优先匹配完整的长音素,而不是先匹配它的子字符。
步骤如下:
- 重新排序你的音素向量:
# 优先排列多字符音素,再放单字符音素 phonemes <- c( # 双元音(双字符) "ɪə","eɪ","ʊə","ɔɪ","aɪ","eə","aʊ","əʊ", # 长元音(双字符) "iː","uː","ɜː","ɔː","ɑː", # 塞擦音(双字符) "ʧ","ʤ", # 单字符音素 "ə","ɪ", "ɛ","ɒ","ʌ","æ","i","ʊ", "j","w", "r","l", "n","m","ŋ", "f","v","θ","ð","s","z","ʃ","ʒ","h", "p","b","t","d","k","g" )
- 重新生成匹配模式并执行分割:
library(stringr) test1 <- "dɪd ɛnɪbɒdi liːv ðeə glɑːsɪz hɪə lɑːst wiːk sʌmbədi dɪd" phonemes_pattern <- paste0("(", paste0(phonemes, collapse = "|"), ")") test1_clean <- gsub(" ", "", test1) # 执行分割 split_result <- str_split(test1_clean, paste0("(?<=", phonemes_pattern, ")")) # 查看结果 split_result[[1]]
正确结果示例
调整后,长元音iː会被作为一个整体保留,分割结果里的对应部分会是:"l", "iː", "v" 而不是之前的 "l", "i", "ː", "v"
整个分割结果会变成:
[1] "d" "ɪ" "d" "ɛ" "n" "ɪ" "b" "ɒ" "d" "i" "l" "iː" "v" "ð" "eə" "g" "l" "ɑː" "s" "ɪ" "z" "h" "ɪ" "ə" [25] "l" "ɑː" "s" "t" "w" "iː" "k" "s" "ʌ" "m" "b" "ə" "d" "i" "d" "ɪ" "d" ""
这样就能完美解决长元音被错误拆分的问题啦!
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

