頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


数値などをソートする方法

NSDictionaryを使って数値をソートするってお話だよ。

日本語OCRでカメラで撮影、切り出した画像がデータベース内の多数の画像と比較して類似度を数値かするでしょ。一番数値の高いのがその文字だって流れなんだけど、今のところどうもうまくいかなくてさ。まだひらがなしかデータ化していないんだけど(83個)、1割くらいしか正解しないというレベルなんだよ、まずいね。
このあたりの調査でふと数値をソートしたくなったんだよ。一番類似度が高いのはこのひらがな、二番はこのひらがな、、、って具合に。
ざっくりコードの流れはこんな感じとするよ。
for (ii=0;ii<83;ii++) {
    imageData = [self getImageDataFor:ii];
    score = [self getScoreForData:imageData];
}
なんでひらがなだけで83個なんだよって思うかもしれないけど、「が」とか「ぁ」とか古い「え」なんてもあったりするんだ。でこれらの文字データをカメラで撮影した画像データを全数比較するんだ。実際には全数比較なんてことはしないだろうけどここはまだテストってことで全数やっちゃうよ。
するとそれぞれの類似度みたいなものを示す値が出てくるよね。コード内ではscoreってしてるけど。これをソートしたいわけなんだ。

ソートするためにはスコアと文字(上のコードだとii)の情報をメモする必要があるよね。スコアだけソートしてもそのスコアがどの文字なのかわからなければ意味ないしね。

このソートを実現するのに必要なのがNSSortDescriptorってクラスでこのあたりを調べれば参考コードがすぐに見つかるよ、きっと。
ただ、俺の場合はそれ以前にどうやってスコアと文字(くどいけど上のコードのiiね)をまとめてデータ化すればいいのかというところからわからなかったんだ。
ようやくできたのが下のコード。まずはデータ化する部分。
NSMutableArray *scoreArray = [[NSMutableArray alloc] initWithCapacity:0];
for (ii=0;ii<83;ii++) {
    imageData = [self getImageDataFor:ii];
    score = [self getScoreForData:imageData];
    [scoreArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:ii], @"ii",
[NSNumber numberWithFloat:score],@"score",nil]
    ];
}
scoreArrayって配列に文字ごとにNSDictionaryオブジェクトを突っ込んでるよ。これで一つのNSDictionaryオブジェクトはスコアと文字情報(三回目だけどiiのことね)の両方を持たせることができるんだ。
次は肝心のscoreArrayのソート部分。
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"score" ascending:NO];
NSArray *sortDescriptorArray = [NSArray arrayWithObjects:sortDescriptor, nil];
NSArray *sortArray = [scoreArray sortedArrayUsingDescriptors:sortDescriptorArray];
for (ii=0;ii<5;ii++) {
    NSDictionary *dic = [sortArray objectAtIndex:ii];
    NSLog(@"%f , %d",[[dic objectForKey:@"score"] floatValue], [[dic objectForKey:@"ii"] intValue]);
}
"score"に着目してソートしてよってのが一行目。
そういう条件をいくつも設定して配列に入れられるんだけど、ここでは一つだけなので一つのNSSortDescriptorオブジェクトで配列sortDescriptorArrayを作ってる、ってのが二行目。
三行目でscoreArrayに対してソートの実行ができるよ、と。
そうそう、メモリ管理については記述していない部分もあるので注意してね。

<< 岸和田浪切ホールで腹話術のいっこく堂をみてきた   TopPage  8月の節電結果 >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/647-dd3d5bac




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad