iphone SDK: разбить китайское предложение на слова и буквы
У меня есть китайская новостная лента, и я хочу разбить предложение на более мелкие куски для передачи в API.
Как я могу сделать это в IOS? Я установил длину символа 50 символов для английского языка.
В настоящее время я использую rangeOfString:
функция, чтобы найти точку, запятую и разбить на предложение.
NSString *str = nil, *rem = nil;
str = [final substringToIndex:MAX_CHAR_Private];
rem = [final substringFromIndex:MAX_CHAR_Private];
NSRange rng = [rem rangeOfString:@"?"];
if (rng.location == NSNotFound) {
rng = [rem rangeOfString:@"!"];
if (rng.location == NSNotFound) {
rng = [rem rangeOfString:@","];
if (rng.location == NSNotFound) {
rng = [rem rangeOfString:@"."];
if (rng.location == NSNotFound) {
rng = [rem rangeOfString:@" "];
}
}
}
}
if (rng.location+1 + MAX_CHAR_Private > MAXIMUM_LIMIT_Private) {
rng = [rem rangeOfString:@" "];
}
if (rng.location == NSNotFound) {
remaining = [[final substringFromIndex:MAX_CHAR_Private] retain];
}
else{
//NSRange rng = [rem rangeOfString:@" "];
str = [str stringByAppendingString:[rem substringToIndex:rng.location]];
remaining = [[final substringFromIndex:MAX_CHAR_Private + rng.location+1] retain];
}
Это не работает правильно для китайских и японских символов.
2 ответа
Проверьте NSLinguisticTagger, он должен работать с китайским:
От Apple: "Класс NSLinguisticTagger используется для автоматического сегментирования текста на естественном языке и маркировки его информацией, такой как части речи. Он также может помечать языки, сценарии, формы слов и т. Д."
Документация Apple Справочник по классу NSLinguisticTagger
Также см. http://nshipster.com/nslinguistictagger/.
Также смотрите objc.io выпуск 7
NSString предоставляет это из коробки с опцией перечисления NSStringEnumerationBySentences:
[string enumerateSubstringsInRange:NSMakeRange(0, [string length])
options:NSStringEnumerationBySentences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop)
{
NSString *sentence = [substring stringByTrimmingCharactersInSet:whiteSpaceSet];
// process sentence
}
];