iOS
NSLinguisticTagger

iOSで品詞分解がしたかったときの話 (NSLinguisticTagger)

More than 1 year has passed since last update.

iOSアプリで日本語の品詞分解をしたくて調べたのですが、結局使えなくてYahooが提供している日本語形態素解析APIを利用するに至ったときのメモです。

iOS5.0から文章を分解してくれるNSLinguisticTaggerがというクラスが用意されています。
https://developer.apple.com/documentation/foundation/nslinguistictagger

NSLinguisticTagSchemeLexicalClassがトークンを品詞に分類してくれるスキームらしいので、以下のようなサンプルコードで品詞分解を試してみたところ...

let tagger = NSLinguisticTagger(tagSchemes: [NSLinguisticTagSchemeTokenType, NSLinguisticTagSchemeLanguage, NSLinguisticTagSchemeScript, NSLinguisticTagSchemeLemma, NSLinguisticTagSchemeLexicalClass, NSLinguisticTagSchemeNameType, NSLinguisticTagSchemeNameTypeOrLexicalClass], options: 0)

let str = "Welcome to Wikipedia,the free encyclopedia that anyone can edit. This service is being provided in Austin."
let range = NSRange(location: 0, length: str.characters.count)
tagger.string = str
tagger.enumerateTags(in: range, scheme: NSLinguisticTagSchemeLexicalClass, options: [.omitWhitespace]) { (tag, range1, range2, stop) in
    let nsStr = str as NSString
    print("\(tag) : \(nsStr.substring(with: range1))")
}
Verb : Welcome
Preposition : to
Noun : Wikipedia
Punctuation : ,
Determiner : the
Adjective : free
Noun : encyclopedia
Preposition : that
Noun : anyone
Verb : can
Verb : edit
SentenceTerminator : .

ちゃんと分類してくれました。

ただし、以下のコードで利用可能なスキームを列挙してみるとわかるのですが...
残念ながらNSLinguisticTagSchemeLexicalClassは日本語に対応していないので使えません、無念。

NSLinguisticTagger.availableTagSchemes(forLanguage: "ja").forEach { (klass) in
    print(klass)
}
TokenType
Language
Script
// LexicalClassがない!!!

他にも、何種類か分解用のスキームが用意されていますが、今回は用途に合わなかったので詳しくは見てません。

NSLinguisticTagSchemeNameType

人名、地名、団体名を判別してくれるらしい(けど期待した結果は出せず)

OtherWord : Welcome
OtherWord : to
OtherWord : Wikipedia
Punctuation : ,
OtherWord : the
OtherWord : free
OtherWord : encyclopedia
OtherWord : that
OtherWord : anyone
OtherWord : can
OtherWord : edit
SentenceTerminator : .

NSLinguisticTagSchemeNameTypeOrLexicalClass

NameTypesとLexicalClassのあわせ技

Verb : Welcome
Preposition : to
Noun : Wikipedia
Punctuation : ,
Determiner : the
Adjective : free
Noun : encyclopedia
Preposition : that
Noun : anyone
Verb : can
Verb : edit
SentenceTerminator : .

NSLinguisticTagSchemeTokenType

単語、空白点、空白に分けてくれる

Word : Welcome
Word : to
Word : Wikipedia
Punctuation : ,
Word : the
Word : free
Word : encyclopedia
Word : that
Word : anyone
Word : can
Word : edit
Punctuation : .

NSLinguisticTagSchemeLanguage

BCP-47に従った言語コードを判別してくれる

en : Welcome
en : to
en : Wikipedia
 : ,
en : the
en : free
en : encyclopedia
en : that
en : anyone
en : can
en : edit
 : .

NSLinguisticTagSchemeScript

ISO 1592に従ったコードを判別してくれる

Latn : Welcome
Latn : to
Latn : Wikipedia
 : ,
Latn : the
Latn : free
Latn : encyclopedia
Latn : that
Latn : anyone
Latn : can
Latn : edit
 : .

NSLinguisticTagSchemeLemma

lemma、よくわからず。

welcome : Welcome
to : to
Wikipedia : Wikipedia
 : ,
the : the
free : free
 : encyclopedia
that : that
anyone : anyone
can : can
edit : edit
 : .