2012-10-12 40 views
0

想象一下,我們手頭上重新引入空間到文檔

四個得分87年前,我們的先輩在此 大陸一個新的國家,孕育於自由之中來回帶來了一定的參考文本,並熱衷於 命題人人生而平等。現在我們正在進行一場偉大的內戰,測試這個國家或任何國家是如何構思和如此奉獻的,都能長久持久。我們遇到了一場偉大的戰爭戰場。我們已經專門爲這個國家投入了一部分,作爲這個國家可能生活的生命的最後安息之地。 我們應該這樣做是完全合適和適當的。但是,從更大的意義上說,我們不能奉獻,我們可以不奉獻,我們不能把這個理由神聖化。勇敢的人,生活在這裏並且在這裏掙扎的死者已經獻身了,遠遠超過了我們可憐的增加或減損的力量。世界將很少注意,也不會長久記得我們在這裏所說的,但它永遠不會忘記他們在這裏做了什麼。對我們來說,這是 ,而是在這裏致力於未完成的作品 ,他們在這裏戰鬥到目前爲止已經非常高級。這是 而不是我們在這裏致力於我們在 之前剩下的偉大任務 - 從這些榮幸的死者中,我們將更加投入到他們爲之奉獻最後全部獻身精神的原因 - 我們 在這裏高度解決這些死者不應該白白犧牲 - 這個國家在上帝的領導下將有一個新的自由誕生 - 而且人民,人民,人民的政府不應該從地球上滅亡。

,我們收到的文本片段還給我們沒有空格或標點符號,並刪除了一些文字,插入和取代

ieldasafinalrTstingplaceforwhofoughtheregavetheirliZesthatthatn 

使用參考文本都有些什麼工具(在任何編程語言),我們可以用它來正確地嘗試空間的話

ield as a final rTsting place for who fought here gave their liZes that that n 

糾正錯誤是沒有必要的,只是間距

回答

1

奇怪的問題,你已經在那裏:)

如果你不能依靠大寫的提示,只是小寫的一切開始。

然後得到一個單詞字典。也許只是一個wordlist,或者你可以嘗試Wordnet

和一個類似,正確間隔材料的語料庫。如果合適,請下載Wikipedia dump。你需要清理它並分解成ngram。 3克可能適合這項任務。或者節省時間並使用Google的ngram數據。無論是web ngrams(付費)還是book ngrams(免費)。

設置最大字長上限。我們說20個。

取出你神祕字符串的第一個字符並在字典中查找它。然後採取前2個字符,並查找它們。繼續這樣做直到你達到20個。存儲你得到的所有匹配,但最長的一個可能是最好的。一次移動起始點1個字符,通過字符串。

你最終會得到一個有效的單詞匹配數組。

循環遍歷這個新數組,並將每個值與以下值進行配對,並將其與原始字符串進行比較,以便識別所有可能的不重疊的有效字組合。您最終可能會輸出1個或多個字符串。

如果您有幾個,請將每個輸出字符串分解爲3-grams。然後在你的新的ngram數據庫中查找哪些組合是最常見的。

也可能有一些節省時間的技術,例如以停用詞開始,在字典中檢查它們,並在字典中添加增量字母,然後在其中添加空格。

...還是我過thinging整個問題,並有一個awk一個襯墊,有人叫我在用:)

1

爲此,您可以使用編輯距離和發現的最小編輯距離子參考資料。看看我的答案(PHP實現),以一個類似的問題在這裏:

Longest Common Substring with wrong character tolerance

從上面的鏈接使用shortest_edit_substring()功能,可以剝出的一切,但信件後添加此做搜索(或任何你想要保留:字母,數字等),然後將結果正確映射回原始版本。

// map a stripped down substring back to the original version 
function map_substring($haystack_letters,$start,$length,$haystack, $regexp) 
{ 
    $r_haystack = str_split($haystack); 
    $r_haystack_letters = $r_haystack; 
    foreach($r_haystack as $k => $l) 
    { 
     if (preg_match($regexp,$l)) 
     {  
      unset($r_haystack_letters[$k]); 
     }  
    } 
    $key_map = array_keys($r_haystack_letters); 
    $real_start = $key_map[$start]; 
    $real_end = $key_map[$start+$length-1]; 
    $real_length = $real_end - $real_start + 1; 
    return array($real_start,$real_length); 
} 

$haystack = 'Four score and seven years ago our fathers brought forth on this continent a new nation, conceived in liberty, and dedicated to the proposition that all men are created equal. Now we are engaged in a great civil war, testing whether that nation, or any nation, so conceived and so dedicated, can long endure. We are met on a great battle-field of that war. We have come to dedicate a portion of that field, as a final resting place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this. But, in a larger sense, we can not dedicate, we can not consecrate, we can not hallow this ground. The brave men, living and dead, who struggled here, have consecrated it, far above our poor power to add or detract. The world will little note, nor long remember what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us—that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion—that we here highly resolve that these dead shall not have died in vain—that this nation, under God, shall have a new birth of freedom—and that government of the people, by the people, for the people, shall not perish from the earth.'; 

$needle = 'ieldasafinalrTstingplaceforwhofoughtheregavetheirliZesthatthatn'; 

// strip out all non-letters 
$regexp_to_strip_out = '/[^A-Za-z]/'; 

$haystack_letters = preg_replace($regexp_to_strip_out,'',$haystack); 

list($start,$length) = shortest_edit_substring($needle,$haystack_letters); 
list($real_start,$real_length) = map_substring($haystack_letters,$start,$length,$haystack,$regexp_to_strip_out); 

printf("Found |%s| in |%s|, matching |%s|\n",substr($haystack,$real_start,$real_length),$haystack,$needle); 

這也將進行糾錯;它做起來要比不去做更容易。如果您想要比PHP更快的速度,那麼最小編輯距離搜索非常容易在其他語言中實現。