2013-03-28 20 views
2

我試圖用CFStringTokenizer和kCFStringTokenizerUnitSentence將一個字符串拆分成句子。我遇到的第一個問題是句子需要大寫,以便將它們識別爲句子。如果不是,它只是認爲它是前一句話的一部分。CFStringTokenizer不標記小寫的句子

我正在拆分用戶輸入的文本,因此我期望文本非常不潔。

是否還有其他我可以用CFStringTokenizer做的事情,讓它檢測到非大寫的句子?或者我將不得不使用另一種分裂方法?

我也跟着上了我的實現這太問題的答案: How to get an array of sentences using CFStringTokenizer?


注:「!」測試了一下後,更似乎與kCFStringTokenizerUnitSentence,如果或'?'之後是一個非大寫的句子,它會識別這個句子。另外,如果其中一個標點符號後面跟着一個沒有「!」之間的空格的句子,和第一個字,它仍然會分開。

所以我需要解決的一種情況是'。'其次是一個無大寫的句子。


另一種選擇,我發現,如果你得到從文本框的文本,就是用這樣的:

textField.autocapitalizationType = UITextAutocapitalizationTypeSentences; 

它會自動大寫的句子,所以你不必擔心轉換對於CFStringTokenizer。它仍然沒有考慮像縮寫這樣的邊緣情況,但至少在我的情況下,如果用戶有錯,用戶可以選擇刪除自動大寫。

+0

你需要語言無關的解析嗎?如果不是,你可以用[句子componentsSeparatedByString:@「」]來近似; – danh 2013-03-28 04:42:56

+0

@danh我確實需要語言無關的解析。另外,我需要一些非常強大的東西,因爲絃樂會到處都是。我真的很喜歡覆蓋所有情況(如果存在的話)的開箱即用語句標記器。 – Ramsel 2013-03-28 16:12:44

回答

0

您可以先將輸入字符串轉換爲全部大寫,然後通過CFStringTokenizer運行,然後使用範圍獲取原始輸入字符串的子字符串。但是你必須小心,因爲某些字符在轉換爲大寫字符後可能會超過1個字符。

+0

我一直在推遲真正學習unicode - 是否要注意非英文字符?如重音字符?我確定我可以在網上找到已經編譯過的字符集...... – Ramsel 2013-03-28 16:28:30

+0

找到它了:http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt。看起來他們都是希臘語,拉丁語,立陶宛語或土耳其語。德語有一個字符:'ß'。我沒有實現任何這些語言,所以看起來對於這個項目來說這不會成爲問題。 – Ramsel 2013-03-28 16:47:37

+0

所以我實現了這一點,但當然現在我意識到這樣一個句子,比如「An m.d.命名爲Dr. Jum」。無論我是否大寫單詞然後標記,都會被分割錯誤。我會接受你的答案,因爲它回答了我的問題,但我仍然需要找到一個好的標記器來解釋這樣的邊緣情況。我覺得我已經看到其他編程語言非常強大的句子標記器。 – Ramsel 2013-03-28 17:43:05