【问题标题】:Split string into phonemic segments将字符串拆分为音位段
【发布时间】:2020-12-19 18:55:47
【问题描述】:

我似乎想不出一个看似简单的任务:

我有语音的音素转录。为了计算音素,我想将字符串分成单个音素段。不幸的是,用于音素的字符并非 100% 不同。例如,长 /i/ 音转写为 iː(注意:ː 不是冒号而是特殊字符!)而短 /i/ 音偶尔可能转写为 i。在两个不同的音素中重复使用i 会导致拆分操作出现问题:

测试数据:

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ʊ","əʊ",   # diphthongs
              "iː","uː","ɜː","ɔː","ɑː",                  # long vowels
              "ə","ɪ", "ɛ","ɒ","ʌ","æ","i","ʊ",          # short vowels
              "j","w",                                   # semi-vowels
              "r","l",                                   # approximants
              "n","m","ŋ",                               # nasals
              "f","v","θ","ð","s","z","ʃ","ʒ","h",       # fricatives
              "ʧ","ʤ",                                   # affricates
              "p","b","t","d","k","g")                   # plosives

交替模式:

phonemes_pattern <- paste0("(", paste0(phonemes, collapse = "|"), ")")

splitting 操作:

str_split(gsub(" ", "", test1), paste0("(?<=", phonemes_pattern, ")"))
[[1]]
 [1] "d"  "ɪ"  "d"  "ɛ"  "n"  "ɪ"  "b"  "ɒ"  "d"  "i"  "l"  "i"  "ː"  "v"  "ð"  "eə" "g"  "l"  "ɑː" "s"  "ɪ"  "z"  "h"  "ɪ"  "ə"  "l"  "ɑː" "s"  "t" 
[30] "w"  "i"  "ː"  "k"  "s"  "ʌ"  "m"  "b"  "ə"  "d"  "i"  "d"  "ɪ"  "d"  ""

结果是正确的除了对于长 /i/ 声音,其中两个字符 i 和 ː 也是分开的。有人可以帮忙吗?

【问题讨论】:

    标签: r regex


    【解决方案1】:

    为什么不提取phonemes 呢?

    phonemes_pattern <- paste0(phonemes, collapse = "|")
    stringr::str_extract_all(test1, phonemes_pattern)[[1]]
    
    #[1] "d"  "ɪ"  "d"  "ɛ"  "n"  "ɪ"  "b"  "ɒ"  "d"  "i"  "l" 
    #[12] "iː" "v"  "ð"  "eə" "g"  "l"  "ɑː" "s"  "ɪ"  "z"  "h" 
    #[23] "ɪə" "l"  "ɑː" "s"  "t"  "w"  "iː" "k"  "s"  "ʌ"  "m" 
    #[34] "b"  "ə"  "d"  "i"  "d"  "ɪ"  "d" 
    

    或者在基础 R 中:

    regmatches(test1, gregexpr(phonemes_pattern, test1))[[1]]
    

    【讨论】:

      【解决方案2】:

      只需将lookbehind 更改为lookahead 即可工作

      # using the unchanged phonemes vector
      phonemes_pattern <- paste0(phonemes, collapse = "|")
      str_split(gsub(" ", "", test1), paste0("(?=", phonemes_pattern, ")"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        相关资源
        最近更新 更多