2

注: これは、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"; };

このアプローチはかなり単純ですが、いくつかの大きな欠点があります。

  1. DRY原則に大きく違反しています
  2. 1 つのセクションだけを識別するルールを作成する場合でも、ルール作成者はセクション タイトルを 2 回コピーする必要があります (1 回だけ指定する必要があります)。
  3. スクリプトが不必要に長くなり、扱いにくくなります
  4. 理想的なケースでは、Ruta ではなく Regex のみを知る必要があるルールの作成者に大きな負担がかかります。

そこで、次の目標を達成するためにリファクタリングしたいと考えました。

  • 正規表現と対応するタイトルを格納するためにテキスト ファイルが使用され、ルールはこれらのペアに対して反復処理されます。
  • 異なるセクション/見出しを区別するために、タイプではなく機能が使用されます (つまり、上記のように、 を使用し、使用SECTION.value=="Table of Contents"しませんTableOfContentsSection) 。

UIMA Ruta のリファレンスを調べて、これらの目標を達成するために利用できるオプションを確認した後、次のことに決めました。

  1. a を使用しWORDTABLEてタプルを保存section title, words to find / regex if possible, lookup typeします - たとえば、Table of Contents,contents,sectiontitles
  2. 機能にセクション タイトルが含まれ、機能に参照のタイプが含まMARKTABLEれる中間注釈タイプをマークするために使用します。LookupMatchhintlookup
  3. HEADINGについて、 aが含まれているかどうかを確認し、含まれている場合は、見出しのフィールドLookupMatch.lookup == "sectiontitle"にコピーします。LookupMatch.hintvalue
  4. 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

特徴値をある注釈から別の注釈に条件付きでコピーするにはどうすればよいですか? GETFEATURE1つしか得られないことを前提としています...

4

0 に答える 0