首页 > 解决方案 > 使用 R,正则表达式在语料库中查找押韵词

问题描述

我有以下语料库:

corpus_rhyme <- c("helter-skelter", "lovey-dovey", "riff-raff", "hunter-gatherer", 
                  "day-to-day", "second-hand", "chock-a-block")

在所有这些词中,我只需要像“helter-skelter”、“lovey-dovey”和“chock-a-block”这样的词,它们是押韵的重复词,辅音发生了变化。它们通常用连字符拼写,并且在元素之间可能有中间部分,例如“chock-a-block”中的“a”。我只需要找到具有相同音节数的押韵重复表达。例如,虽然“phoney-baloney”是押韵的重复词,但我不需要它。

我正在使用以下代码来查找押韵重复项:

rhyme<- grep("\\b(\\w*)(\\w{2,}?)-(\\w{1,}?-)?\\w*\\2\\b", corpus_rhyme,
             ignore.case = TRUE, perl = TRUE, value = TRUE)

此代码产生太多误报。输出如下:

rhyme
[1] "helter-skelter"  "lovey-dovey"     "riff-raff"       "hunter-gatherer" "day-to-day"      "second-hand"    
[7] "chock-a-block"

我手动筛选出这些误报,这需要太多时间。谁能建议这行代码的更好版本以减少误报的数量?例如,出现“riff-raff”是因为我希望在重复表达式的末尾至少有 2 个最后的字母相同,否则我会错过像“rat-tat”这样的表达式。但是我们是否可以在这段代码中指定这两个字母必须彼此不同,以便找到“rat-tat”(“a”与“t”不同),但找到“riff-raff”(“f”和“f”是一样的)不出现?另一个可能的改进:我怎样才能摆脱两个元素完全相同的“日常”之类的词?我只需要在初始辅音上有差异的押韵重复词。

标签: rregexcorpuslinguisticsfalse-positive

解决方案


如果第一个单词的后三个或更多字母与最后一个单词的后三个或更多字母相同是普遍现象,那么您可以尝试以下操作:

grep(".*(\\w{3,})-([aeiou]-)?(\\w+)(\\1)", corpus_rhyme,ignore.case = TRUE,value=TRUE)

#[1] "helter-skelter" "lovey-dovey"    "chock-a-block"

推荐阅读