2012-01-26 31 views

回答

9

我不知道,一個正則表達式將是建設一個強大的比較工具的最佳方式。一個簡單的正則表達式可能是一個更大的解決方案的一部分,它使用更復雜的算法進行非精確匹配。

英語有許多隨時可用的選項,其中一些可以相當簡單地擴展到使用Latin alphabet的語言。這些算法大部分已經存在了幾年甚至幾十年,並且已經有很多文檔記錄,儘管它們都有限制。

我想像有非拉丁字母的類似算法,但我不能直接評論他們的可用性。

語音算法

Soundex算法是近100年的歷史,並已在多種編程語言實現。它用於根據字符串的發音來確定數字值。它不精確,但對識別類似的聲音詞/音節可能很有用。我已經在MS SQL Server中對它進行了試驗,並且它在PHP中可用。

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

普遍的共識(包括PHP文檔)是音位是更準確比探測法與英語打交道時。有許多實現可用(Wikipedia在文章結尾處有很長的列表),它包含在PHP中。

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

雙Metahpone支持對應於該字的一個替代發音一個字的第二編碼。

與Metaphone一樣,Double Metaphone已經在許多編程語言中實現(example)。

字解構

的Levenshtein可以用於建議替換拼寫(例如,歸一化的用戶輸入),並可能作爲一個更精細的算法頭韻和諧音的部分是有用的。

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

從邏輯上講,這將有助於理解單詞的音節劃分字符串中,讓每個字可以被解構。音節中斷可以解決兩個相鄰字母應該如何發音的模糊性。針對這個討論有幾個環節:

PHP Syllable Detection

+0

哇,謝謝您對此主題的完整概述! – Francesco

+2

+1好的答案!作爲一名具有英語學位的程序員,我非常喜歡挖掘您的鏈接! – rdlowrey

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"] 

對於更高級的分析,也發現類韻和押韻你首先必須到文本到語音拼寫翻譯。您沒有說明您的目標語言,因爲英語中有一些語音詞典可在線獲取,例如卡內基梅隆:ftp://ftp.cs.cmu.edu/project/fgdata/dict

相關問題