INFORMATION
サービス

最新 Apache OpenNLP 1.9.0 で日本語固有表現抽出を試す

Apache OpenNLP を知ってますか。Apache OpenNLP(以下単に OpenNLP と記します)はその名の通り Apache Lucene/Solr と同じように Apache Software Foundation のもとで管理されているオープンソース製品で、自然言語処理のためのツールセットです。

自然言語処理(英語で Natural Language Processing;NLP と略記される)とは、日本語や英語などの自然言語で書かれたテキストを処理するための技術の総称です。文書要約、機械翻訳、形態素解析、構文解析などなどいろいろな NLP のタスクがあります。本記事では OpenNLP の一機能である固有表現抽出について説明します。

固有表現抽出とは

日本語などの自然言語で書かれたテキストには人名、地名、組織名などの固有名詞が含まれています。これらの固有名詞を属性(固有名詞タイプ)付きで抽出する技術が「固有表現抽出」と呼ばれるものです。たとえば、検索エンジンなどのアプリケーションと組み合わせて使うと、検索精度向上に役立てることができます。



固有名詞タイプは、人名など一般的なものから、病名、料理名、イベント名など、アプリケーションに応じてさまざまなタイプを使うことができます。

それでは早速、OpenNLP の固有表現抽出を試してみましょう!

Apache OpenNLP のダウンロード

日本語固有表現抽出が正式サポートされた、今月リリースされたばかりの OpenNLP 1.9.0 を下記サイトからダウンロードします。

https://opennlp.apache.org/download.html

apache-opennlp-1.9.0-bin.tar.gz を選んでダウンロードします。ダウンロードしたらファイルを解凍し、解凍してできたディレクトリに移動します。

モデルファイルのダウンロード

ロンウイットのダウンロードサイトから、日本語固有表現抽出の学習済みモデルファイルをダウンロードします。

rondhuit-ja-ner-1.0.0.zip(Apache License 2.0)

ダウンロードしたZIPファイルは解凍します。以下ではモデルである.binファイルを使います。以上で必要なものはそろいました。では早速固有表現抽出を実行してみましょう!

コマンドラインで固有表現抽出を試す

ますは付属のコマンドラインツールから使ってみるのが簡単でしょう。次のように、TokenNameFinder 起動します。そのときに前の手順でダウンロードしたモデルファイルを引数に指定します。ただし、Java 1.8 以上の環境が必要です。

$ ./bin/opennlp TokenNameFinder rondhuit-ja-ner-1.0.0.bin

そして対象とする日本語文章を入力します。ただし、日本語文章は次のように形態素解析プログラム等であらかじめ単語に分割しておく必要があります。

故障 者 リスト 入り し て い た エンゼルス ・ 大谷 翔 平 投手 ( 2 3 ) が 戦列 復帰 。

モデルファイル rondhuit-ja-ner-1.0.0.bin は学習時に Lucene/Solr に付属している Kuromoji を使用しているので、実行時も同じ Kuromoji を使う必要があります。簡単に試すには、Kuromoji を紹介しているこちらのサイトのデモを使うといいでしょう(ただし、Lucene/Solr に付属している Kuromoji と下記デモサイトの Kuromoji は同じように単語分割されないので、実運用時は注意が必要です)。

https://www.atilika.com/ja/kuromoji/

TokenNameFinder の実行結果は次のようになります。

故障 者 リスト 入り し て い た エンゼルス ・ <START:PERSON> 大谷 翔 平 <END> <START:TITLE> 投手 <END> ( 2 3 ) が 戦列 復帰 。

「大谷翔平」が人名として、また、「投手」がタイトルとして認識されたことがわかります。残念ながら、エンゼルスは組織名とは認識されませんでした。

プログラムから固有表現抽出を試す

上に示したのは、OpenNLP に付属のコマンドラインツールから固有表現抽出を実行する例でした。ただこれではアプリケーションに組み込んで使うには不便です。そこで今度は、OpenNLP で提供されている API を使ってプログラムから固有表現抽出を使う方法を見てみましょう。なお、OpenNLP は Java で書かれており、ここで作るプログラムも Java プログラムとなります。

OpenNLP の API は非常によくできており、固有表現抽出の Java プログラムを作るといっても非常にシンプルです。ここでは先にプログラムを示します。


public class NamedEntitySample {

  public static void main(String[] args) throws Exception {
    String SRC = "故障 者 リスト 入り し て い た エンゼルス ・ 大谷 翔 平 投手 ( 2 3 ) が 戦列 復帰 。";
    String[] sentence = SRC.split("\\s+");

    try (InputStream modelIn = new FileInputStream("ja-ner.bin")){  /* 1 */
      TokenNameFinderModel model = new TokenNameFinderModel(modelIn);
      NameFinderME nameFinder = new NameFinderME(model);            /* 2 */
      Span[] spans = nameFinder.find(sentence);                     /* 3 */
      for(Span span: spans){
        System.out.printf("Span(%d,%d,%s)=\"%s\"\n", span.getStart(), span.getEnd(), span.getType(), str(sentence, span));
      }
    }
  }

  static String str(String[] sentence, Span span){
    StringBuilder sb = new StringBuilder();
    for(int i = span.getStart(); i < span.getEnd(); i++){
      sb.append(sentence[i]);
    }
    return sb.toString();
  }
}

上記プログラムでやっている内容は、次のようにいたってシンプルです。

1.モデルファイルをオープンする。
2.NameFinderMEインスタンス nameFinder を作成する。
3.nameFinder.find() に単語分割済みの文を与えて固有表現抽出を行う。結果は Span クラスのオブジェクトで得られる。
4.(オプション)なお、1つの文書処理が終わったら、nameFinder.clearAdaptiveData() を呼んで文書の終了を知らせる。

このプログラムは1つの文を処理しているだけなので、4の手順を実行していませんが、長い文をまとめて実行するときは、文書間で4の処理を行います。このプログラムの実行結果は次のようになります。

Span(10,13,PERSON)="大谷翔平"
Span(13,14,TITLE)="投手"

性能について

最後に、気になる性能について記して記事を締めくくることにします。OpenNLP のコミッター内で共有されている英語のコーパスを使った測定で、日付抽出の F 値が 0.804、人名が 0.822 という性能が得られています。コーパス CoNLL-2002 のオランダ語の実験では、F 値が0.650〜0.788、スペイン語では0.632〜0.842などとなっています。一方、弊社が独自のコーパスに固有表現タグをつけて測定した結果は、F 値は 0.79 程度と高くないものの、精度は日付で 0.836、地名で 0.880、人名で 0.887 などとなっています。ただし、使用しているコーパスが違うのと、弊社がつけた固有表現タグは量的に十分ではなく、単純な比較は禁物です。また OpenNLP は素性の指定が XML で非常に柔軟にできることも特徴です。本記事では詳細には触れませんが、前述の数値は OpenNLP に付属するデフォルトの素性 XML を使った場合です。コーパスによってよりよい素性を選び、教師データを十分に用意することで、さらなる性能向上ができる余地があります。

まとめ

以上、簡単に OpenNLP を使った日本語固有表現抽出について紹介しました。これまで固有表現抽出といえば、アカデミックな印象が強く、大学の研究室の中での技術という感じでした。いざ業務で使おうとすると、BASIS Technology 社から出ているような製品を購入して使う必要があり、なかなか導入に踏み切れなかった企業も多かったのではないかと思います。それが Apache ライセンスの OSS でできるようになったのですから、一気に敷居が低くなり企業での業務利用もいっそう進んでいくと考えられます。

なお、本記事で紹介している学習済みモデルファイルは、商用利用していただいてかまいません。

本記事が日本語固有表現抽出のユーザー層を広げ、日本で稼働するアプリケーションに OpenNLP が広く使われる一助になればうれしく思います。


トレーニングコース

ロンウイットのトレーニングは、Lucene/Solrの経験豊富なコミッターの
監修のもと開発されたハンズオン(実習)形式のコースです。

セミナー

ロンウイットのApache Software Foundationコミッターが、情報検索の基礎、自然言語処理、そして、ユーザにとっての効果についてご説明させていただきます。