Objective-CでYahooテキスト解析APIのキーワード抽出を使う
結果がXMLで出て来るので、それをどう文字列なり配列にするかがキモですね。
didEndElementで出力結果をどう表示させるか設定する場面でミスると、出力結果を最終的に処理する部分で苦労することになるので、そこだけ注意です。
流れとしては、
1.ここの「作ろう」からアプリケーションを登録
2.アプリケーションIDが表示されたら、使いたいAPIのリクエストURLをブラウザに入力してテストしてみる。結果が出たらOK。ただしYahoo検索系のAPIはアップグレード版でないと動かない確率が高い模様です。
例:テキスト解析のキーワード抽出APIを使って「エヴァの劇場版もうすぐ!」を解析する場合は以下を入力
http://jlp.yahooapis.jp/KeyphraseService/V1/extract?appid=1234567&sentence=エヴァの劇場版もうすぐ!
なお、「1234567」には登録したアプリケーションのIDを入力してください。またパラメータはここを参考にしてください。
3.以下のコードを入力
以下のコードの@"Result"と@"Keyphrase"は2.を行うと出てくる「Result」フィールドと「Keyphrase」フィールドです。
・ViewController.h
#import <UIKit/UIKit.h> @interface ViewController : UIViewController <NSXMLParserDelegate> { NSMutableArray *results; BOOL inKeyword; NSMutableString *strKeyword; NSMutableArray *resultArray; } //ボタンを押すと解析開始 - (IBAction)KaisekiStart:(id)sender; @end
・ViewController.m
... - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } //XMLの設定 - (void)loadXML { NSString *kaisekiName = @"エヴァの劇場版もうすぐ!"; //UTF8でエンコードする NSString *encodStr = [kaisekiName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *xmlStr = [NSString stringWithFormat: @"http://jlp.yahooapis.jp/KeyphraseService/V1/extract?appid=1234567&sentence=%@", encodStr]; NSURL *url = [NSURL URLWithString:xmlStr]; //NSXMLParserのインスタンスを生成して初期化 NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; [parser setDelegate:self]; [parser parse]; } // XMLの解析が開始したときに呼ばれる。初期化や解析の準備をする - (void)parserDidStartDocument:(NSXMLParser *)parser { // 初期化処理 results = [NSMutableArray array]; inKeyword = NO; } // 解析終了、UILabel等に表示させたい場合はここに書く - (void)parserDidEndDocument:(NSXMLParser *)parser { //結果を出力する resultArray = [NSMutableArray array]; for (NSString *result in results) { //NSLog(@"%@", result); [resultArray addObject:result]; } NSString *resultArraystr = [resultArray componentsJoinedByString:@","]; NSLog(@"%@",resultArraystr); } // 開始タグが見つかったら行う処理、タグが2つ以上の場合はifの後にelse ifをつける //タグが見つかったらテキストが読み込まれるので、そのテキストを入れておく準備をする - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { if ([elementName isEqualToString:@"Keyphrase"]) { inKeyword = YES; strKeyword = [NSMutableString string]; } } // 終了タグが見つかったら行う処理 //タグが2つ以上の場合はelse ifの後にelse ifをつける - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:@"Result"]) { NSString *resultStr = [NSString stringWithFormat:@"%@",strKeyword]; [results addObject:resultStr]; } else if ([elementName isEqualToString:@"Keyphrase"]) { inKeyword = NO; } } // テキストデータ読み込み - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if (inKeyword) { [strKeyword appendString:string]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)KaisekiStart:(id)sender { [self loadXML]; } @end