NSStringをローマ字表記に変換してみる
CFStringTokenizerはトークン分割に非常に役立つAPIです。
分割される様子を見る限り、結構きちんと形態素解析できていると思います。
(もしかしたら、mecab使っているのかな?まぁ、その辺はよくわからないですが、とりあえずおいておきましょう。)
今回そんなCoreFoundationのCFStringTokenizerで、遊んでみます。
目標
すもももももももものうち すもも も もも も もも の うち sumomo mo momo mo momo no uchi
って感じの2項目です。
取得できるローマ字表記は、読み用のものではないので、その点はご留意を。
(助詞の『は』や『へ』は、きちんとトークン分割されますが、『ha』『he』と出力されます)
この点に関しては、もうちょっと調べたいと思います。
ソース
/* * トークン解析に必要なもの */ NSString * testString; CFLocaleRef locale; // ロケール:tokenizer生成に使用 CFRange range; // 解析用範囲:tokenizer生成に使用 : のちに検知されたトークンの範囲用として使用 {//トークン解析に必要なもの:初期化 testString = @"すもももももももものうち"; range = CFRangeMake(0, [testString length]); locale = CFLocaleCopyCurrent();// !!!: 要CFRelease } /* * トークン解析してくれる子 */ CFStringTokenizerRef tokenizer; // トークン解析してくれるよ !!!: 要CFRelease tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, (CFStringRef)testString, range, kCFStringTokenizerUnitWordBoundary, locale); CFStringTokenizerTokenType tokenType; // 見つかったトークンの状態 // 最初に見つかったトークンの状態で初期化 tokenType = CFStringTokenizerGoToTokenAtIndex(tokenizer, 0); /* * トークン毎ループ */ while (tokenType != kCFStringTokenizerTokenNone) { // // range を解析用範囲から見つかったトークンの範囲へと使用方法を変更 // range = CFStringTokenizerGetCurrentTokenRange(tokenizer); CFTypeRef latin; // トークンのローマ字表記 !!!: 要CFRelease latin = CFStringTokenizerCopyCurrentTokenAttribute(tokenizer, kCFStringTokenizerAttributeLatinTranscription); NSLog( @"token:%@ => latin:%@",[testString substringWithRange:NSMakeRange(range.location, range.length)], latin); CFRelease(latin); tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer); } CFRelease(locale); CFRelease(tokenizer);