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 Data Miningでは、特殊なOracle Textのルーチンを使用してテキスト・データを前処理します。Oracle Textは、テキスト問合せおよび分類アプリケーションを作成するデータベースのテクノロジの1つです。
Oracle Textでは、次のようなOracle Data Mining用語抽出プロセスの機能が提供されています。
SVM_CLASSIFIER
。CTX_DLL
Oracle Text PL/SQLパッケージに定義されており、Oracle Data Miningの用語抽出の索引プリファレンスを指定します。
テーブル・ファンクションFEATURE_PREP
およびFEATURE_EXPLAIN
。CTXSYS.DRVODM
Oracle Text PL/SQLパッケージに定義されており、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アルゴリズム)およびテキスト・マイニング変換は、ともに一種の特徴抽出を行います。
|
用語抽出プロセスを理解する手始めとしては、サンプル・プログラムを利用するのが一番です。次のサンプル・プログラムには、テキスト・マイニング用の用語抽出コードが含まれています。
dmsh.sql
- サンプル・プログラム(テキスト・マイニング・プログラムなど)で使用する作成、テストおよびスコアリングのデータを準備します。dmsh.sql
では、データ・マイニング用のビューとテキスト・マイニング用の表および索引を作成します。
dmtxtfe.sql
- dmsh.sql
によって作成された索引付きのテキスト列を使用して、テキスト・マイニングに適したネストした列を作成します。
dmtxtfe.sql
は、用語抽出のサンプル・プログラムです。このプログラム内には、段階を追ってコードを説明しているコメントが多数含まれています。このプログラムは、dmsh.sql
のように、索引作成と、テスト・データおよびスコアリング・データの準備を追加することで、完全な用語抽出ソリューションに拡張できます。
次に示す2つのPL/SQLサンプル・プログラムは、dmsh.sql
によってテキスト・マイニング用に準備されたデータを使用します。
dmtxtnmf.sql
は、Non-Negative Matrix Factorizationを使用するモデルを作成および適用します。
dmtxtsvm.sql
は、SVM分類を使用するモデルを作成および適用します。
これらのプログラムはどちらも、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
列には、用語の値が格納されます。ただし、元のコメント列に存在するすべての単語が、用語として抽出されるとは限りません。たとえば、冠詞など(the
やto
)は、抽出の対象にはなりません。
この項では、用語抽出プロセスの手順を概説します。詳細および特殊な構文での必要事項については、この章の後半で説明します。
テスト・データおよび適用データは、作成データと同じ前処理を行う必要があります。テスト・データおよび適用データを変換するには、作成データ用に生成した用語の定義を再使用します。次の手順を実行します。
テスト表または適用表のテキスト列の索引を作成します。
FEATURE_PREP
テーブル・ファンクションを使用して、中間用語表を移入します。作成データ用に以前に生成した用語の定義を使用します。
FEATURE_EXPLAIN
テーブル・ファンクションを使用して、最終用語表を移入します。
元のテスト表または適用表の列をレプリケートし、テキスト列をネストした表列と置き換えます。最終用語表からネストした表列に用語をロードします。
Oracle Textプロセスには、テキスト索引が必要になります。Oracle Textでは、テキスト・ドキュメントの問合せ、カタログ化および分類のために、数種類の索引をサポートしています。Oracle Data Miningの用語抽出プロセスでは、テキスト問合せ用にCONTEXT
索引が必要になります。
各テキスト列を変換する索引を作成する必要があります。索引を作成するには、次の構文を使用します。
SQL>CREATE INDEXindex_name
ONtable_name
(column_name
) INDEXTYPE IS ctxsys.context PARAMETERS ('nopopulate');
注意: この文で作成されるのは、基本的なCONTEXT 索引です。CREATE INDEX 文に引数を追加することによって、新たに索引の特性を定義できます。詳細は、『Oracle Textリファレンス』を参照してください。 |
Oracle Textでは、索引のデフォルトの特性をオーバーライドするために索引プリファレンスをサポートしています。特定の名前およびタイプを指定したプリファレンスを作成するには、Oracle TextパッケージCTX_DDL
のCREATE_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.DRVODM
のFEATURE_PREP
テーブル・ファンクションは、SVM_CLASSIFIER
型の索引プリファレンスを使用して、テキスト列から用語を抽出します。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
は、次の列を戻します。SEQUENCE_ID
列にはケースID、ATTRIBUTE_ID
列には用語IDが格納されます。
Name NULL? Type ---------------------- ------- ------ SEQUENCE_ID NUMBER ATTRIBUTE_ID NUMBER VALUE NUMBER
FEATURE_PREP
では、表4-1に示す引数を指定できます。
表4-1 FEATURE_PREPテーブル・ファンクションの引数
引数名 | データ型 | |
---|---|---|
|
|
作成表、テスト表または適用表におけるテキスト列の索引の名前。 |
|
|
作成表、テスト表または適用表におけるケースID列の名前。 |
|
|
作成データでのみ指定。 |
|
|
'id'を指定。これは、 作成データでのみ指定。 |
|
|
'cat'を指定。これは、 作成データでのみ指定。 |
|
|
Name Null? Type --------------------------------- CAT_ID NUMBER TYPE NUMBER RULE BLOB |
|
|
作成データでのみ指定。 |
次の例では、txt_term_out
と呼ばれる中間用語表を作成しています。FEATURE_PREP
テーブル・ファンクションは、build_text_idx
と呼ばれる索引を持つテキスト列から用語を抽出します。テキスト列は、cust_id
と呼ばれるケースID列を持つ作成表にあります。索引プリファレンスtxt_pref
は、表cat_tbl
のid
列および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.DRVODM
のFEATURE_EXPLAIN
テーブル・ファンクションは、FEATURE_PREP
によって作成された定義から用語の値を抽出し、関連する単語を各値に追加します。
FEATURE_EXPLAIN
は、最終用語表を戻します。
FEATURE_EXPLAIN
のコール構文は、次のとおりです。
CTXSYS.DRVODM.FEATURE_EXPLAIN ( feature_definition_tbl IN VARCHAR2, RETURN DRVODM;
FEATURE_EXPLAIN
は、次の列を戻します。
Name Type --------------- --------------- text VARCHAR2(160) type NUMBER(3) ID NUMBER score NUMBER
次の例では、中間用語表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(+);