
[Apache UIMA][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-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>
モジュール