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_nameONtable_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(+);