[WWDC18][iOS 12] NLTaggerを使用して文中の人物、場所、組織を識別する #WWDC18

iOS 12で設定アプリと通知センターにアプリ内の通知設定画面へ遷移するためのボタンを表示できるようになりました。本記事では、アプリ内の通知設定画面への遷移をハンドリングする実装を紹介します。
2018.06.25

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

はじめに

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

前回の記事「NLTaggerを使用して文中の単語の品詞を識別する」に引き続き、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 = "Apple Inc. is an American technology company headquartered in Cupertino, California."

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

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

Apple Inc.: OrganizationName
Cupertino: PlaceName
California: PlaceName

日本語の文章内の人物、場所、組織を識別する

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

let text = "アップルはカリフォルニア州クパチーノに本拠を置くアメリカのテクノロジー企業です。"

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

上記サンプルコードを実行してみましたが結果は0件になりました。

今のところ、日本語で表記された場所/組織などは検出できないようです。

さいごに

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

ドキュメントIdentifying People, Places, and Organizationsでは、以下のような活用例が挙げられています。

  • 人物に関連する連絡先を表示させる
  • その場所までの経路を表示する

これからNatural Language frameworkを触ってみようと思っている方の参考になれば幸いです。

参考資料