9 Oracle Textでのドキュメントの分類
Oracle Textは、ドキュメント分類の様々な方法を提供します。
この章のトピックは、次のとおりです:
9.1 ドキュメント分類の概要
各テーマは、単一のワード、単一の句または親テーマの階層リストになります。
莫大な数のドキュメントを選別するために、キーワード検索エンジンを使用できます。ただし、キーワード検索には限界があります。キーワード検索のデメリットの1つが、文脈による識別ができないことです。多くの言語で、1つのワードまたは1つの句に複数の意味があるため、検索すると特定のトピックに関連しないものに多数一致する可能性があります。たとえば、bankというワードには2つの意味があるため、river bankというフレーズに対して問い合せると、Hudson River Bank & Trust Companyに関するドキュメントが戻されることがあります。
あるいは、ドキュメントをソートして、その内容で分類することもできます。このアプローチは、大量のドキュメントには適していません。
Oracle Textは、ドキュメント分類の様々な方法を提供します。ルールベース分類(単純な分類とも呼ばれます)では、ユーザー自身が分類ルールを作成します。教師なし分類では、ユーザーが事前に分類したサンプル・ドキュメント・セットに基づいて、Oracle Textにより分類ルールが作成されます。教師なし分類(またはクラスタリング)では、分類ルールの記述からドキュメントの分類に至るすべてのステップがOracle Textで自動的に実行されます。
9.2 分類アプリケーション
Oracle Textを使用すると、ドキュメントの内容に基づいてアクションを実行するドキュメント分類アプリケーションを構築できます。この処理には、将来の検索で使用するカテゴリIDのドキュメントへの割当てや、ユーザーへのドキュメントの送信などが含まれます。これにより、カテゴリ化されたドキュメントのセットまたはストリームができます。図9-1に、分類プロセスの流れを示します。
Oracle Textを使用すると、ドキュメント分類アプリケーションを様々な方法で作成できます。この章では、典型的な分類方法を定義し、Oracle Textを使用したソリューションの構築方法を説明します。
9.3 分類ソリューション
Oracle Textを使用すると、次の方法でドキュメントを分類できます。
-
ルールベース分類。このソリューションの場合、ドキュメントをグループ化し、カテゴリを選択し、そのカテゴリを定義する(実際には問合せ句となる)ルールを作成します。次に、そのルールに索引を付け、
MATCHES
演算子を使用してドキュメントを分類します。メリット: このソリューションは、ドキュメント・セットが小さい場合は非常に正確です。ユーザーがルールを作成しているため、常にユーザーの定義に基づいた結果が出ます。
デメリット: カテゴリが多数である大きなドキュメント・セットに対してルールを定義する作業は、冗長になる可能性があります。ドキュメント・セットが大きくなるにつれ、対応するルールをさらに作成する必要があります。
-
教師なし分類。このソリューションは、ルールベース分類に似ていますが、ルール記述ステップが
CTX_CLS.TRAIN
で自動化されています。このプロシージャにより、ユーザーが提供する事前分類済のサンプル・ドキュメント・セットから、一連の分類ルールが形成されます。ルールベース分類と同様に、MATCHES
演算子を使用してドキュメントを分類します。Oracle Textには、2つのバージョンの教師あり分類があります。1つは
RULE_CLASSIFIER
プリファレンスを使用したもので、もう1つはSVM_CLASSIFIER
プリファレンスを使用したものです。これらのプリファレンスの詳細は、「教師なし分類」を参照してください。メリット: ルールが自動的に作成されます。この方法は、ドキュメント・セットが大きい場合に役立ちます。
デメリット: ルールを生成する前にドキュメントをカテゴリに割り当てる必要があります。ルールは、ユーザーが自分で作成したものには、特定的または正確ではない場合があります。
-
教師なし分類(クラスタリング)。ドキュメントのグループ化からカテゴリ・ルールの記述まで、すべてのステップが
CTX_CLS.CLUSTERING
で自動化されています。Oracle Textは、ドキュメント・セットを統計的に分析し、内容に従ってそれらをクラスタに関連付けます。メリット:
-
ユーザーが分類ルールや参考用のサンプル・ドキュメントを提供する必要はありません。
-
このソリューションは、ドキュメント・セットで見逃されたパターンおよび内容の類似性の検出に役立ちます。
実際、ルールまたは分類の方法を見出せない場合に、このソリューションを使用できます。たとえば、これを使用して初期のカテゴリ・セットを作成し、そのカテゴリを基にして教師あり分類を行います。
デメリット:
-
クラスタ化は、内部ソリューションに基づいています。クラスタ化処理がユーザー定義ではないため、グループ化が予期しないものになる可能性があります。
-
クラスタを作成するルールは表示できません。
-
クラスタ化はCPU集中型の処理であり、少なくとも索引付けと同じ時間がかかります。
-
9.4 ルールベース分類
ルールベース分類は、Oracle Text分類アプリケーションを作成するための基本的なソリューションです。
ルールベース分類の基本的なステップは、次のとおりです。ステップの詳細は、例で説明します。
-
分類するドキュメント用の表を作成し、それにドキュメントを移入します。
-
ルール表(カテゴリ表ともいう)を作成します。ルール表は、開発者がネーミングしたカテゴリ(「medicine(医学)」または「finance(会計)」など)、およびドキュメントをこれらのカテゴリにソートするルールで構成されます。
これらのルールが実際の問合せとなります。たとえば、"hospital"、"doctor"、"disease"というワードを含むドキュメントとして、"medicine"カテゴリを定義します。したがって、"hospital OR doctor OR disease"という形式でルールを設定します。
-
ルール表で
CTXRULE
索引を作成します。 -
ドキュメントを分類します。
関連項目:
問合せに使用できる演算子の詳細は、「CTXRULEパラメータおよび制限事項」を参照
9.4.1 ルールベース分類の例
この例では、様々な主題に関する新しい記事を収集し、分類します。
ルールを作成したら、それを索引付けし、MATCHES
文を使用してドキュメントを分類できます。
ドキュメントを分類するには:
9.4.2 CTXRULEパラメータおよび制限事項
次の考慮事項は、CTXRULE
索引の索引付けに適用されます。
-
SVM_CLASSIFIER
分類子を使用する場合は、BASIC_LEXER
、CHINESE_LEXER
、JAPANESE_LEXER
またはKOREAN_MORPH_LEXER
レクサーを使用できます。SVM_CLASSIFIER
を使用しない場合は、BASIC_LEXER
レクサー・タイプのみを使用して問合せセットを索引付けできます。 -
filter、memory、datastore、[no]populateの各パラメータは、
CTXRULE
索引タイプには適用できません。 -
CREATE
INDEX
のSTORAGE句は、問合せでCTXRULE索引を作成するためにサポートされています。 -
ワードリストは、問合せセットに対するステミング操作でサポートされています。
-
CTXRULE
に対する問合せは、CONTAINS
問合せと類似しています。CONTAINS
演算子(ABOUT
、AND
、NEAR
、NOT
、OR
、STEM
、WITHIN
およびTHESAURUS
)とともに、基本的な句(dog house)がサポートされています。セクション・グループは、MATCHES
演算子を使用してドキュメントを分類するためにサポートされています。フィールド・セクションもサポートされていますが、CTXRULE
ではフィールド問合せが直接サポートされないため、CONTEXT
問合せに対しては問合せリライトを使用する必要があります。 -
データベースをエクスポートまたはダウングレードする前に、
CTXRULE
索引を削除する必要があります。
関連項目:
-
レクサーおよび分類のプリファレンスの詳細は、『Oracle Textリファレンス』を参照
9.5 教師なし分類
教師あり分類では、CTX_CLS.TRAIN
プロシージャを使用してルール記述のステップを自動化します。CTX_CLS.TRAIN
では、サンプル・ドキュメントのトレーニング・セットを使用して分類ルールが推定されます。このトレーニング・セットが、ユーザー自身が分類ルールを作成する必要があるルールベース分類と比較して大きなメリットとなります。
ただし、CTX_CLS.TRAIN
プロシージャを実行する前に、カテゴリを手動で作成し、サンプル・トレーニング・セットの各ドキュメントをカテゴリに割り当てる必要があります。
ルールが生成されると、ユーザーがそれを索引付けし、CTXRULE
索引を作成します。次に、MATCHES
演算子を使用して、新規ドキュメントの着信ストリームを分類できます。
教師あり分類の場合、次の分類アルゴリズムのいずれかを選択できます。
-
この分類のメリットは、生成したルールを簡単に監視(または変更)できる点です。
-
この分類では、サポート・ベクター・マシン(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
を使用して新規ドキュメントを分類できます。
カテゴリ・ルールを作成して索引付けするには:
-
トレーニング・ドキュメントの表を作成してロードします。
次の例では、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');
-
カテゴリ表、カテゴリ説明および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');
-
カテゴリへの各ドキュメントの割当て
この場合、ファスト・フードのドキュメントはすべてカテゴリ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);
-
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');
-
生成したルールに移入するルール表を作成します。
create table rules( rule_cat_id number, rule_text varchar2(4000), rule_confidence number );
-
カテゴリ・ルールを生成します。
すべての引数が、表、列またはこの例で以前に作成された索引の名前であることに注意してください。これにより、
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; /
-
カテゴリで表示される生成済ルールのフェッチ
利便性のため、
rules
表をcategory_descriptions
と結合して、各ルールが適用されるカテゴリを表示できるようにします。select cd_description, rule_confidence, rule_text from rules, category_descriptions where cd_category = rule_cat_id;
-
CREATE INDEX
文を使用し、以前に生成したルールにCTXRULE
索引を作成します。create index rules_idx on rules (rule_text) indextype is ctxsys.ctxrule;
-
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ベース教師あり分類を作成するには:
-
トレーニング・ドキュメント表の作成および移入
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');
-
カテゴリ表の作成および移入
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');
-
ドキュメント表に移入せずに
CONTEXT
索引を作成します。create index docx on doc(text) indextype is ctxsys.context parameters('nopopulate');
-
SVM_CLASSIFIER.
の設定CTX.CLS_TRAIN
で設定することもできます。exec ctx_ddl.create_preference('my_classifier','SVM_CLASSIFIER'); exec ctx_ddl.set_attribute('my_classifier','MAX_FEATURES','100');
-
結果(ルール)表の作成
create table restab ( cat_id number, type number(3) not null, rule blob );
-
トレーニングの実行。
exec ctx_cls.train('docx', 'id','testcategory','doc_id','cat_id', 'restab','my_classifier');
-
ルール表の
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');
9.6 教師なし分類(クラスタリング)
ルールベース分類の場合は、ユーザー自身がドキュメントを分類するルールを作成します。教師なし分類の場合は、Oracle Textによりルールが作成されますが、事前分類したトレーニング・ドキュメント・セットを提供する必要があります。教師なし分類(またはクラスタリング)では、トレーニング・ドキュメント・セットを提供する必要がありません。
CTX_CLS.CLUSTERING
プロシージャを使用して、クラスタ化が行われます。CTX_CLS.CLUSTERING
により、クラスタと呼ばれるドキュメント・グループの階層が作成され、ドキュメントごとに全リーフ・クラスタの関連性のスコアが戻されます。
たとえば、動物に関するドキュメントの膨大なコレクションがあるとします。CTX_CLS.CLUSTERING
は、犬、猫、魚、熊に関するリーフ・クラスタを個別に作成します。(最初の3つのリーフ・クラスタをペットに関するノード・クラスタの下位にグループ化できます。)さらに、チワワなど、特定の犬種に関するドキュメントがあるとします。CTX_CLS.CLUSTERING
は、関連性スコアの高いドキュメントに犬のクラスタが割り当てられ、猫のクラスタにはそれより低いスコアが割り当てられ、魚と熊のクラスタにはさらに低いスコアが割り当てられます。すべてのクラスタのスコアがすべてのドキュメントに割り当てられると、アプリケーションではスコアに基づいて処理を実行できます。
「意思決定ツリー教師あり分類」に示したように、クラスタの決定に使用される属性は単純なワード(またはトークン)、ワードのステムおよびテーマ(サポートされている場合)で構成されます。
CTX_CLS.CLUSTERING
により、出力は2つの表(インメモリー表)に割り当てられます。
-
各リーフ・クラスタに対するドキュメントの類似性を示すドキュメント割当て表。この情報は、ドキュメント識別、クラスタ識別およびドキュメントとクラスタ間の類似性のスコアで表されます。
-
生成されたクラスタに関する情報が含まれているクラスタ説明表。この表には、クラスタ識別、クラスタ説明テキスト、提示されたクラスタ・ラベル、およびクラスタの品質スコアが含まれます。
CTX_CLS.CLUSTERING
では、K-MEAN
アルゴリズムを使用して、クラスタ化を実行します。KMEAN_CLUSTERING
プリファレンスを使用して、CTX_CLS.CLUSTERING
の操作方法を決定します。
関連項目:
クラスタ・タイプおよび階層的クラスタ化の詳細は、『Oracle Textリファレンス』を参照してください。
9.7 教師なし分類(クラスタリング)の例
このSQL例では、コレクション表でドキュメントの小さなコレクションを作成し、CONTEXT
索引を作成します。次に、ドキュメント割当て表およびクラスタ記述表を作成しますが、これらはCLUSTERING
プロシージャに対するコールを使用して移入されます。出力は、SELECT文を使用して表示されます。
set serverout on /* collect document into a table */ create table collection (id number primary key, text varchar2(4000)); insert into collection values (1, 'Oracle Text can index any document or textual content.'); insert into collection values (2, 'Ultra Search uses a crawler to access documents.'); insert into collection values (3, 'XML is a tag-based markup language.'); insert into collection values (4, 'Oracle Database 11g XML DB treats XML as a native datatype in the database.'); insert into collection values (5, 'There are three Oracle Text index types to cover all text search needs.'); insert into collection values (6, 'Ultra Search also provides API for content management solutions.'); create index collectionx on collection(text) indextype is ctxsys.context parameters('nopopulate'); /* prepare result tables, if you omit this step, procedure will create table automatically */ create table restab ( docid NUMBER, clusterid NUMBER, score NUMBER); create table clusters ( clusterid NUMBER, descript varchar2(4000), label varchar2(200), size number, quality_score number, parent number); /* set the preference */ exec ctx_ddl.drop_preference('my_cluster'); exec ctx_ddl.create_preference('my_cluster','KMEAN_CLUSTERING'); exec ctx_ddl.set_attribute('my_cluster','CLUSTER_NUM','3'); /* do the clustering */ exec ctx_output.start_log('my_log'); exec ctx_cls.clustering('collectionx','id','restab','clusters','my_cluster'); exec ctx_output.end_log;