代码之家  ›  专栏  ›  技术社区  ›  Chris Ruehlemann

将字符串拆分为音位段

  •  1
  • Chris Ruehlemann  · 技术社区  · 5 年前

    我有语音记录。为了计算音素,我想把字符串分成单个音素段。不幸的是,用于音素的字符之间并没有100%的差异。例如,长/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 = "|"), ")")
    

    这个 split 操作:

    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/音 也是分开的。有人能帮忙吗?

    2 回复  |  直到 5 年前
        1
  •  1
  •   Ronak Shah    5 年前

    为什么不提取 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
  •  1
  •   Abdessabour Mtk    5 年前

    只是改变一下 lookbehind lookahead 让它工作

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