可以比较两个字符串以找到Alliteration和Assonance吗?
我主要使用javascript或php
答案 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
逻辑上,它有助于理解字符串中单词的音节,以便每个单词都可以被解构。音节中断可以解决关于如何发音两个相邻字母的模糊性。这个帖子有几个链接:
答案 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