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);