[WWDC18][iOS 12] NLTaggerを使用して文中の単語の品詞を識別する #WWDC18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。モバイルアプリサービス部の平屋です。

前回の記事「NLTokenizerを使用して文章から単語を取り出す」に引き続き、iOS 12で追加されたNatural Language frameworkを扱います。

本記事では、NLTaggerを使用して文中の単語の品詞を識別する実装を紹介します。

本記事は Apple からベータ版として公開されているドキュメントを情報源としています。 そのため、正式版と異なる情報になる可能性があります。ご留意の上、お読みください。

検証環境

本記事は以下の環境で検証を行っています。

  • macOS Sierra 10.13.5
  • Xcode Version 10.0 beta 2 (10L177m)
  • iOS Deployment target: 12.0

英語の文章内の品詞を識別する

NLTaggerインスタンスの作成/テキスト設定などを行い、enumerateTags(in:unit:scheme:options:using:)メソッドを呼びます。

let text = "Use the Natural Language framework to perform tasks like language and script identification, tokenization, lemmatization, parts-of-speech tagging, and named entity recognition."

// 1. スキームlexicalClassを指定してNLTaggerインスタンスを作成する
let tagger = NLTagger(tagSchemes: [.lexicalClass])
// 2. テキストを設定する
tagger.string = text
// 3. 句読点/スペースを除外するオプションを作成
let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace]
// 4. enumerateTags(in:unit:scheme:options:using:)を使用してタグ付けされた単語を列挙する
tagger.enumerateTags(in: text.startIndex..<text.endIndex, unit: .word, scheme: .lexicalClass, options: options) { tag, tokenRange in
    if let tag = tag {
        // 5. タグ付けされた単語をprintする
        print("\(text[tokenRange]): \(tag.rawValue)")
    }
    return true
}

上記サンプルコードを実行すると、以下の結果が得られました。

Use: Verb
the: Determiner
Natural: Noun
Language: Noun
framework: Noun
to: Particle
perform: Verb
tasks: Noun
like: Preposition
language: Noun
and: Conjunction
script: Noun
identification: Noun
tokenization: Noun
lemmatization: Noun
parts: Noun
of: Preposition
speech: Noun
tagging: Verb
and: Conjunction
named: Verb
entity: Adjective
recognition: Noun

以下は、英語/日本語の品詞の対応表です。

parts of speech 品詞
Verb 動詞
Determiner 限定詞
Noun 名詞
Particle 接頭辞
Preposition 前置詞
Conjunction 接続詞
Adjective 形容詞

日本語の文章内の品詞を識別する

英語の場合と同様に、テキストだけ変更して検証してみます。

let text = "Natural Languageフレームワークは、言語やスクリプトの識別、トークン化、字形化、品詞タグ付け、名前付きエンティティ認識などのタスクを実行します。"

let tagger = NLTagger(tagSchemes: [.lexicalClass])
tagger.string = text
let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace]
tagger.enumerateTags(in: text.startIndex..<text.endIndex, unit: .word, scheme: .lexicalClass, options: options) { tag, tokenRange in
    if let tag = tag {
        print("\(text[tokenRange]): \(tag.rawValue)")
    }
    return true
}

上記サンプルコードを実行すると、以下の結果が得られました。全て「その他の品詞」に分類されてしまいました。

Natural: OtherWord
Language: OtherWord
フレームワーク: OtherWord
は: OtherWord
言語: OtherWord
や: OtherWord
スクリプト: OtherWord
の: OtherWord
識別: OtherWord
トークン: OtherWord
化: OtherWord
字形: OtherWord
化: OtherWord
品詞: OtherWord
タグ: OtherWord
付け: OtherWord
名前: OtherWord
付き: OtherWord
エンティティ: OtherWord
認識: OtherWord
など: OtherWord
の: OtherWord
タスク: OtherWord
を: OtherWord
実行: OtherWord
し: OtherWord
ます: OtherWord

さいごに

本記事では、NLTaggerを使用して文中の単語の品詞を識別する実装を紹介しました。

次の記事では、NLTaggerを使用して人物、場所、組織を識別する実装を紹介します。

参考資料