レベル: 初級 菅野 啓, 事業開発推進 グローバリゼーション技術/ソフトウェア開発研究, IBM
2007年 3月 09日 世の中にひしめく多数のデータのうち8割は構造化されていないデータ(非構造化データ)として存在していると言われています。UIMAはこれらの非構造化データの取り扱いに対して、IBMが示した解のひとつです。本稿ではUIMAの概要を紹介すると共に、サンプルのテキスト分析エンジンを動かしながらUIMAコンポーネントの構成を解説します。
はじめに
データベースやXMLのように諸要素の定義や構成が明確なものは構造化データと呼ばれており、コンピュータ処理の容易さからデータ管理、検索、統計など様々な面での活用技術が開発されてきました。しかし、非構造化データは自由な形式で表現されており、そこに含まれる要素は前後の関係によって定義されているために、これらを有効に活用するのは難しいのが現状です。実際、私たちの身近にあるメールや書類、動画の中に「どのような情報」が「どこに」あるのかは、見て・聴いて・観てみないと分からないことがほとんどです。
UIMAは分析・体系化などを通じて非構造化データから構造的なデータへの橋渡しの役目を果たします。例えばテキストデータの場合、言語判定、単語抽出、正規化、関係性認識などの分析を経て、構造化された検索のインデックスを作成するといった利用がされています。対象となるデータはテキストに限らず、音声、イメージ、動画などさまざまなものを想定しています (図 1)。
図1. UIMA 利用のイメージ (UIMA SDK User's Guide and Reference より抜粋)
UIMA概要
UIMA はUnstructured Information Management Architecture の略称で、その名が表わすように構造化されていない情報を管理するためのアーキテクチャーであり、ソフトウェアのフレームワークです。IBMの研究所で生まれ、2004年にUIMA SDKが一般に公開されました。現在はApache Incubator project に場所を移し、オープンソースとして開発が進められる一方、IBM® OmniFind™ Enterprise Edition をはじめとするIBMのプロダクトでも利用されています。分析に必要なコンポーネントのインターフェース群やデータ構造を定義しており、これらに従うことよりコンポーネントを開発・再利用することが可能になります。UIMA における情報分析の流れは次のようになります (図 2)。
- Collection Reader は 元のデータから分析対象を取得し、CAS (Common Analysis Structure) と呼ばれるデータ構造に変換します。CASはUIMAで利用される共通データ構造で、分析対象と分析結果を保持します。
- Analysis Engine(分析エンジン)がCASを受け取り、分析の結果をCASに追加します。分析エンジンは複数組み合わせて利用することができます。
- CAS Consumer によって分析された結果を保持するCASの情報をデータベースやファイルに格納します。
図2. UIMA のコンポーネントアーキテクチャー (UIMA SDK User's Guide and Reference より抜粋)
UIMA開発環境にはコンポーネントのいくつかの基本的な実装が含まれていますが、公開されているコンポーネントを利用したり、新たに開発したものを追加したりすることが可能です。
分析エンジンは情報分析の核になるコンポーネントで、入力されたデータを分析し、なんらかの情報を付与(アノテーション)する役目を担います。分析エンジンの開発には次の3点が必要です。
- Annotator: 分析のアルゴリズムをもつ。本稿ではJava™で実装しています。
- Type System: 分析エンジンに入出力するCASのタイプやフィーチャーの定義。Type System DescriptorかAnalysis Engine Descriptorに記述する。
- Analysis Engine Descriptor: 利用するAnnotatorの指定やAnnotatorに与えるパラメータの定義・設定、入出力の型指定などを保持する。分析エンジンの仕様を記述するXML。
分析エンジンにはPrimitive型とAggregate型の2種類があります。Primitive型はひとつのAnnotatorからなる分析エンジンです。小さな機能をもつPrimitive型の分析エンジンを開発することにより、 分析エンジンの再利用が容易に行えます。一方Aggregate型は複数の分析エンジンを組み合わせて構成された分析エンジンです。Descriptorに処理の流れを記述することにより複数の分析エンジンを組み合わせたものをひとつのものとして取り扱うことができます。
UIMA SDKのセットアップ
実際の分析エンジンがどのように構成されているかを知るために、UIMA SDKに含まれているサンプルを見ていきます。UIMA SDKは基本的にJava用の開発環境です。本稿では次のような開発環境を用いています。
- Windows® XP
- Java 2 Standard Edition SDK 1.4.x
- Eclipse 3.2.1 + EMF (Eclipse Modeling Framework) Plug-in 2.2.1
- UIMA SDK 1.4.4
UIMA SDK は Alphaworks からダウンロードできます。ここでは Multi-Platform UIMA_SDK_1.4.4.zip を利用してセットアップを行います。まずUIMA_SDK_1.4.4.zipを任意のディレクトリ (例 : D:\UIMA以下%UIMA_SDK%と表記します) に展開します。SDKにはライブラリ、サンプル、ドキュメント、Eclipse Plug-in、環境設定およびサンプル実行用バッチファイル・シェルスクリプトが含まれています (図 3)。
図3. UIMA SDK
次に環境変数を設定します。Java がインストールされているディレクトリをJAVA_HOME に、先ほどUIMA SDKを展開したディレクトリをUIMA_HOME に設定します。Windows環境では「システムのプロパティ」から「詳細設定」→「環境変数」に上記の変数を追加します。環境変数が反映されたら、サンプルのファイルパス修正のため、 %UIMA_HOME%\bin にあるadjustExamplePaths.bat を実行します。
最後にEclipse Plug-in を導入します。UIMA SDK にはEclipse上でUIMAコンポーネントを開発を行うためのPlug-inが用意されています。%UIMA_HOME%eclipsePlugin\uima_1.4.4_EclipsePlugins.zip を展開してできる5つのディレクトリをEclipseがpluginディレクトリに配置します。その後、Eclipse を -clean オプションをつけて起動し、Plug-in Idがcom.ibm.uima.* の5つのPlug-in がインストールされていることが確認できればSDK のセットアップは完了です(図 4)。
図4. help → About Eclipse SDK → Plug-in Details
サンプルの実行
サンプルの分析エンジンと付属のGUIを用いて実際にテキストを分析します。ここでは”Aggregate TAE - Name Recognizer and Person Title Annotator”を利用します。これは簡単な正規表現を用いて固有名詞 (Name)を抽出し、さらに敬称 (PersonTitle)が含まれていれば、その種別 (Kind)を判定するテキスト分析エンジンです。
%UIMA_HOME%\bin\documentAnalyzer.bat を実行してDocumentAnalyzerを起動し、各値を次のように設定します (図 5)。
- Input Directory : %UIMA_HOME%\docs\examples\data
- Output Directory : %UIMA_HOME%\docs\examples\data\processed
- Location of TAE XML Descriptor : %UIMA_HOME%\docs\examples\descriptors\analysis_engine\NamesAndPersonTitles_TAE.xml
図5. Document Analyzer
「Interactive」ボタンをクリックしてAnnotation Input画面を開き、分析したい文章を入力します (図 6)。
図6. Annotation Input
「Analyze」ボタンをクリックすると、分析が始まり、アノテーションの結果が表示されます。AnnotatorはName と PersonTitleを抽出しています。またPersonTitle が "Dr." であるものについてはそのKindがCivilianであると情報が付与されています (図 7)。
図7. Annotation Results
Descriptorから分析エンジンの構成を理解する
TAE (Text Analysis Engine) Descriptorと上記結果を見比べながら、このテキスト分析エンジンがどのように構成されているか簡単に見ていきます。DescriptorにおけるXMLの詳しい定義については付属のUser's Guide and Reference をご参照ください。
Aggregate TAE - Name Recognizer and Person Title Annotator
最初にDocument Analyzer に指定した NamesAndPersonTitles_TAE.xmlから見ていきます。 Descriptorは%UIMA_HOME%\docs\examples\descriptors\analysis_engine以下に配置されています。
リスト 1に分析エンジンの種類が指定されています。Primitive型ではない、つまりAggregate型であるとわかります。また、すぐ下にこのエンジンを構成するものとしてPersonTitleAnnotatorとNameRecognizer の2つが記述されています。具体的な処理についてはこれら2つを記述した個々のDescriptorを参照します。
リスト1. Aggragate Analysie Engineの構成
<primitive>false</primitive>
<delegateAnalysisEngineSpecifiers>
<delegateAnalysisEngine key="PersonTitleAnnotator">
<import location="PersonTitleAnnotator_WithinNamesOnly.xml"/>
</delegateAnalysisEngine>
<delegateAnalysisEngine key="NameRecognizer">
<import location="SimpleNameRecognizer_RegEx_TAE.xml"/>
</delegateAnalysisEngine>
</delegateAnalysisEngineSpecifiers>
|
リスト 2 には集約された分析エンジンの処理の流れが記述されています。NameRecognizer、PersonTitleAnnotatorの順に分析されることがわかります
リスト2. 処理の流れ
<flowConstraints>
<fixedFlow>
<node>NameRecognizer</node>
<node>PersonTitleAnnotator</node>
</fixedFlow>
</flowConstraints>
|
リスト 3で出力タイプがexample.Name と example.PersonTitleであると記述されています。これはAnnotation Resultsに出力されていたアノテーション の種別と一致しています。入力タイプには何も書かれていませんが、uima.tcas.DocumentAnnotationというCASに最初から定義されている文章全体を示すタイプが入力として与えられます。これは文章の開始、終了位置および言語 (Language)をアノテーションするものです。Annotation Resultsにも出力されています。DocumentAnnotationのボタンにチェックを入れると、入力した文章全体が示され、 Document Analyzerの実行時に指定した言語名が付与されています。
リスト3. 入出力タイプの指定
<inputs/>
<outputs>
<type>example.Name</type>
<type allAnnotatorFeatures="true">example.PersonTitle</type>
</outputs>
|
Primitive TAE - Simple Name Recognizer using Regular Expressions
具体的な処理を担当しているNameRecognizerを見ていきます。DescriptorファイルはSimpleNameRecognizer_RegEx_TAE.xml です。
リスト 4はこの分析エンジン がprimitive型で、Annotatorを実装したクラスはcom.ibm.uima.examples.cas.RegExAnnotatorであることを記述しています
リスト4. Primitive TAE の構成
<primitive>true</primitive>
<annotatorImplementationName>
com.ibm.uima.examples.cas.RegExAnnotator
</annotatorImplementationName>
|
Annotatorに渡すパラメータ設定の定義(5.1) と、設定値(5.2)を記述しています。Nameとして認識するのは(5.2)に書かれたJavaの正規表現に一致したものであることが想像できます。
リスト5. パラメータ設定
<configurationParameters>
<configurationParameter> …… (5.1)
<name>Patterns</name>
<description>Regular expression patterns to match. (省略)</description>
<type>String</type>
<multiValued>true</multiValued>
<mandatory>false</mandatory>
</configurationParameter>
....
</configurationParameters>
<configurationParameterSettings>
<nameValuePair> …… (5.2)
<name>Patterns</name>
<value><array>
<string>\p{Upper}\w*(\.?\s\p{Upper}\w*)+</string>
</array></value>
</nameValuePair>
....
</configurationParameterSettings>
|
リスト 6では分析エンジンがCASを通じて入出力するタイプの定義を記述しています。ここではType System Descriptorを別途用意せず、Analysis Engine Descriptor内部にまとめて記載してあります。
SuperTypeNameに指定されているuima.tcas.AnnotationはCASに最初から定義されているタイプのひとつです。beginとend と呼ばれる2つの整数値をもち、Annotation対象の開始・終了位置を示します。uima.tcas.DocumentAnnotationはuima.tcas.Annotationのサブタイプです。
リスト6. Type System 設定
<typeSystemDescription>
<types>
<typeDescription>
<name>example.Name</name>
<description>A proper name.</description>
<supertypeName>uima.tcas.Annotation</supertypeName>
</typeDescription>
</types>
</typeSystemDescription>
|
Primitive TAE - Person Title Annotator - Within Names only
引き続いてPersonTitleAnnotator を見ていきます。Descriptorファイルは PersonTitleAnnotator_WithinNamesOnly.xmlです。こちらもprimitive型の分析エンジンです。
configurationParameter としてCivilianTitles、 MilitaryTitles、 GovernmentTitleがそれぞれ定義されており(7.1)、そこに属する文字列(Dr.、Vice President など) も定義されて(7.2)います。multiValuedがtrueとなっている場合には、複数の値を (arrayで) もつことができます。
リスト7. パラメータ値の複数設定
<configurationParameters>
<configurationParameter> …… (7.1)
<name>CivilianTitles</name>
<description>List of Civilian Titles to be annotated.</description>
<type>String</type>
<multiValued>true</multiValued>
<mandatory>true</mandatory>
</configurationParameter>
....
</configurationParameters>
<configurationParameterSettings>
<nameValuePair> …… (7.2)
<name>CivilianTitles</name>
<value>
<array>
<string>Mr.</string>
<string>Ms.</string>
<string>Mrs.</string>
<string>Dr.</string>
</array>
</value>
</nameValuePair>
...
</configurationParameterSettings>
|
リスト 8のallowedValuesからKindで出力されるのはCivilian、 Military、 Government の3種類であると分かります。
リスト8. 出力フォーマットの指定
<typeDescription>
<name>example.PersonTitleKind</name>
<description>A kind of person title - Civilian, Military, or Government.</description>
<supertypeName>uima.cas.String</supertypeName>
<allowedValues>
<value>
<string>Civilian</string>
<description>Title of a person not in military or government service.</description>
</value>
...
</allowedValues>
</typeDescription>
|
リスト 9を見ると、 NameRecognizerと異なり、capability/inputs の値が指定されていいます。
リスト9. 入出力設定
<inputs>
<type>example.Name</type>
</inputs>
<outputs>
<type>example.PersonTitle</type>
<feature>example.PersonTitle:Kind</feature>
</outputs>
|
実はPersonTitleAnnotatorの実装では、configurationParameterでContainingAnnotationTypeが指定してある場合は、その指定されたタイプの中からPersonTitleを検出するようになっています。このDescriptorの設定では、Nameとして抽出されたものの中にPersonTitleが含まれているかチェックして、含まれている場合にはKindの種別を加えてPersonTitleのAnnotationを付与します。
com.ibm.uima.examples.cas.PersonTitleAnnotatorのソースコードは%UIMA_HOME% docs\examples\srcに含まれています。詳しい実装はそちらをご参照ください。
全体の構成
全体を通じて見てみると、
- NameRecognizerの output に Name が指定されている
- PersonTitleAnnotatorの inputs にNameが指定されている
- Aggregate TAEの処理の順番がNameRecognizer → PersonTitleAnnotator
- PersonTitleAnnotatorの名前が “Within the Name” であること
であったことも相互の分析エンジンの関係から納得できます。全体の構成は図 8のようになっています。
図8. Name Recognizer and Person Title Annotatorの構成
まとめ
本稿ではUIMAの概要を説明しました。また、実際にUIMA上で動作するコンポーネントの例として、テキスト分析エンジンのサンプルを取り上げ、その構成を解説しました。
次回は、このサンプルを参考にして、Eclipse上でテキスト分析エンジンを開発していく手順を紹介します。
参考文献
著者について  | |  | 菅野 啓はソフトウェア開発研究所のエンジニアです。自然言語処理に関するコンポーネント開発と技術支援を行っています。 |
記事の評価
|