ヘッダーをスキップ
Oracle Data Miningアプリケーション開発者ガイド
11g リリース2(11.2)
E57719-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

4 マイニング用のテキストの準備

Oracle Data Miningでは、1つ以上のテキスト列を持つデータセットのマイニングをサポートしています。これらの列は特別な前処理を行い、テキスト・トークン(用語と呼ばれる)を抽出してネストした列に格納する必要があります。この処理で変換されたテキストは、モデルの作成、テストおよびスコアリングで他の属性と同様に使用できるようになります。テキスト・マイニングには、ネストしたデータをサポートする任意のアルゴリズムを使用できます。(詳細は、第3章表3-2を参照。)

この章では、PL/SQLを使用してマイニング用のテキスト列を準備する方法を説明します。


注意:

Oracle Data Miningには、テキスト変換およびテキスト・マイニングをPL/SQL APIで記述したサンプル・プログラムが含まれています。Oracle Data Miningのサンプル・プログラムの詳細は、『Oracle Data Mining管理者ガイド』を参照してください。


関連項目:

テキスト・マイニングの詳細は、『Oracle Data Mining概要』を参照してください。

この章は、次の項で構成されています。

用語抽出用のOracle Textルーチン

Oracle Data Miningでは、特殊なOracle Textのルーチンを使用してテキスト・データを前処理します。Oracle Textは、テキスト問合せおよび分類アプリケーションを作成するデータベースのテクノロジの1つです。

Oracle Textでは、次のようなOracle Data Mining用語抽出プロセスの機能が提供されています。

PL/SQLでデータ準備プロセスを行うには、これらのOracle Text機能を使用する必要があります。(「テキスト変換の使用方法」を参照。)


関連項目:

Oracle Textの詳細は、『Oracle Textアプリケーション開発者ガイド』『Oracle Textリファレンス』を参照してください。


注意:

Oracle Data MiningのOracle Text機能については、この章で説明します。Oracle Text機能の詳細は、Oracle Textのマニュアルには記載されていません。


用語に関する注意:

テキスト用語は、特徴とも呼ばれます。テキスト・マイニングでは、特徴とは、テキスト・ドキュメントから抽出した1つの単語または単語の1グループを指します。特徴(用語)は、操作および分析の対象となるテキストの基本単位です。

特徴抽出のマイニング機能(Oracle Data MiningのNMFアルゴリズム)およびテキスト・マイニング変換は、ともに一種の特徴抽出を行います。

  • 特徴抽出モデルは、複数の属性の基本的な性質を表す特徴を作成します。モデルでは、元の属性の代わりにこの特徴を処理します。

  • テキスト変換によって、テキスト・ドキュメントは機能のまとまりに変更され、それぞれがドキュメントの基本特性を表します。モデルでは、元のドキュメントのかわりにテキスト機能を処理します。


サンプル・プログラムの用語抽出

用語抽出プロセスを理解する手始めとしては、サンプル・プログラムを利用するのが一番です。次のサンプル・プログラムには、テキスト・マイニング用の用語抽出コードが含まれています。

次に示す2つのPL/SQLサンプル・プログラムは、dmsh.sqlによってテキスト・マイニング用に準備されたデータを使用します。

これらのプログラムはどちらも、COMMENTSと呼ばれるネストされたテキスト・データの列を含む顧客データの表をマイニングします。COMMENTS列は、dmsh.sqlによって事前処理されます。これらのプログラムで作成されるモデルを、Linuxシステムの例で次に示します。

-- Run the programs to create the models
SQL> @ $ORACLE_HOME/rdbms/demo/dmtxtnmf.sql
SQL> @ $ORACLE_HOME/rdbms/demo/dmtxtsvm.sql
-- List the models created by the programs
SQL> SELECT model_name, mining_function, algorithm FROM user_mining_models;
 
MODEL_NAME                MINING_FUNCTION              ALGORITHM
------------------------  ---------------------------  ------------------------
T_SVM_CLAS_SAMPLE         CLASSIFICATION               SUPPORT_VECTOR_MACHINES
T_NMF_SAMPLE              FEATURE_EXTRACTION           NONNEGATIVE_MATRIX_FACTOR

関連項目:

『Oracle Data Mining管理者ガイド』。このマニュアルでは、サンプル・プログラムを入手および実行するための手順が説明されています。これらのプログラムで使用する作成、トレーニングおよびスコアリングの各データについても説明されています。

非構造化データから構造化データへ

テキスト・マイニング用の前処理では、VARCHAR2型またはCLOB型の列から、DM_NESTED_NUMERICALS型のネストした表列が作成されます。ネストした表の各行により、属性名と値が特定されます。DM_NESTED_NUMERICALS型では、次の列が定義されています。

attribute_name     VARCHAR2(4000)
value               NUMBER)

用語抽出プロセスでは、元の表の各行のテキストを別個のドキュメントとして扱います。各ドキュメントは、数値およびテキスト・ラベルを持つ用語セットに変換されます。ネストした表列のattribute_name列にはテキストが格納され、value列には、ドキュメントおよび一群のドキュメント(他の行)内の用語の頻出度に基づいて導出される、用語の数値が格納されます。

たとえば、次の問合せでは、顧客102998に関する様々な属性(コメントのテキスト列など)が戻されます。このテキスト列は、変換されていません。

SQL> select cust_id, cust_gender, cust_income_level, affinity_card, comments
             from mining_build_text
             where cust_id = 102998;
 
CUST_ID C  CUST_INCOME_LEVEL     AFFINITY_CARD COMMENTS
------- -- --------------------  ------------- --------------------------------
102998  M  J: 190,000 - 249,999  1             I wanted to write you to let you
                                               know that I've purchased several
                                               items at your store recently and
                                               have been very satisfied with my
                                               purchases. Keep up the good work.
  

次の問合せでは、顧客102998に関する同じ属性が戻されますが、コメント列のテキストは変換されています。この問合せでは、変換されたテキストが格納されるATTRIBUTE_NAME列およびVALUE列がネストした表から抽出されます。

SQL> select b.cust_id, b.cust_gender, b.cust_income_level, b.affinity_card, n.*
             from mining_build_nested_text b,
                  table(b.comments) n
             where b.cust_id = 102998
             order by n.attribute_name;
 
CUST_ID  C  CUST_INCOME_LEVEL    AFFINITY_CARD  ATTRIBUTE_NAME  VALUE
-------  -- -------------------  -------------  --------------  --------
102998   M  J: 190,000 - 249,999  1              GOOD            .26894
102998   M  J: 190,000 - 249,999  1              ITEMS            158062
102998   M  J: 190,000 - 249,999  1              KEEP             238765
102998   M  J: 190,000 - 249,999  1              KNOW              .2006
102998   M  J: 190,000 - 249,999  1              LET              299856
102998   M  J: 190,000 - 249,999  1              PURCHASED        142743
102998   M  J: 190,000 - 249,999  1              PURCHASES        173146
102998   M  J: 190,000 - 249,999  1              RECENTLY        .195223
102998   M  J: 190,000 - 249,999  1              SATISFIED       .355851
102998   M  J: 190,000 - 249,999  1              SEVERAL         .355851
102998   M  J: 190,000 - 249,999  1              STORE          .0712537
102998   M  J: 190,000 - 249,999  1              UP              .159838
102998   M  J: 190,000 - 249,999  1              WANTED          .355851
102998   M  J: 190,000 - 249,999  1              WORK            .299856
102998   M  J: 190,000 - 249,999  1              WRITE           .355851

ATTRIBUTE_NAME列には、元のコメント列から抽出されたテキスト1項目が格納されます。VALUE列には、用語の値が格納されます。ただし、元のコメント列に存在するすべての単語が、用語として抽出されるとは限りません。たとえば、冠詞など(theto)は、抽出の対象にはなりません。

用語抽出プロセスの手順

この項では、用語抽出プロセスの手順を概説します。詳細および特殊な構文での必要事項については、この章の後半で説明します。

作成表のテキスト列の変換

まず、作成データでテキストを変換します。このプロセスでテキスト用語抽出が生成され、これをテストに再利用してデータを適用します。次の手順を実行します。

  1. 作成表のテキスト列の索引を作成します。

  2. 索引のSVM_CLASSIFIERプリファレンスを作成します。

  3. SVM_CLASSIFIER索引で指定したカテゴリを保持する表を定義します。

  4. FEATURE_PREPテーブル・ファンクションを使用して、用語の定義を作成し、中間用語表を移入します。

  5. FEATURE_EXPLAINテーブル・ファンクションを使用して、最終用語表を移入します。

  6. (ビューまたは別の表を使用して)元の作成表の列をレプリケートし、テキスト列をネストした表列と置き換えます。最終用語表からネストした表列に用語をロードします。

テスト表および適用表のテキスト列の変換

テスト・データおよび適用データは、作成データと同じ前処理を行う必要があります。テスト・データおよび適用データを変換するには、作成データ用に生成した用語の定義を再使用します。次の手順を実行します。

  1. テスト表または適用表のテキスト列の索引を作成します。

  2. FEATURE_PREPテーブル・ファンクションを使用して、中間用語表を移入します。作成データ用に以前に生成した用語の定義を使用します。

  3. FEATURE_EXPLAINテーブル・ファンクションを使用して、最終用語表を移入します。

  4. 元のテスト表または適用表の列をレプリケートし、テキスト列をネストした表列と置き換えます。最終用語表からネストした表列に用語をロードします。

索引および索引プリファレンスの作成

Oracle Textプロセスには、テキスト索引が必要になります。Oracle Textでは、テキスト・ドキュメントの問合せ、カタログ化および分類のために、数種類の索引をサポートしています。Oracle Data Miningの用語抽出プロセスでは、テキスト問合せ用にCONTEXT索引が必要になります。

各テキスト列を変換する索引を作成する必要があります。索引を作成するには、次の構文を使用します。

SQL>CREATE INDEX index_name ON table_name(column_name)
                   INDEXTYPE IS ctxsys.context PARAMETERS ('nopopulate');

注意:

この文で作成されるのは、基本的なCONTEXT索引です。CREATE INDEX文に引数を追加することによって、新たに索引の特性を定義できます。詳細は、『Oracle Textリファレンス』を参照してください。

Oracle Textでは、索引のデフォルトの特性をオーバーライドするために索引プリファレンスをサポートしています。特定の名前およびタイプを指定したプリファレンスを作成するには、Oracle TextパッケージCTX_DDLCREATE_PREFERENCEプロシージャを使用します。SVM_CLASSIFIERプリファレンス・タイプでは、Oracle Data Miningの索引の特性を定義します。

作成データを準備する際に、索引プリファレンスを作成する必要があります。索引プリファレンスは、テスト・データおよび適用データを準備する際に再使用されます。索引プリファレンスを作成するには、次の構文を使用します。

SQL>EXECUTE ctx_ddl.create_preference('preference_name', 'SVM_CLASSIFIER');

SVM_CLASSIFIER索引プリファレンスでは、2つの数値列IDおよびCATを持つ事前定義の表を使用します。IDはケースIDを、CATはカテゴリを格納します。カテゴリ表は、内部プロセスで使用されます。カテゴリ表を作成するには、次の構文を使用する必要があります。

SQL>CREATE TABLE category_table_name(id NUMBER, cat NUMBER);

中間用語表の作成

Oracle TextパッケージCTXSYS.DRVODMFEATURE_PREPテーブル・ファンクションは、SVM_CLASSIFIER型の索引プリファレンスを使用して、テキスト列から用語を抽出します。FEATURE_PREPは、作成データから用語定義の表を作成し、テスト・データおよび適用データ用にこれらの定義を再使用します。

FEATURE_PREPは、中間用語表を戻します。

FEATURE_PREPコール構文

FEATURE_PREPは、2つの異なる引数セットを指定できるオーバーロード関数です。作成データ用に1組の引数セットを指定し、テスト・データおよび適用データ用にもう1つの引数セットを指定します。

--- syntax for build data ---
            CTXSYS.DRVODM.FEATURE_PREP (
                   text_index                IN   VARCHAR2,
                   case_id                   IN   VARCHAR2,
                   category_tbl              IN   VARCHAR2,
                   category_tbl_id_col       IN   VARCHAR2,
                   category_tbl_cat_col      IN   VARCHAR2,
                   feature_definition_tbl    IN   VARCHAR2,
                   index_preference          IN   VARCHAR2)
                RETURN DRVODM;

--- syntax for test/apply data ---
           CTXSYS.DRVODM.FEATURE_PREP (
                   text_index                IN   VARCHAR2,
                   case_id                   IN   VARCHAR2,
                   feature_definition_tbl    IN   VARCHAR2,
                RETURN DRVODM;

FEATURE_PREPの戻り値

FEATURE_PREPは、次の列を戻します。SEQUENCE_ID列にはケースID、ATTRIBUTE_ID列には用語IDが格納されます。

Name                   NULL?   Type
---------------------- ------- ------
SEQUENCE_ID                    NUMBER
ATTRIBUTE_ID                   NUMBER
VALUE                          NUMBER

FEATURE_PREPの引数

FEATURE_PREPでは、表4-1に示す引数を指定できます。

表4-1 FEATURE_PREPテーブル・ファンクションの引数

引数名 データ型

text_index

VARCHAR2

作成表、テスト表または適用表におけるテキスト列の索引の名前。

case_ID

VARCHAR2

作成表、テスト表または適用表におけるケースID列の名前。

category_tbl

VARCHAR2

SVM_CLASSIFIER索引プリファレンスで使用する表の名前。

作成データでのみ指定。

category_tbl_id_col

VARCHAR2

'id'を指定。これは、SVM_CLASSIFIER索引プリファレンスで使用する表のID列の名前。

作成データでのみ指定。

category_tbl_cat_col

VARCHAR2

'cat'を指定。これは、SVM_CLASSIFIER索引プリファレンスで使用する表のCAT列の名前。

作成データでのみ指定。

feature_definition_tbl

VARCHAR2

FEATURE_PREPによって作成される用語定義表の名前。用語定義表の列は次のとおり。

Name         Null?     Type
---------------------------------
CAT_ID                   NUMBER
TYPE                     NUMBER
RULE                     BLOB

index_preference

VARCHAR2

SVM_CLASSIFIER索引プリファレンスの名前。

作成データでのみ指定。


FEATURE_PREPの例

次の例では、txt_term_outと呼ばれる中間用語表を作成しています。FEATURE_PREPテーブル・ファンクションは、build_text_idxと呼ばれる索引を持つテキスト列から用語を抽出します。テキスト列は、cust_idと呼ばれるケースID列を持つ作成表にあります。索引プリファレンスtxt_prefは、表cat_tblid列およびcat列を使用して索引に適用されます。FEATURE_PREPは、txt_pref_termsと呼ばれる用語定義の表を作成します。

CREATE TABLE txt_term_out AS
SELECT *
  FROM TABLE(ctxsys.drvodm.feature_prep (
               'build_text_idx',
               'cust_id',
               'cat_tbl',
               'id',
               'cat',
               'txt_pref_terms',
               'txt_pref'));

最終用語表の作成

Oracle TextパッケージCTXSYS.DRVODMFEATURE_EXPLAINテーブル・ファンクションは、FEATURE_PREPによって作成された定義から用語の値を抽出し、関連する単語を各値に追加します。

FEATURE_EXPLAINは、最終用語表を戻します。

FEATURE_EXPLAINのコール構文

FEATURE_EXPLAINのコール構文は、次のとおりです。

            CTXSYS.DRVODM.FEATURE_EXPLAIN (
                   feature_definition_tbl     IN   VARCHAR2,
                RETURN DRVODM;

FEATURE_EXPLAINの戻り値

FEATURE_EXPLAINは、次の列を戻します。

Name              Type
---------------    ---------------
text               VARCHAR2(160)
type               NUMBER(3)
ID                 NUMBER
score              NUMBER

FEATURE_EXPLAINの引数

FEATURE_EXPLAINでは、単一の引数(FEATURE_PREPによって作成される用語定義の表)を指定します。

FEATURE_EXPLAINの例

次の例では、中間用語表txt_term_outを使用して、txt_final_termsと呼ばれる最終用語表を作成しています。FEATURE_EXPLAINテーブル・ファンクションは、用語定義の表txt_pref_termsに指定されている用語を戻します。

SQL> create table txt_final_terms as
                   select A.sequence_id, B.text, A.value
                         FROM txt_term_out A,
                              TABLE(ctxsys.drvodm.feature_explain(
                                    'txt_pref_terms')) B
                         WHERE A.attribute_id = B.id;

ネストした表列の移入

最終用語表を使用して、DM_NESTED_NUMERICALS型のネストした表列を移入します。

次の例では、表mining_build_nested_textを作成しています(かわりに、ビューを作成することもできます)。(かわりに、ビューを作成することもできます)。表には、顧客IDのケースID列および3つの顧客属性(年齢、学歴および職業)の列があります。また、用語表txt_final_termsから作成されたDM_NESTED_NUMERICALS型のコメント列もあります。

SQL> CREATE TABLE mining_build_nested_text
       NESTED TABLE comments store AS build_comments
      AS
    SELECT non_text.cust_id,
      non_text.age,
      non_text.education,
      non_text.occupation,
     txt.comments
     FROM
     mining_build_text non_text,
     ( SELECT features.sequence_id,
              cast(COLLECT(dm_nested_numerical(features.text,features.value))
                           as dm_nested_numericals)  comments
       FROM txt_final_terms features
       group by features.sequence_id) txt
     WHERE non_text.cust_id = txt.sequence_id(+);

例: テキスト列の変換

次の例では、MINING_BUILD_TEXTのテキスト列がMINING_BUILD_NESTED_TEXTのネストした表列に変換されています。MINING_APPLY_TEXTの同じテキスト列がMINING_APPLY_NESTED_TEXTのネストした表列に変換されています。

MINING_BUILD_TEXTおよびMINING_APPLY_TEXTのどちらにも次の列が存在します。

 Name                              Null?    Type
 --------------------------------- -------- ---------------------------
 CUST_ID                           NOT NULL NUMBER
 AGE                                        NUMBER
 EDUCATION                                  VARCHAR2(21)
 OCCUPATION                                 VARCHAR2(21)
 COMMENTS                                   VARCHAR2(4000)

次の文は、索引を作成します。

SQL> create index build_text_idx on mining_build_text (comments)
             indextype is ctxsys.context parameters ('nopopulate');
SQL> create index apply_text_idx ON mining_apply_text (comments)
             indextype is ctxsys.context parameters ('nopopulate');

次の文は、索引プリファレンスおよびその表を作成します。

SQL> execute ctx_ddl.create_preference('idx_pref', 'SVM_CLASSIFIER');
SQL> create table idx_pref_cat (id number, cat number);

次の文は、表BUILD_TERMS_OUTの中間用語を戻します。また、表FEATURE_DEFSを作成し、用語定義を移入します。

SQL>  create table build_terms_out as
              select * from
                     table (ctxsys.drvodm.feature_prep
                                  ('build_text_idx',
                                   'cust_id',
                                   'idx_pref_cat',
                                   'id',
                                   'cat',
                                   'feature_defs',
                                   'idx_pref'));

次の文は、表BUILD_EXPLAIN_OUTの最終用語を戻します。

SQL> create table build_explain_out as
             select a.sequence_id,
                    b.text,
                    a.value
             from build_terms_out a,
             table (ctxsys.drvodm.feature_explain('feature_defs')) b
             where a.attribute_id = b.id;

次の文は、表MINING_BUILD_NESTED_TEXTを作成します。この表には、元の作成表からの非テキスト属性と、コメントのネストした表が格納されています。この表は、モデルの作成に使用されます。

SQL> create table mining_build_nested_text
        nested table comments store as build_comments
          as select non_text.cust_id,
                    non_text.age,
                    non_text.education,
                    non_text.occupation,
                    txt.comments
              from mining_build_text non_text,
             (select features.sequence_id,
                cast(collect(dm_nested_numerical(features.text,features.value))
                as dm_nested_numericals)  comments
              from build_explain_out features
              group by features.sequence_id) txt
              where non_text.cust_id = txt.sequence_id(+);

次の文は、適用表MINING_APPLY_TEXTのコメント列の中間用語表を作成します。その際、MINING_BUILD_TEXTのコメント列の前処理で作成されたFEATURE_DEFS表の用語定義を使用します。

SQL>  create table apply_terms_out as
              select * from
                     table (ctxsys.drvodm.feature_prep
                                  ('apply_text_idx',
                                   'cust_id',
                                   'feature_defs'));

次の文は、適用の最終用語表を作成します。

SQL> create table apply_explain_out as
             select a.sequence_id,
                    b.text,
                    a.value
             from apply_terms_out a,
             table (ctxsys.drvodm.feature_explain('feature_defs')) b
             where a.attribute_id = b.id;

次の文は、表MINING_APPLY_NESTED_TEXTを作成します。この表には、元の適用表からの非テキスト属性と、コメントのネストした表が格納されています。この表は、モデルの適用に使用されます。

SQL> create table mining_apply_nested_text
        nested table comments store as apply_comments
          as select non_text.cust_id,
                    non_text.age,
                    non_text.education,
                    non_text.occupation,
                    txt.comments
              from mining_apply_text non_text,
             (select features.sequence_id,
                cast(collect(dm_nested_numerical(features.text,features.value))
                as dm_nested_numericals)  comments
              from apply_explain_out features
              group by features.sequence_id) txt
              where non_text.cust_id = txt.sequence_id(+);