9.5 教師あり分類

教師あり分類では、CTX_CLS.TRAINプロシージャを使用してルール記述のステップを自動化します。CTX_CLS.TRAINでは、サンプル・ドキュメントのトレーニング・セットを使用して分類ルールが推定されます。このトレーニング・セットが、ユーザー自身が分類ルールを作成する必要があるルールベース分類と比較して大きなメリットとなります。

ただし、CTX_CLS.TRAINプロシージャを実行する前に、カテゴリを手動で作成し、サンプル・トレーニング・セットの各ドキュメントをカテゴリに割り当てる必要があります。

関連項目:

CTX_CLS.TRAINの詳細は、『Oracle Textリファレンス』を参照してください。

ルールが生成されると、ユーザーがそれを索引付けし、CTXRULE索引を作成します。次に、MATCHES演算子を使用して、新規ドキュメントの着信ストリームを分類できます。

教師あり分類の場合、次の分類アルゴリズムのいずれかを選択できます。

  • 意思決定ツリー教師あり分類

    この分類のメリットは、生成したルールを簡単に監視(または変更)できる点です。

  • SVMベース教師あり分類

    この分類では、サポート・ベクター・マシン(SVM)・アルゴリズムを使用してルールを作成します。この分類のメリットは、通常、意思決定ツリー分類より正確である点です。デメリットは、バイナリ・ルールが生成されるため、ルール自体が不明瞭になる点です。

9.5.1 意思決定ツリー教師あり分類

意思決定ツリー分類を使用するには、CTX_CLS.TRAINのプリファレンス引数をRULE_CLASSIFIER.に設定します

この分類形式では、ルールの作成に意思決定ツリー・アルゴリズムが使用されます。一般的には、意思決定ツリーは2つ(あるいは3つ以上だが、通常は2つ)の選択肢の間で決定するメソッドです。ドキュメント分類では、選択肢は「トレーニング・セットに一致するドキュメント」か「トレーニング・セットに一致しないドキュメント」です。

意思決定ツリーには、テストできる属性のセットがあります。この場合、属性には次のものが含まれています。

  • ドキュメントのワード

  • ドキュメントのワードのステム(たとえば、runningのステムはrun)

  • ドキュメントのテーマ(テーマが使用されている言語でサポートされている場合)

Oracle Textの学習アルゴリズムにより、トレーニング・セットで提供される各カテゴリに対して、1つ以上の意思決定ツリーが作成されます。これらの意思決定ツリーは、CTXRULE索引で適切に使用できるように、問合せにコード化されます。たとえば、あるカテゴリには"日本のカブトムシ"に関するトレーニング・ドキュメントがあり、別のカテゴリには"日本の通貨"に関するトレーニング・ドキュメントがあるという具合です。アルゴリズムでは、"日本"、"カブトムシ"および"通貨"に基づいて意思決定ツリーを作成し、それに応じてドキュメントを分類できます。

意思決定ツリーには、信頼度という概念が含まれます。生成された各ルールには、現行のトレーニング・セットのルールの正確さを表す、パーセンテージ値が割り当てられます。簡単な例では精度はほとんどの場合100パーセントですが、この割合は単にトレーニング・セットの制限事項を表しているにすぎません。同様に、通常のトレーニング・セットで生成されたルールの数がユーザーが予想した数よりも少ない場合がありますが、現行のトレーニング・セットの様々なカテゴリを識別するには十分です。

意思決定ツリー分類のメリットは、ユーザーが簡単に検査したり変更できるルールを生成できる点です。意思決定ツリー分類は、コンピュータでルールを生成した後、ルール・セットを編集してルールを微調整する場合に役立ちます。

9.5.2 意思決定ツリー教師あり分類の例

次のSQL例では、ドキュメントおよび分類表の作成、ドキュメントの分類、およびルールの生成のステップを示します。次に、CTX_CLS.TRAINを使用してルールを生成します。

ルールが索引付けされるとCTXRULE索引が作成され、新規ドキュメントはMATCHESを使用して分類されます。

CTX_CLS.TRAINプロシージャでは、入力トレーニング・ドキュメント・セットが必要です。トレーニング・セットとは、すでにカテゴリに割り当てられたドキュメントのセットです。

ルールを生成した後、最初の索引付けでルールをテストし、次に、MATCHESを使用して新規ドキュメントを分類できます。

カテゴリ・ルールを作成して索引付けするには:

  1. トレーニング・ドキュメントの表を作成してロードします。

    次の例では、3つのファスト・フード関連ドキュメントと2つのコンピュータ関連ドキュメントで構成される単純なセットを使用します。

    create table docs (
      doc_id number primary key,
      doc_text   clob);
    
    insert into docs values
    (1, 'MacTavishes is a fast-food chain specializing in burgers, fries and -
    shakes. Burgers are clearly their most important line.');
    insert into docs values
    (2, 'Burger Prince are an up-market chain of burger shops, who sell burgers -
    and fries in competition with the likes of MacTavishes.');
    insert into docs values
    (3, 'Shakes 2 Go are a new venture in the low-cost restaurant arena, 
    specializing in semi-liquid frozen fruit-flavored vegetable oil products.');
    insert into docs values
    (4, 'TCP/IP network engineers generally need to know about routers, 
    firewalls, hosts, patch cables networking etc');
    insert into docs values
    (5, 'Firewalls are used to protect a network from attack by remote hosts,
     generally across TCP/IP');
    
  2. カテゴリ表、カテゴリ説明およびIDを作成します。

    ----------------------------------------------------------------------------
    -- Create category tables
    -- Note that "category_descriptions" isn't really needed for this demo -
    -- it just provides a descriptive name for the category numbers in
    -- doc_categories
    ----------------------------------------------------------------------------
    
    create table category_descriptions (
      cd_category    number,
      cd_description varchar2(80));
    
    create table doc_categories (
      dc_category    number,
      dc_doc_id      number,
      primary key (dc_category, dc_doc_id)) 
      organization index;
    
    -- descriptions for categories
    
    insert into category_descriptions values (1, 'fast food');
    insert into category_descriptions values (2, 'computer networking');
    
  3. カテゴリへの各ドキュメントの割当て

    この場合、ファスト・フードのドキュメントはすべてカテゴリ1に、コンピュータのドキュメントはカテゴリ2になります。

    insert into doc_categories values (1, 1);
    insert into doc_categories values (1, 2);
    insert into doc_categories values (1, 3);
    insert into doc_categories values (2, 4);
    insert into doc_categories values (2, 5);
    
  4. CTX_CLS.TRAIN.で使用するCONTEXT索引の作成

    テーマをオンにした場合とオフにした場合の効果を試すには、索引のOracle Textプリファレンスを作成します。

    exec ctx_ddl.create_preference('my_lex', 'basic_lexer');
    exec ctx_ddl.set_attribute    ('my_lex', 'index_themes', 'no');
    exec ctx_ddl.set_attribute    ('my_lex', 'index_text',   'yes');
    
    create index docsindex on docs(doc_text) indextype is ctxsys.context
    parameters ('lexer my_lex');
    
  5. 生成したルールに移入するルール表を作成します。

    create table rules(
      rule_cat_id     number,
      rule_text       varchar2(4000),
      rule_confidence number
    );
    
  6. カテゴリ・ルールを生成します。

    すべての引数が、表、列またはこの例で以前に作成された索引の名前であることに注意してください。これにより、rules表にルールが含まれ、ユーザーが表示できるようになります。

    begin
      ctx_cls.train(
        index_name => 'docsindex',
        docid      => 'doc_id',
        cattab     => 'doc_categories',
        catdocid   => 'dc_doc_id',
        catid      => 'dc_category',
        restab     => 'rules',
        rescatid   => 'rule_cat_id',
        resquery   => 'rule_text',
        resconfid  => 'rule_confidence'
      );
    end;
    /
    
  7. カテゴリで表示される生成済ルールのフェッチ

    利便性のため、rules表をcategory_descriptionsと結合して、各ルールが適用されるカテゴリを表示できるようにします。

    select cd_description, rule_confidence, rule_text from rules, 
    category_descriptions where cd_category = rule_cat_id;
  8. CREATE INDEX文を使用し、以前に生成したルールにCTXRULE索引を作成します。

    create index rules_idx on rules (rule_text) indextype is ctxsys.ctxrule;
    
  9. MATCHESを使用して、着信ドキュメントをテストします。

    set serveroutput on;
    declare
       incoming_doc clob;
    begin
       incoming_doc 
           := 'I have spent my entire life managing restaurants selling burgers';
       for c in 
         ( select distinct cd_description from rules, category_descriptions
           where cd_category = rule_cat_id
           and matches (rule_text, incoming_doc) > 0) loop
         dbms_output.put_line('CATEGORY: '||c.cd_description);
       end loop;
    end;
    /

9.5.3 SVMベース教師あり分類

トレーニング目的に使用できる2つ目の方法は、サポート・ベクター・マシン(SVM)分類です。SVMは、統計学習理論から派生した、学習アルゴリズム・タイプのマシンです。SVM分類の特徴は、非常に小さいサンプル・セットから学習する機能です。

SVM分類子を使用すると、意思決定ツリー分類子を使用した場合とほぼ同じ結果が得られますが、次の違いがあります。

  • CTX_CLS.TRAINのコールでは、RULE_CLASSIFIERプリファレンスのかわりにSVM_CLASSIFIERプリファレンスを使用します。(属性を変更しない場合、事前定義済のCTXSYS.SVM_CLASSIFIERプリファレンスを使用します。)

  • 表にCONTEXT索引を移入しない場合は、NOPOPULATEキーワードを使用します。この分類子は、データソースおよびフィルタのプリファレンスによってテキストのソースを検索し、レクサーおよびセクショナのプリファレンスを介してテキストの処理方法を決定する場合にのみ使用されます。

  • 生成されたルール表では、少なくとも次の列を使用します。

    cat_id      number,
    type        number,
    rule        blob;
    

見てわかるように、生成されたルールはBLOB列に書き込まれます。そのため、これはユーザーにはわかりにくく、意思決定ツリー分類ルールの場合とは異なり、編集も変更もできません。ここでのトレードオフは、通常、SVMを使用すると、意思決定ツリー分類を使用した場合よりもはるかに高い正確性が得られる点です。

SVM分類では、割当てメモリーはSVMモデルをロードできる十分な大きさである必要があります。十分でない場合は、SVMに基づいて作成されたアプリケーションでメモリー不足エラーが発生します。メモリー割当ての計算方法は次のとおりです。

Minimum memory request (in bytes) = number of unique categories x number of features 
                                    example: (value of MAX_FEATURES attributes) x 8

最小限のメモリー要件を満たす必要がある場合は、次のメモリーのいずれかを増やします。

  • SGA (共有サーバー・モードの場合)

  • PGA (専用サーバー・モードの場合)

9.5.4 SVMベース教師あり分類の例

この例では、SVMベース分類を使用しています。ステップは、意思決定ツリーの例とほぼ同じですが、次の違いがあります。

  • CTX_CLS.TRAINではなくCTX_DDL.CREATE_PREFERENCEを使用して、SVM_CLASSIFIERプリファレンスを設定します。(どちらでも可能です。)

  • カテゴリ表にカテゴリの説明を含めます。(どちらでも可能です。)

  • ユーザーからはルールが見えないため、CTX_CLS.TRAINで使用する引数の数を少なくしています。

SVMベース教師あり分類を作成するには:

  1. トレーニング・ドキュメント表の作成および移入

    create table doc (id number primary key, text varchar2(2000));
    insert into doc values(1,'1 2 3 4 5 6');
    insert into doc values(2,'3 4 7 8 9 0');
    insert into doc values(3,'a b c d e f');
    insert into doc values(4,'g h i j k l m n o p q r');
    insert into doc values(5,'g h i j k s t u v w x y z');
    
  2. カテゴリ表の作成および移入

    create table testcategory (
            doc_id number, 
            cat_id number, 
            cat_name varchar2(100)
             );
    insert into testcategory values (1,1,'number');
    insert into testcategory values (2,1,'number');
    insert into testcategory values (3,2,'letter');
    insert into testcategory values (4,2,'letter');
    insert into testcategory values (5,2,'letter');
    
  3. ドキュメント表に移入せずにCONTEXT索引を作成します。

    create index docx on doc(text) indextype is ctxsys.context 
           parameters('nopopulate');
    
  4. SVM_CLASSIFIER.の設定

    CTX.CLS_TRAINで設定することもできます。

    exec ctx_ddl.create_preference('my_classifier','SVM_CLASSIFIER'); 
    exec ctx_ddl.set_attribute('my_classifier','MAX_FEATURES','100');
    
  5. 結果(ルール)表の作成

    create table restab (
      cat_id number,
      type number(3) not null,
      rule blob
     );
    
  6. トレーニングの実行

    exec ctx_cls.train('docx', 'id','testcategory','doc_id','cat_id',
         'restab','my_classifier');
    
  7. ルール表のCTXRULE索引の作成

    exec ctx_ddl.create_preference('my_filter','NULL_FILTER');
    create index restabx on restab (rule) 
           indextype is ctxsys.ctxrule 
           parameters ('filter my_filter classifier my_classifier');
    

ここで、次のように2つの未知のドキュメントを分類できます。

select cat_id, match_score(1) from restab 
       where matches(rule, '4 5 6',1)>50;

select cat_id, match_score(1) from restab 
       where matches(rule, 'f h j',1)>50;

drop table doc;
drop table testcategory;
drop table restab;
exec ctx_ddl.drop_preference('my_classifier');
exec ctx_ddl.drop_preference('my_filter');