注: これは、UIMA Ruta で含まれているアノテーションの数に特徴量を設定することに大きく関連しているようです。しかし、私は自分の状況に答えを完全に適用することはできません.
次の構造が想定されるプレーン テキスト ドキュメントを分析しています。
- 書類(もちろん1枚)
- セクション (多数)
- 見出し (セクションごとに 1 つ)
- セクション (多数)
見出しが条件を満たしているかどうかを確認して、セクションを特定するよう求められています。便利で明白な条件の種類は次のとおりです。見出しは指定された正規表現と一致しますか? あまり役に立ちませんが、おそらくより実現可能な条件は次のとおりです:見出しに特定のテキストが含まれているか?
正規表現とセクション タイトルのタプルのリストを取得することで、設計時にリストの各メンバーに対して、次のような方法でこれを実現できました。
BLOCK(forEach) SECTION{} {
...
HEADING{REGEXP(".*table.*contents.*", true) ->
SETFEATURE("value", "Table of Contents")};
...
}
SECTION{ -> SETFEATURE("value", "Table of Contents")}
<- { HEADING.headingValue == "Table of Contents"; };
このアプローチはかなり単純ですが、いくつかの大きな欠点があります。
- DRY原則に大きく違反しています
- 1 つのセクションだけを識別するルールを作成する場合でも、ルール作成者はセクション タイトルを 2 回コピーする必要があります (1 回だけ指定する必要があります)。
- スクリプトが不必要に長くなり、扱いにくくなります
- 理想的なケースでは、Ruta ではなく Regex のみを知る必要があるルールの作成者に大きな負担がかかります。
そこで、次の目標を達成するためにリファクタリングしたいと考えました。
- 正規表現と対応するタイトルを格納するためにテキスト ファイルが使用され、ルールはこれらのペアに対して反復処理されます。
- 異なるセクション/見出しを区別するために、タイプではなく機能が使用されます (つまり、上記のように、 を使用し、使用
SECTION.value=="Table of Contents"
しませんTableOfContentsSection
) 。
UIMA Ruta のリファレンスを調べて、これらの目標を達成するために利用できるオプションを確認した後、次のことに決めました。
- a を使用し
WORDTABLE
てタプルを保存section title, words to find / regex if possible, lookup type
します - たとえば、Table of Contents,contents,sectiontitles
- 機能にセクション タイトルが含まれ、機能に参照のタイプが含ま
MARKTABLE
れる中間注釈タイプをマークするために使用します。LookupMatch
hint
lookup
- 各
HEADING
について、 aが含まれているかどうかを確認し、含まれている場合は、見出しのフィールドLookupMatch.lookup == "sectiontitle"
にコピーします。LookupMatch.hint
value
- 各
SECTION
について、 aHEADING
を含む avalue
が内部にあるかどうかを確認します。value
その場合は、フィールドにコピーしSECTION.value
ます。
手順 3 と 4 の実装がそれほど簡単ではないことがわかったのは、それほど驚くことではありませんでした。それが私がいる場所であり、なぜ私が助けを求めているのかです.
// STEP 1
WORDTABLE Structure_Heading_WordTable =
'/uima/resource/structure/Structure_Heading_WordTable.csv';
// STEP 2
Document.docType == "Contract"{
-> MARKTABLE(LookupMatch, // annotation
2, // lookup column #
Structure_Heading_WordTable, // word table to lookup
true, // case-insensitivity
0, // length before case-insensitivity
"", // characters to ignore
0, // matches to ignore
"hint" = 1, "lookup" = 3 // features
)
};
// STEPS 3 AND 4 ... ???
BLOCK(ForEach) LookupMatch.lookup == "sectiontitle"{} {
???
}
HEADING{ -> SETFEATURE("value", ???)} <- {
???
};
これが私の最初の本当の刺し傷です:
HEADING{ -> SETFEATURE("value", lookupMatchHint)} <- {
LookupMatch.lookup == "HeadingWords"{ -> GETFEATURE("hint", lookupMatchHint)};
};
TL; DR
特徴値をある注釈から別の注釈に条件付きでコピーするにはどうすればよいですか? GETFEATURE
1つしか得られないことを前提としています...