2009-11-12 106 views
3

我想知道是否有某種方式在PHP中進行模糊字符串匹配。在一串長串中尋找單詞,即使拼寫錯誤也能找到可能的匹配;如果由於OCR錯誤而導致某個字符被關閉,則會發現它。模糊文本搜索:正則表達式通配符搜索生成器?

我在想一個正則表達式生成器可能可以做到這一點。因此給予「瘋狂」會產生這樣的正則表達式的輸入:

.*((crazy)|(.+razy)|(c.+azy)|cr.+zy)|(cra.+y)|(craz.+)).* 

它將然後返回所有匹配該單詞或詞語的變體。

如何建立發電機: 我可能會拆分搜索字符串/字成字符數組,並建立正則表達式表達做一個foreach新創建的數組替換鍵值(字母的位置在字符串中)加上「。+」。

這是做模糊文本搜索的好方法還是有更好的方法?對於某種字符串比較,根據它的接近程度給我一個分數呢?我試圖查看一些轉換不良的OCR文本是否包含一個簡短的單詞。

+2

你的正則表達式是錯誤的 - 更換'+'和'.' – Amarghosh 2009-11-12 08:17:43

+0

謝謝你的提示,固定的問題+ – mikeytown2 2009-11-12 09:01:17

+0

'C + azy'將匹配'calksjdazy' - 'c'後跟一個或多個字符,後跟'azy'。對於單個字符,請使用'c.azy' – Amarghosh 2009-11-13 04:17:16

回答

6

串距離函數是無用的,當你不知道正確的字是什麼。我建議pspell功能:。

$p = pspell_new("en"); 
print_r(pspell_suggest($p, "crazzy")); 

http://www.php.net/manual/en/function.pspell-suggest.php

+0

啊,它表明我是一個PHP新手:我從來沒有聽說過這種方法!優秀的建議,這應該被表決。 +1 – 2009-11-12 09:11:39

+0

+1表示每天都有新的東西可供學習!但是請注意,'pspell_suggest',當給出正確的拼寫單詞時,將不會給你提供拼寫錯誤的選項。因此,它不會真正運行OP的需求。 – 2014-08-13 07:27:00

1

Levenshtein是字符串Edit-distance的一個示例。針對不同目的有不同的指標。熟悉他們並找到適合你的人。

1
echo generateRegex("crazy"); 
function generateRegex($word) 
{ 
    $len = strlen($word); 
    $regex = "\b((".$word.")"; 
    for($i = 0; $i < $len; $i++) 
    { 
    $temp = $word; 
    $temp[i] = '.'; 
    $regex .= "|(".$temp.")"; 
    } 
    $regex = $regex.")\b"; 
    return $regex; 
} 
+0

OP詢問基於PHP的解決方案。 – 2009-11-12 19:13:02

+0

同意。但翻譯這有多困難? – Amarghosh 2009-11-13 04:17:50

+0

已轉換爲php - 點擊差分中的觀點鏈接來查看Java版本。 – Amarghosh 2009-11-13 06:24:30