音系转录字符串拆分为音位段遇异常,长元音拆分错误求助
解决音位拆分时多字符音位被错误拆分的问题
你的问题核心在于拆分逻辑没有优先匹配完整的多字符音位——当你用str_split结合正向后顾断言时,正则引擎会逐个字符检查,遇到单独的i(短元音)就会触发拆分,导致后面的ː被孤立出来。
解决方案:用str_extract_all替代拆分逻辑
与其尝试把字符串拆分成音位段,不如直接提取所有符合定义的音位。这种方法更可靠,因为str_extract_all会按照你定义的音位列表顺序,优先匹配更长的多字符音位(比如iː),只有当这些长音位不匹配时,才会尝试匹配短音位。
以下是修正后的完整代码:
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 <- 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") # 塞音 # 构建匹配模式 phonemes_pattern <- paste0("(", paste0(phonemes, collapse = "|"), ")") # 提取所有匹配的音位(自动优先匹配长音位) extracted_phonemes <- str_extract_all(gsub(" ", "", test1), phonemes_pattern)[[1]] # 查看结果 print(extracted_phonemes)
运行结果示例
输出会正确保留所有多字符音位,比如:
[1] "d" "ɪ" "d" "ɛ" "n" "ɪ" "b" "ɒ" "d" "i" "l" "iː" "v" "ð" "eə" "g" "l" "ɑː" "s" "ɪ" [21] "z" "h" "ɪ" "ə" "l" "ɑː" "s" "t" "w" "iː" "k" "s" "ʌ" "m" "b" "ə" "d" "i" "d" "ɪ" [41] "d"
为什么这个方法有效?
你的音位列表已经按照从长到短的顺序排列(双元音→长元音→短元音→辅音),正则引擎在匹配时会从左到右尝试模式:
- 先检查当前位置是否匹配双元音(比如
eə) - 如果不匹配,再检查长元音(比如
iː) - 最后才会匹配短音位或单字符辅音
这样就完全避免了把iː拆成i和ː的问题。
统计音位数量
如果需要统计音位总数,直接用length(extracted_phonemes)即可得到正确结果。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

