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
: .