3.8 エンティティ抽出およびCTX_ENTITYについて

エンティティ抽出とは、テキスト内の名前付きエンティティを識別および抽出することです。エンティティは、主に名前や場所、時間、コード化された文字列(電話番号や郵便番号など)、割合、金額といった名詞および名詞句です。CTX_ENTITYパッケージは、組込み辞書および英語テキストのルールのセットを使用して、エンティティ抽出を実装します。英語およびその他の言語の機能をユーザー提供のアドオン辞書およびルール・セットにより拡張できます。

関連項目:

この項には次の例が含まれます:

3.8.1 エンティティ抽出の基本的な使用例

この項の例では、エンティティ抽出のごく基本的な例について説明します。この例では、CLOBに次のテキストが含まれていることを前提とします。

New York, United States of America
The Dow Jones Industrial Average climbed by 5% yesterday on news of a new software release from database giant Oracle Corporation.

この例では、CTX_ENTITY.EXTRACTを使用して、CLOB値のエンティティを検索します。(ここでは、テキストがどのようにCLOBになるか、または出力CLOBをどのように提供するかを心配する必要はありません。)

エンティティ抽出には、オプションの指定を可能にする新しいタイプのポリシーの抽出ポリシーが必要です。まず、デフォルトのポリシーを作成します。

ctx_entity.create_extract_policy( 'mypolicy' );

これでextractをコールして作業を実行できるようになりました。これには、ポリシー名、処理するドキュメント、言語および出力CLOBの4つの引数が必要です(たとえば、dbms_lob.createtemporaryコールして初期化しておく必要があります)。

ctx_entity.extract( 'mypolicy', mydoc, 'ENGLISH', outclob )

前述の例では、outclobには抽出されたエンティティを識別するXMLが含まれます。内容を表示すると(適切にフォーマットされるように、XMLTYPEとして選択することをお薦めします)、次のように表示されます。

<entities>
  <entity id="0" offset="0" length="8" source="SuppliedDictionary">
    <text>New York</text>
    <type>city</type>
  </entity>
  <entity id="1" offset="150" length="18" source="SuppliedRule">
    <text>Oracle Corporation</text>
    <type>company</type>
  </entity>
  <entity id="2" offset="10" length="24" source="SuppliedDictionary">
    <text>United States of America</text>
    <type>country</type>
  </entity>
  <entity id="3" offset="83" length="2" source="SuppliedRule">
    <text>5%</text>
    <type>percent</type>
  </entity>
  <entity id="4" offset="113" length="8" source="SuppliedDictionary">
    <text>software</text>
    <type>product</type>
  </entity>
  <entity id="5" offset="0" length="8" source="SuppliedDictionary">
    <text>New York</text>
    <type>state</type>
  </entity>
</entities>

この表示は、XML対応プログラムで処理する場合は問題ありません。ただし、よりSQLフレンドリなビューにする場合は、Oracle XMLデータベース(XML DB)機能を使用して次のように変換します。

select xtab.offset, xtab.text, xtab.type, xtab.source
from xmltable( '/entities/entity'
PASSING xmltype(outclob)
  COLUMNS 
    offset number       PATH '@offset',
    lngth number        PATH '@length',
    text   varchar2(50) PATH 'text/text()',
    type   varchar2(50) PATH 'type/text()',
    source varchar2(50) PATH '@source'
) as xtab order by offset;

次に出力を示します。

    OFFSET TEXT                      TYPE                 SOURCE
---------- ------------------------- -------------------- --------------------
         0 New York                  city                 SuppliedDictionary
         0 New York                  state                SuppliedDictionary
        10 United States of America  country              SuppliedDictionary
        83 5%                        percent              SuppliedRule
       113 software                  product              SuppliedDictionary
       150 Oracle Corporation        company              SuppliedRule

すべてのエンティティ・タイプをフェッチする必要がない場合は、エンティティ・タイプのカンマ区切りのリストを使用して、4番目の引数をextractプロシージャに追加することによりタイプを選択できます。たとえば:

ctx_entity.extract( 'mypolicy', mydoc, 'ENGLISH', outclob, 'city, country' ) 
 
That would give us the XML
 
<entities>
  <entity id="0" offset="0" length="8" source="SuppliedDictionary">
    <text>New York</text>
    <type>city</type>
  </entity>
  <entity id="2" offset="10" length="24" source="SuppliedDictionary">
    <text>United States of America</text>
    <type>country</type>
  </entity>
</entities>

3.8.2 ユーザー定義のルールを使用した新しいエンティティ・タイプの作成例

この項の例では、ユーザー定義のルールを使用して、新しいエンティティ・タイプを作成する方法を示します。正規表現ベースの構文を使用してルールを定義し、そのルールを抽出ポリシーに追加します。このポリシーは使用のたびに適用されます。

次のルールは、次のいずれかの式を照合して株式指数の上昇を識別します。

  climbed by 5%
  increased by over 30 percent
  jumped 5.5%

そのため、エンティティの新しいタイプと、式のいずれかに一致する正規表現を作成する必要があります。

exec ctx_entity.add_extract_rule( 'mypolicy', 1,
    '<rule>'                                                          ||
      '<expression>'                                                  ||
         '((climbed|gained|jumped|increasing|increased|rallied)'      ||
         '( (by|over|nearly|more than))* \d+(\.\d+)?( percent|%))'    ||
      '</expression>'                                                 ||
      '<type>Positive Gain</type>'                                    ||
    '</rule>');

この場合は、ポリシーをCTX_ENTITY.COMPILEでコンパイルする必要があります。

  ctx_entity.compile('mypolicy');

これにより、従来どおりそれを使用できます。

  ctx_entity.extract('mypolicy', mydoc, null, myresults)

次に(短縮した)出力を示します。

<entities>
  ...
  <entity id="6" offset="72" length="18" source="UserRule">
    <text>climbed by over 5%</text>
    <type>Positive Gain</type>
  </entity>
</entities>

最後に、別のユーザー定義のエンティティを追加しますが、この場合は辞書を使用しています。Dow Jonesの個別平均をタイプIndexのエンティティとして認識するとします。S&P 500も同様に追加します。これを実行するには、次を含むXMLファイルを作成します。

<dictionary>
  <entities>
    <entity>
      <value>dow jones industrial average</value>
      <type>Index</type>
    </entity>
    <entity>
      <value>S&amp;P 500</value>
      <type>Index</type>
    </entity>
  </entities>
</dictionary>

このファイルでは大文字/小文字は重要でありませんが、"S&P"の"&"をXMLエンティティ&amp;としてどのように指定する必要があるか注意してください。そうでない場合、XMLは有効ではありません。

このXMLファイルは、CTXLOADユーティリティを使用してシステムにロードされます。ファイルがdict.loadと呼ばれる場合は、次のコマンドを使用します。

ctxload -user username/password -extract -name mypolicy -file dict.load

CTX_ENTITY.COMPILEを使用してポリシーをコンパイルする必要があります。