macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

NSLinguisticTaggerクラス

INDEX>Foundation>

解説

テキストの形態素解析を行うクラスです。

編集時のバージョン OS X 10.8/iOS 6.1

apple(OS X)
apple(iOS)

継承 NSObject
準拠 NSObject (NSObject)
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 iOS 5.0以降
使用可能 OS X 10.7以降
定義 NSLinguisticTagger.h

概要

本クラスについて

言語タグオブジェクトはテキストの形態素解析を行います。形態素解析とは各言語で意味を持つ最小単位まで分解して品詞の判別などを行うものです。日本語の形態素解析では品詞の他、読み、発声時の読みなどを返すものが多いのですが、このクラスはiOS5.1では形態素の分離のみ行え、品詞の情報などは得られない状態です。品詞情報については英語のみ取得できるようです。

作成

言語タグオブジェクトの作成

言語タグオブジェクトを作成するにはallocで作成した後(– initWithTagSchemes:options)メソッドで初期化します。

#pragma mark NSLinguisticTagger  initWithTagSchemes
-(void)method002
{
    NSString *aString = @"My name is OOMORI satoshi.";
    NSString *targetScheme = NSLinguisticTagSchemeLexicalClass;//品詞。英語のみ,Verb,Noun,SentenceTerminator
    
    
    NSArray *aScheme = [NSArray arrayWithObject:targetScheme];
    NSLinguisticTagger *aTagger = [[NSLinguisticTagger alloc] initWithTagSchemes:aScheme options:0];
    
    //ブロック内での結果を得るためにNSArrayを作っておく
    __block NSMutableArray *tagArray =  [NSMutableArray arrayWithCapacity:0];
    
    [aTagger setString:aString];
    [aTagger enumerateTagsInRange:NSMakeRange(0, [aString length])
                           scheme:targetScheme
                          options:(NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerOmitPunctuation)
                       usingBlock: ^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
                           NSString *token = [aString substringWithRange:tokenRange];
                           NSString *sentence = [aString substringWithRange:sentenceRange];
                           //あとで使うためにNSDictionaryにいれて
                           NSDictionary *aDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                                        tag,@"tag",
                                                        token,@"token",
                                                        sentence,@"sentence",
                                                        nil];
                           //aDictionaryをNSArrayに入れる
                           [tagArray addObject:aDictionary];
                           
                       }
     ];
    
    
    NSLog(@"%s", __FUNCTION__);
    for (NSDictionary *tempDic in tagArray) {
        NSLog(@"tag = %@,token = %@,sentence = %@",[tempDic objectForKey:@"tag"],
              [tempDic objectForKey:@"token"],
              [tempDic objectForKey:@"sentence"]);
    }
    //=>
    
}

タグスキームの取得

タグスキームとは形態素解析する際にどのような情報を取得したいかをシステムに知らせるものです。
タグスキームを得るには(– tagSchemes)メソッドを使用します。指定した言語で有効なスキームを取得するには(+ availableTagSchemesForLanguage:)メソッドを使用します。
iOS5.1において、英語(en)では(TokenType,Language,Script,Lemma,LexicalClass,NameType,NameTypeOrLexicalClass)、日本語(ja)では(TokenType,Language,Script)となっています。

タグスキーム
●NSLinguisticTagSchemeTokenType
トークンのタイプ
例:word, punctuation, whitespace

●NSLinguisticTagSchemeLexicalClass
品詞
例:Determiner,Whitespace,Noun,Verb

●NSLinguisticTagSchemeNameType
名前の分類、個人名、組織名、場所名
例:OtherWord,Whitespace,OrganizationName,SentenceTerminator

●NSLinguisticTagSchemeNameTypeOrLexicalClass
品詞または名前の分類
例:Determiner,Whitespace,Noun,Verb,OrganizationName,SentenceTerminator

●NSLinguisticTagSchemeLemma
語幹。英語のbe動詞の場合はbeが返る。動詞の過去形などの場合は原形が返る
例:be,say

●NSLinguisticTagSchemeLanguage
言語。enとかjaとか
例:en

●NSLinguisticTagSchemeScript
スクリプトコード。LatnやJpanなど
例:Latn

解析文字列の取得と設定

解析をする文字を取得したい場合は(– string)メソッドを使います。解析をする文字をセットしたい場合は(– setString)メソッドを使用します。

言語タグの列挙

言語タグを列挙するには(– enumerateTagsInRange:scheme:options:usingBlock)メソッドを使います。指定した位置のタグを得るには(– possibleTagsAtIndex:scheme:tokenRange:sentenceRange:scores)メソッドを使います。

指定した位置のタグを得るサンプル

#pragma mark NSLinguisticTagger  possibleTagsAtIndex:scheme:tokenRange:sentenceRange:scores:
-(void)method004
{
    NSMutableString *aString = [@"My name is OOMORI satoshi." mutableCopy];
    NSString *targetScheme = NSLinguisticTagSchemeNameTypeOrLexicalClass;
    
    
    NSArray *aScheme = [NSArray arrayWithObject:targetScheme];
    NSLinguisticTagger *aTagger = [[NSLinguisticTagger alloc] initWithTagSchemes:aScheme options:0];
    
    [aTagger setString:aString];
    
    NSInteger searchIndex = 0;
    while (searchIndex < [aString length]) {
     
    NSRange tokenRange;
    NSRange sentenceRange;
        NSArray *scoreArray;
    NSArray *anArray = [aTagger possibleTagsAtIndex:searchIndex
                          scheme:targetScheme
                      tokenRange:&tokenRange
                   sentenceRange:&sentenceRange
                          scores:&scoreArray];
    for (NSString *tag in anArray) {
        NSLog(@"tag = %@",tag);
         
    }
    NSLog(@"(%u-%u)",tokenRange.location,tokenRange.length);
    NSLog(@"%@",[scoreArray description]);
        
        searchIndex +=tokenRange.length;
    }
    NSLog(@"%@",[aTagger string]);
}

指定した位置のタグを得る方法として(– tagAtIndex:scheme:tokenRange:sentenceRange)メソッドがあります。指定した範囲のタグを配列で得る方法として(– tagsInRange:scheme:options:tokenRanges)メソッドがあります。

文の範囲

指定した範囲の文の範囲を得るには(– sentenceRangeForRange)メソッドを使用します。

定数