![[WWDC18][iOS 12] NLTaggerを使用して文中の単語の品詞を識別する #WWDC18](https://devio2023-media.developers.io/wp-content/uploads/2018/06/wwdc2018-eyecatch-400x400.jpg)
[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を使用して人物、場所、組織を識別する実装を紹介します。










