astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

Apache UIMA ちょっと触ってみる

こんにちは、データ周りを担当してる朴です。

本日はJavaで自然言語処理をする為のオープンソースであるApache UIMA(ういま?)をちょっと触ってみたいと思います。

Apache UIMAはIBMが誇る人工知能システムであるWatsonの内部解析エンジンの一部のコード?をオープンソースとして公開してたのがベースとなっています。 現在はOASISという国際的な非営利目的の組織の開発部隊が仕様策定など主導して開発されてるようです。

公式サイトはこちらになります。

Apache UIMA - Apache UIMA

Apache UIMA概要

Apache UIMA(Unstructured Information Management Architectureの略)は名の通り非構造化情報(テキスト、動画、音声など)を解析するして有用な情報を抽出する為のソフトウェアです。 例えばある文章を読み込んでに出てる人名、地名、組織などユーザーにとって有用な情報を抽出し、それらの情報間の関係性を取得することが出来ます。

Apache UIMAプロジェクト中には自然言語処理をするための実行エンジン、解析ツールだけではなく、それらを定義するためのスクリプト言語(UIMA Ruta)、スケーラブルに処理する為のフレームワーク(UIMA-AS,UIMA-DUCC)が含まれてるため、大規模の非構造化テキスト解析処理に向いてます。

f:id:astamuse:20161101144324p:plain

Apache UIMAを使って並列分散処理をする時はHadoopよりDUCCを使ったほうがメリットがあるみたいですね。 詳細は→こちら

ホームページのリリース履歴をみると開発はまあまあ活発に進められてる様子です。
2016/10/28 現在のUIMA SDK 最新バージョンは 2.9.0

それでは、とりあえず触ってみましょう!

Apache UIMA SDKインストール

以下のリンクから最新のSDKをダウンロードする。

Apache UIMA - Downloads

※以下Windows環境を前提に書いてあります。

ダウンロードしたuimaj-2.9.0-bin.zipファイルを指定のディレクトリ(今回はC:\apache-uima)に解凍する。

続いて環境変数に以下を追加

  • UIMA_HOME
    • C:\apache-uima

これでSDKの設定は完了です!

サンプルを動かしてみる

先ほど解凍したSDKのフォルダの配下にexamplesがあるので、それを動かしてみたいと思います。
サンプルを動かす前に上で設定した環境変数を反映させないとうまく立ち上がらないので、反映させる必要があります、反映するにはUIMA_HOME\bin\adjustExamplePaths.batを実行します。

これで最新の環境変数が通ったので同じフォルダ内のdocumentAnalyzer.batを実行すると以下の画面が表示されます。
下記のとおりそれぞれ対応するパスを設定する。

  • Input Director
    • C:\apache-uima\examples\data
  • Input File Format
    • text
  • Character Encoding
    • UTF-8
  • Output Directory
    • C:\apache-uima\bin\examples\data\processed
  • Location of Analysis Engine XML Descriptor
    • C:\apache-uima\examples\descriptors\analysis_engine\UIMA_Analysis_Example.xml
  • Language
    • en

f:id:astamuse:20161028144151p:plain

そしてDocument AnalyzerのRunボタンを押すと以下のように解析結果画面が出るのでその中からApache_UIMA.txt.xmi をダブルクリックして開いてみるとちゃんとAnnotation typeがEmailの部分がハイライトされてることが分かります↓ f:id:astamuse:20161028150600p:plain


Document AnalyzerのInteractiveボタンを押すとテキスト入力画面が出てこちらに解析したい文章を入力することでinteractiveに解析することも可能です。

UIMA Annotatorを書いてみよう

UIMA Annotatorとは?
UIMA framework上実行可能な非構造化情報を解析する為のコンポーネントの一つで、UIMA Analysis Engineは複数のAnnotatorで構成されてます。

Eclipseに必要なプラグインを入れる、詳細は下記参照

Setting up the Eclipse IDE to work with UIMA

どんなAnnotatorを書くのか

公式サンプルのRoomNumberAnnotatorを真似して、以下のような日本語の文章から人名と駅名を取得するAnnotatorを作ってみたいと思います。

例えば「今日は高橋さんと一緒に田中様に会いにJR飯田橋駅まで行きます。」の中で高橋さん、田中様という人の名前とJR飯田橋駅を取得することが出来るAnnotatorを作りたいと思います。

Eclipseプロジェクトを作成

  • File -> New -> Java Project -> TestAnnotatorという名前でプロジェクトを作成する。

  • 上記で作成したプロジェクトを右クリックし、出たメニューから"Add UIMA Nature"を選択する。

  • 再度プロジェクトを右クリックし、出たメニューからBuild Path -> Configure Build Path順に選択する。

  • Librariesタブ -> “Add Variable…” -> “UIMA_HOME"を選択 -> "Extend…"ボタン -> lib配下のuima-core.jarを選択してOK

※以下の図のように設定すればOK f:id:astamuse:20161028165028p:plain

Annotatorを定義する。

  • 上の手順を一通り実行するとプロジェクトのフォルダ構成は以下のようになります。

f:id:astamuse:20161031142940p:plain

  • AnnotatorのDescriptorファイルを定義する
    descフォルダで右クリック -> New -> other -> UIMA配下のAnalysis Engine Descriptor Fileを選択 -> File NameにTestAnnotatorDescriptor.xmlを入力してFinish

  • xml編集画面のOverviewのName of the Java class fileに「org.apache.uima.tutorial.ex1.TestAnnotator」と入力して、Ctrl+sで保存する、この時ClassNotFoundExceptionのエラーが出るが気にせずOK押す。

  • Descriptorファイルに今回取りたいエンティティのTypeを追加する

    • TestAnnotatorDescriptor.xmlをOpen With でComponent Descriptor Editorで開く
    • 人名Type
      • 開いた画面から"TypeSystem"タブを選択→"Add Type"ボタン→Type Nameには"org.apache.uima.tutorial.Name"を設定、Supertypeはデフォルトのまま"uima.tcas.Annotation"にしてOKを押す。
    • 駅名Type
      • 開いた画面から"TypeSystem"タブを選択→"Add Type"ボタン→Type Nameには"org.apache.uima.tutorial.Station"を設定、Supertypeはデフォルトのまま"uima.tcas.Annotation"にしてOKを押す。

f:id:astamuse:20161031143955p:plain

  • 必要なクラスのスケルトンを生成する

上の画面のJCasGenボタンを押すとorg.apache.uima.tutorialパッケージの下に以下の4つのクラスが出来ます。
f:id:astamuse:20161031144436p:plain

  • Annotatorクラスを作る
    org.apache.uima.tutorial.ex1パッケージの下にTestAnnotatorというクラスを作る、Super Classはorg.apache.uima.analysis_component.JCasAnnotator_ImplBaseを設定する。

f:id:astamuse:20161031144827p:plain

ソースは以下

package org.apache.uima.tutorial.ex1;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.uima.analysis_component.JCasAnnotator_ImplBase;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.jcas.JCas;
import org.apache.uima.tutorial.Name;
import org.apache.uima.tutorial.Station;

public class TestAnnotator extends JCasAnnotator_ImplBase {

    // 名前漢字二文字+さん or 様の正規表現
    private Pattern namePattern = Pattern.compile("\\p{InCJKUnifiedIdeographs}{2,}(様|さん)");

    // 駅名の正規表現
    private Pattern stationPattern = Pattern.compile("(JR|地下鉄)[\\p{InCJKUnifiedIdeographs}\\p{InHiragana}]+駅");

    @Override
    public void process(JCas input) throws AnalysisEngineProcessException {
        String docText = input.getDocumentText();

        // 人名の検索
        Matcher matcher = namePattern.matcher(docText);
        int pos = 0;
        while (matcher.find(pos)) {
            Name annotation = new Name(input);
            annotation.setBegin(matcher.start());
            annotation.setEnd(matcher.end());
            annotation.addToIndexes();
            pos = matcher.end();
        }

        // 駅名の検索
        matcher = stationPattern.matcher(docText);
        pos = 0;
        while (matcher.find(pos)) {
            Station annotation = new Station(input);
            annotation.setBegin(matcher.start());
            annotation.setEnd(matcher.end());
            annotation.addToIndexes();
            pos = matcher.end();
        }
    }

}

作ったAnnotatorをテストする

上で作ったプロジェクトを右クリックし、Run As -> Run Configurations -> Java Applicationの中で UIMA CAS Visual Debuggerを選択してClasspathタブを選択→ User Entriesを選択→Add Projects→TestAnnotatorを選択してOK -> Runボタンで実行

※環境によっては以下のエラーが出るので、必要に応じてClasspathのUser EntriesでAdd External JARsから「uima-core.jar,uima-tools.jar」を追加する

「エラー: メイン・クラスorg.apache.uima.tools.cvd.CVDが見つからなかったかロードできませんでした」

CAS Visual DebuggerのGUI画面のRunメニューからLoad AEからTestAnnotatorDescriptor.xmlを選択
以下の文章をTextにコピペして、RunメニューからRun TestAnnotatorDescriptorを実行する。

今日は高橋さんと一緒に田中様に会いにJR飯田橋駅まで行きます。

結果は以下のような感じで名前と駅名がちゃんと取れてますね
f:id:astamuse:20161031154802p:plain

作ったAnnotatorをパッケージングする。

上記で作ったAnnotatorを再利用可能なPEAR(Processing Engine ARchive)形式のファイルにパッケージングします。
TestAnnotatorプロジェクトを右クリック→Generate PEAR fileを選択→Component Descriptorにdescフォルダを設定→ Next → Next → To pear fileに場所とファイル名(TestAnnotator.pear)を入れてFinish→pearファイルが出来上がり

pearファイルのインストールと実行

上記で作ったpearファイルをインストールしてEclipseなしで実行します。
UIMA_HOME/bin/runPearInstaller.batを実行して、下記とおりPEAR Fileと Installation Directoryを設定します。

f:id:astamuse:20161031160148p:plain

Installボタンを押すとInstallが完了した旨のメッセージが出ます。
続いてRun your AE in the CAS Visual DebuggerをクリックするとCAS Visual DebuggerにインストールしたAnntatorがロードされます。
Textエリアに先ほどの文章をコピペして、RunメニューからRun TestAnnotatorDescriptorを実行すると結果が確認できます。

最後に

今回はApache UIMAの簡単の紹介と簡単なAnnotatorを作ってみました。
基本的に公式サイトのドキュメントを参考しながらやってみましたが、特に困ることなくうまく出来ました。
Apache UIMA Rutaとかでもっと面白い解析が出来そうなので、時間があればそちらも触ってみたいところです。
公式ホームページの例とドキュメント類が結構豊富なので、触ってみたい人はぜひ色々触ってみてください。
ではまた次回~

Copyright © astamuse company, ltd. all rights reserved.