2013-03-28 21 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