RegEx:比较两个字符串以查找Alliteration和Assonance

时间:2012-01-26 04:45:43

标签: php javascript regex

可以比较两个字符串以找到Alliteration和Assonance吗?

我主要使用javascript或php

2 个答案:

答案 0 :(得分:9)

我不确定正则表达式是构建强大的比较工具的最佳方式。一个简单的正则表达式可能是更大的解决方案的一部分,该解决方案使用更复杂的算法进行非精确匹配。

英语有多种随时可用的选项,其中一些可以简单地扩展到使用Latin alphabet的语言。大多数这些算法已经存在了数年甚至数十年,并且有很好的文档记录,尽管它们都有限制。

我认为非拉丁字母表有类似的算法,但我无法直接评论它们的可用性。

语音算法

Soundex算法已有近100年的历史,并已用多种编程语言实现。它用于根据字符串的发音确定数值。它不精确,但它可能有助于识别类似的发音词/音节。我在MS SQL Server中进行过实验,它可以在PHP中使用。

http://php.net/manual/en/function.soundex.php

普遍共识(包括PHP文档)是Metaphone在处理英语时比Soundex更准确。有许多可用的实现(维基百科在文章末尾有一个很长的列表),它包含在PHP中。

http://www.php.net/manual/en/function.metaphone.php

Double Metahpone支持对单词的替代发音对应的单词的第二次编码。

与Metaphone一样,Double Metaphone已经用许多编程语言实现(example)。

Word解构

Levenshtein可用于建议替代拼写(例如,规范用户输入),并可能作为更精细的头韵和协调算法的一部分。

http://www.php.net/manual/en/function.levenshtein.php

逻辑上,它有助于理解字符串中单词的音节,以便每个单词都可以被解构。音节中断可以解决关于如何发音两个相邻字母的模糊性。这个帖子有几个链接:

PHP Syllable Detection

答案 1 :(得分:1)

要查找文本中的头韵,您只需迭代所有单词,省略太短和太常见的单词,只要他们的首字母匹配就收集它们。

text = ''
+'\nAs I looked to the east right into the sun,'
+'\nI saw a tower on a toft worthily built;'
+'\nA deep dale beneath a dungeon therein,'
+'\nWith deep ditches and dark and dreadful of sight'
+'\nA fair field full of folk found I in between,'
+'\nOf all manner of men the rich and the poor,'
+'\nWorking and wandering as the world asketh.'

skipWords = ['the', 'and']
curr = []

text.toLowerCase().replace(/\b\w{3,}\b/g, function(word) {
    if (skipWords.indexOf(word) >= 0)
        return;
    var len = curr.length
    if (!len || curr[len - 1].charAt(0) == word.charAt(0))
        curr.push(word)
    else {
        if (len > 2)
            console.log(curr)
        curr = [word]
    }
})

结果:

["deep", "ditches", "dark", "dreadful"]
["fair", "field", "full", "folk", "found"]
["working", "wandering", "world"]

对于更高级的解析以及查找共鸣和押韵,您首先必须将文本翻译成拼音。您没有说出您要定位的语言,因为英语中有一些语音词典可以在线获取,例如来自Carnegie Mellon:ftp://ftp.cs.cmu.edu/project/fgdata/dict