2010-10-21 46 views
2

我在OS X和Objective-C中,我想轉換添加詞語之間的空格spaceless串

例如, 「Bobateagreenapple」

到 「鮑勃吃了綠色蘋果「

有沒有辦法有效地做到這一點?會涉及拼寫檢查工作嗎?

編輯:只是一些額外的信息: 我試圖建立一些需要一些格式錯誤的文本(例如,從舊PDF文件粘貼的文本複製最終沒有空格,尤其是像JSTOR的互聯網檔案)。由於格式錯誤的文本可能會很長...嗯,我只是試圖弄清楚,在我真正嘗試實際編寫系統之前究竟是否可行,只發現需要2個小時才能修復一段文本。

+0

+1非常有趣的問題。我很高興看到這個解決方案,但我想不出來。可以考慮的唯一方法是簡單地瀏覽所有的字母,並在將它與字典比較爲一個完整的單詞時將它切斷,儘管這種方法很快就會失敗。 – DMan 2010-10-21 03:04:50

+7

這也可以解釋爲(「無意識地,無意識地)」鮑勃茶青蘋果「。 – Ferruccio 2010-10-21 03:07:53

+0

@Ferruccio:你已經證明了爲什麼這會充滿麻煩......這只是在這個問題中發佈的示例文本。會有一些真實的例子,它們確實有道理,但仍然是錯誤的。 – 2010-10-21 03:11:34

回答

1

解決這個問題比在框架中找到的任何東西都要困難得多。請注意,即使在你的例子中,還有其他的「解決方案」:例如「鮑勃綠茶蘋果」。

一個非常天真的(而不是非常實用的)方法可能是使用拼寫檢查器來嘗試在字符串中一次隔離一個「真實單詞」;當然,在這個例子中,這隻會起作用,因爲「鮑勃」碰巧是一個英文單詞。

這並不是說沒有辦法完成你想要的東西,但是你用這個問題來表達這個問題的方式表明它可能比你期待的要複雜得多。也許有人可以給你一個可以接受的解決方案,但我敢打賭,他們需要更多地瞭解你正在嘗試做什麼。

編輯:爲了響應您的編輯,在PDF上運行某種OCR工具並更正其輸出可能比僅糾正該系統可能給您的更多功能更不用說編程

+0

它也可能是「Boba茶......「,這是一種非常受歡迎的飲料,確實出現在蘋果口味中,所以ev對短語的發生頻率以及可能出現的情況進行復雜的分析。 – Chuck 2010-10-21 05:17:32

2

我將以非操作系統特定的方式來描述這種情況的一種可能性是對組成字母集合的所有可能字進行搜索。

基本上,你把你的信件收集的第一個字母切掉,並將其添加到你正在形成的當前單詞中。如果它生成一個單詞(例如字典查找),則將它添加到當前句子中。如果你設法用盡你的收藏中的所有字母並形成所有的字母,那麼你有一個完整的句子。但是,你不必在這裏停下來。相反,你繼續跑步,最終你會產生所有可能的句子。

僞代碼將是這個樣子:

FindWords(vector<Sentence> sentences, Sentence s, Word w, Letters l) 
{ 
    if (l.empty() and w.empty()) 
     add s to sentences; 
     return; 
    if (l.empty()) 
     return; 
    add first letter from l to w; 
    if w in dictionary 
    { 
     add w to s; 
     FindWords(sentences, s, empty word, l) 
     remove w from s 
    } 
    FindWords(sentences, s, w, l) 
    put last letter from w back onto l 
} 

有,當然,一些優化,你可以執行,使之走的快。例如檢查該單詞是否是詞典中任何單詞的詞幹。但是,這是能給你所有可能的句子的基本方法。

0

我實現了一個解決方案,代碼是代碼項目avaible:

http://www.codeproject.com/Tips/704003/How-to-add-spaces-between-spaceless-strings

我的想法是優先使用了大部分的字符(最好全部)結果的話,有利於與個位最長的單詞,因爲2,3或4個字符長的單詞往往偶爾會從剩下的字符中出現。大多數情況下,這提供了正確的解決方案。

要找到所有可能的排列我使用遞歸。即使使用大字典(用5萬字測試),代碼速度也相當快。

+0

鏈接只有答案不歡迎在我們的社區。請在這裏添加相關代碼 – FallenAngel 2013-12-31 13:23:11