読者です 読者をやめる 読者になる 読者になる

まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを

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