
Apache UIMA は、有用な情報で豊かにされた非構造化データ(テキストなど)の管理を支援します。例えば、テキスト内のエンティティの言及を特定したり、そのエンティティを参照データセットにリンクしたりしたい場合、Apache UIMA は以下を提供します。
なお、Apache UIMA Java SDK は分析機能を構築するためのフレームワークのみを提供し、分析機能そのものは提供しません。ただし、Apache UIMA 上に構築され、分析コンポーネントのコレクションや既製のソリューションを提供するさまざまなサードパーティが存在します。
Apache UIMA v3.6.0 以降では、Java バージョン 17 以降が必要です。
UIMA 用の Eclipse プラグインツールを実行するには、Java 17 以降を使用して Eclipse 4.25 (2022-09) 以降を起動する必要があります。
クラスファイルに対して移行ツールを実行するには、Java JRE ではなく Java JDK で実行する必要があります。
サポートされているプラットフォームは、Windows、Linux、macOS です。他の Java プラットフォーム実装でも動作するはずですが、十分にテストされていません。
/bin ディレクトリ内のスクリプトの多くは Java を呼び出します。これらは環境変数 JAVA_HOME の値を使用して使用する Java を特定します。設定されていない場合は、PATH 変数に適切な Java があることを期待して java を呼び出します。
Apache UIMA Java SDK は、Maven Central からインポートすることで、ほとんどのビルドツールで簡単にプロジェクトに追加できます。例えば、Maven を使用する場合、次の依存関係をプロジェクトに追加できます。
<dependency>
<groupId>org.apache.uima</groupId>
<artifactId>uimaj-core</artifactId>
<version>3.6.0</version>
</dependency>
次に、Apache UIMA Java SDK と Apache uimaFIT ライブラリの使用方法の簡単な例をいくつか示します。Apache uimaFIT は、追加できる別の依存関係です。
<dependency>
<groupId>org.apache.uima</groupId>
<artifactId>uimafit-core</artifactId>
<version>3.6.0</version>
</dependency>
型システムは、非構造化情報(ここではテキストドキュメント)に添付したい情報のタイプを定義します。この例では、エンティティの言及を特定したいので、エンティティが属するカテゴリを格納するために使用できるフィーチャー category を持つ型 my.Entity を定義します。
UIMA がアノテーションスキーマについて内部的に維持する情報を説明するために、生成されたスキーマを XML として画面に出力します。
String TYPE_NAME_ENTITY = "my.Entity";
String TYPE_NAME_TOKEN = "my.Token";
String FEAT_NAME_CATEGORY = "category";
var tsd = UIMAFramework.getResourceSpecifierFactory().createTypeSystemDescription();
tsd.addType(TYPE_NAME_TOKEN, "", CAS.TYPE_NAME_ANNOTATION);
var entityTypeDesc = tsd.addType(TYPE_NAME_ENTITY, "", CAS.TYPE_NAME_ANNOTATION);
entityTypeDesc.addFeature(FEAT_NAME_CATEGORY, "", CAS.TYPE_NAME_STRING);
tsd.toXML(System.out);
次に、分析したいテキストを格納する Common Analysis Structure (CAS) オブジェクトを作成します。
繰り返しになりますが、UIMA が CAS オブジェクトに内部的に格納する情報を説明するために、オブジェクトの XML 表現を画面に出力します。
var cas = CasFactory.createCas(tsd);
cas.setDocumentText("Welcome to Apache UIMA.");
cas.setDocumentLanguage("en");
CasIOUtils.save(cas, System.out, SerialFormat.XMI_PRETTY);
次に、型 my.Entity のアノテーションを作成して、サンプルテキスト内の Apache UIMA の言及を特定します。
最後に、CAS 内のすべてのアノテーションを反復処理して画面に表示します。これには、UIMA によって常に作成されるデフォルトの DocumentAnnotation と、私たちが作成した my.Entity アノテーションの両方が含まれます。
var entityType = cas.getTypeSystem().getType(TYPE_NAME_ENTITY);
var entity = cas.createAnnotation(entityType, 11, 22);
cas.addFsToIndexes(entity);
for (var anno : cas.<Annotation>select(entityType)) {
System.out.printf("%s: [%s]%n", anno.getType().getName(), anno.getCoveredText());
}
異なるタイプの分析をステップに整理するために、通常それらを個々の分析エンジンにパッケージ化します。ここでは、そのようなコンポーネントを構築する方法と、それらを分析パイプラインとして実行する方法を示します。
class TokenAnnotator extends CasAnnotator_ImplBase {
public void process(CAS cas) throws AnalysisEngineProcessException {
var tokenType = cas.getTypeSystem().getType(TYPE_NAME_TOKEN);
var bi = BreakIterator.getWordInstance();
bi.setText(cas.getDocumentText());
int begin = bi.first();
int end;
for (end = bi.next(); end != BreakIterator.DONE; end = bi.next()) {
var token = cas.createAnnotation(tokenType, begin, end);
cas.addFsToIndexes(token);
begin = end;
}
}
}
class EntityAnnotator extends CasAnnotator_ImplBase {
public void process(CAS cas) throws AnalysisEngineProcessException {
var tokenType = cas.getTypeSystem().getType(TYPE_NAME_TOKEN);
var entityType = cas.getTypeSystem().getType(TYPE_NAME_ENTITY);
for (var token : cas.<Annotation>select(tokenType)) {
if (Character.isUpperCase(token.getCoveredText().charAt(0))) {
var entity = cas.createAnnotation(entityType, token.getBegin(), token.getEnd());
cas.addFsToIndexes(entity);
}
}
}
}
cas = CasFactory.createCas(tsd);
cas.setDocumentText("John likes Apache UIMA.");
cas.setDocumentLanguage("en");
var pipeline = AnalysisEngineFactory.createEngineDescription(
AnalysisEngineFactory.createEngineDescription(TokenAnnotator.class),
AnalysisEngineFactory.createEngineDescription(EntityAnnotator.class));
SimplePipeline.runPipeline(cas, pipeline);
for (var anno : cas.<Annotation>select(entityType)) {
System.out.printf("%s: [%s]%n", anno.getType().getName(), anno.getCoveredText());
}
UIMA コンポーネントの設定は、一般に、実行時にコンポーネントをどのようにインスタンス化してデプロイするかをフレームワークに指示する XML 記述子ファイルを作成することで行われます。これらの XML 記述子ファイルは、それらが記述するコンポーネントの Java 実装と非常に密接に結合しています。特にコードのリファクタリングが頻繁に行われる場合、この2つを常に整合させておくことは非常に難しいことがわかっています。uimaFIT は、UIMA コンポーネントを記述するための Java アノテーションを提供し、コード内で UIMA コンポーネントを直接記述できるようにします。これにより、コンポーネント定義のリファクタリング(構成パラメータ名の変更など)が大幅に簡素化されます。また、コード作成と並行して手動で行うのではなく、ビルドサイクルの一部として XML 記述子ファイルを生成することも可能にします。uimaFIT はまた、UIMA コンポーネントのプログラム的/動的インスタンス化を可能にする多数の便利なファクトリメソッドを提供することで、XML 記述子ファイルをまったく使用せずに UIMA コンポーネントを簡単にインスタンス化できるようにします。これにより、記述子ファイルを最初に作成する必要なくコンポーネントを簡単にインスタンス化して呼び出すことができるため、uimaFIT は UIMA コンポーネントのテストに理想的なライブラリとなります。uimaFIT は、パイプラインのプログラム的/動的インスタンス化によって実験を簡素化できる研究環境でも役立ちます。例えば、多数の実験条件にわたって10分割交差検証を実行する場合、実行ごとに異なる記述子ファイルのセットや、そのような記述子ファイルを生成するスクリプトを作成するのは非常に手間がかかります。uimaFIT は型システムに依存せず、特定の型システムに依存(または提供)しません。
uimaFIT は、UIMA 向けのファクトリ、インジェクション、テストユーティリティを提供するライブラリです。次のリストは、uimaFIT が提供する機能の一部を強調しています。
ファクトリ: 記述子ファイルなしで UIMA コンポーネントをプログラムでインスタンス化することを簡素化します。例えば、AnalysisEngine をインスタンス化するには、次のような呼び出しを行うことができます。
AnalysisEngineFactory.createEngine(MyAEImpl.class, myTypeSystem,
paramName1, paramValue2,
paramName2, paramValue2,
...)
インジェクション: 構成パラメータ値と分析エンジン内の対応するメンバー変数とのバインディングを処理し、外部リソースのバインディングも処理します。例えば、構成パラメータをバインドするには、メンバー変数に @ConfigurationParameter のアノテーションを付けるだけです。外部リソースも同様に @ExternalResource アノテーションによって注入できます。次に、初期化メソッドに次の1行のコードを追加します。
ConfigurationParameterInitializer.initialize(this, uimaContext).
これは、uimaFIT の JCasAnnotator_ImplBase クラスを拡張すると自動的に処理されます。
テスト: uimaFIT は、ドキュメントに記載されているいくつかの方法でテストを簡素化します。記述子ファイルなしでコンポーネントを簡単にインスタンス化できるようにすることで、維持が困難で不要な XML の多くをテストコードから排除できます。これにより、テストの作成と維持が容易になります。また、コンポーネントをパイプラインとして実行することも、次のようなメソッド呼び出しで実現できます。
SimplePipeline.runPipeline(reader, ae1, ..., aeN, consumer1, ... consumerN)
uimaFIT は Apache UIMA(TM) プロジェクトの一部です。uimaFIT は、Apache UIMA SDK の Java バージョンと互換性のあるバージョンでのみ使用できます。便宜上、uimaFIT のバイナリ配布パッケージには、uimaFIT を使用するために必要なすべてのライブラリが含まれています。特に初心者のユーザーは、完全な UIMA SDK のコピーを別途入手することを強くお勧めします。
uimaFIT は Maven Central から入手できます。ビルド環境に Maven を使用している場合は、次のように uimaFIT を依存関係として pom.xml ファイルに追加できます。
<dependencies>
<dependency>
<groupId>org.apache.uima</groupId>
<artifactId>uimafit-core</artifactId>
<version>3.6.0</version>
</dependency>
</dependencies>
モジュール
Apache UIMA をビルドするには、少なくとも Java 17 JDK と最近の Maven 3 バージョンが必要です。
ソース配布 ZIP を展開するかリポジトリをクローンした後、作成されたディレクトリに移動して次のコマンドを実行します。
mvn clean install
詳細については、http://uima.apache.org/building-uima.html を参照してください。
ソース配布とバイナリ配布は Apache UIMA ウェブサイト からダウンロードできます。
選択したパッケージ(例: .zip や .gz)から Apache UIMA 配布物を解凍した後、以下の手順を実行して UIMA が適切に機能するように設定します。
JAVA_HOME を UIMA に使用したい JRE インストールのディレクトリに設定します。
UIMA_HOME を解凍した Apache UIMA 配布物の apache-uima ディレクトリに設定します。
UIMA_HOME/bin を PATH に追加します。
スクリプト UIMA_HOME/bin/adjustExamplePaths.bat(または .sh)を実行して、実際の UIMA_HOME ディレクトリパスに基づいて例のパスを更新してください。このスクリプトは Java プログラムを実行します。PATH に java があるか、環境変数 JAVA_HOME を適切な JRE に設定する必要があります。
注: Mac OS X オペレーティングシステムでグローバル環境変数を設定する手順は、http://developer.apple.com/qa/qa2001/qa1067.html で説明されています。
インストールをテストするには、bin サブディレクトリにある documentAnalyzer.bat(または .sh)ファイルを実行します。Document Analyzer ウィンドウが表示されます。この GUI に表示される値を次のように設定します。
UIMA_HOME/examples/dataUIMA_HOME/examples/data/processedUIMA_HOME/examples/descriptors/analysis_engine/PersonTitleAnnotator.xml上記の UIMA_HOME は、Apache UIMA インストールのパスに置き換えてください。
次に、Run ボタンをクリックします。少し待つと、Analyzed Results ウィンドウが表示されます。ドキュメントの1つをダブルクリックすると、そのドキュメントの分析結果が表示されます。
分析ツールを UIMA コンポーネントとして提供する、またはサードパーティの分析ツールを UIMA コンポーネントとしてラップする、よく知られたプロジェクトをいくつか紹介します。
これは網羅的なリストではありません。特定のプロジェクトをここに記載すべきだと感じた場合は、ぜひお知らせください。追加のものは、例えば次の方法で見つけることができます。
Apache UIMA Java SDK は、Java、Groovy、Scala など、Java 仮想マシンに基づくあらゆるプログラミング言語で使用できます。
Python との相互運用性は、例えば、XMI 形式の CAS データの読み取り、操作、書き込みに使用できるサードパーティの DKPro Cassis ライブラリを介して実現できます。
Apache UIMA Java SDK は、UIMA 仕様 の Java ベースの実装です。
質問は [email protected] までお願いします。
学術研究をサポートするために uimaFIT を使用する場合は、以下の論文を適切に引用することを検討してください。
@InProceedings{ogren-bethard:2009:SETQA-NLP,
author = {Ogren, Philip and Bethard, Steven},
title = {Building Test Suites for {UIMA} Components},
booktitle = {Proceedings of the Workshop on Software Engineering, Testing, and Quality Assurance for Natural Language Processing (SETQA-NLP 2009)},
month = {June},
year = {2009},
address = {Boulder, Colorado},
publisher = {Association for Computational Linguistics},
pages = {1--4},
url = {http://www.aclweb.org/anthology/W/W09/W09-1501}
}
2000年代初頭: UIMA は、もともと IBM が非構造化情報(テキスト、音声、ビデオなど)の分析に関する研究の一環として開発しました。自然言語処理 (NLP) アプリケーションを対象に、大量の非構造化データをスケーラブルに処理するように設計されました。
2004年: UIMA はオープンソース化され、IBM 外部からのより広範な利用と貢献が可能になりました。
2006年: UIMA プロジェクトは Apache Incubator に受け入れられ、Apache プロジェクトになる正式なプロセスが開始されました。
2008年: UIMA は Apache Incubator を卒業し、Apache のトップレベルプロジェクトになりました。これは、その成熟度と活発な開発を示しています。
2009年: Apache UIMA-AS (Asynchronous Scaleout) が導入され、UIMA パイプラインの分散および非同期処理が可能になりました。
2012年: uimaFIT が Apache UIMA プロジェクトに貢献されました。Apache uimaFIT は以前 uimaFIT として知られており、その前は UUTUC として知られていました。貢献される前は、コロラド大学デンバーの計算薬理学センター、コロラド大学ボルダーの計算言語・教育研究センター、ダルムシュタット工科大学の Ubiquitous Knowledge Processing (UKP) Lab の共同作業でした。
2013年: UIMA DUCC (Distributed UIMA Cluster Computing) が Apache UIMA のサブプロジェクトとして導入されました。
2016年: Apache UIMA Ruta (Rule-based Text Annotation) が拡張機能として導入され、ルールベースのテキスト処理のためのスクリプト言語が提供されました。
2023年: UIMA DUCC と UIMA-AS は廃止されました。
2024年: uimaFIT は UIMA Java SDK に統合されました。