Поставлена задача классификация документов средствами Oracle Text и Oracle Data Mining.
В базе инфа о документах хранится в одной таблице, содержимое документов в другой в поле CLOB, крутится база на 11gR1 под виндой.
Делаю все на PL/SQL по сэмплам
отсюда.
Там есть пример когда для классификации используется таблица с разнородными колонками, в числе которых и текст, приведен пример для метода SVM (опорных векторов), я же использую только колонку с текстом для классификации.
Выделяю строки с содержимом документов для обучения в отдельную таблицу, создаю индекс CTXSYS.CONTEXT с такими параметрами:
CTX_DDL.CREATE_PREFERENCE('my_LEXER', 'BASIC_LEXER');
ctx_ddl.set_attribute('my_LEXER','INDEX_STEMS','ENGLISH');
ctx_ddl.set_attribute('my_LEXER','index_text','YES');
CTX_DDL.CREATE_PREFERENCE('my_WORDLIST', 'BASIC_WORDLIST');
ctx_ddl.set_attribute('my_WORDLIST','stemmer','ENGLISH');
ctx_ddl.set_attribute('my_WORDLIST','substring_index','FALSE');
ctx_ddl.set_attribute('my_WORDLIST','prefix_index','FALSE');
CTX_DDL.CREATE_STOPLIST('my_STOPLIST','BASIC_STOPLIST');
Ну и далее, выделение термов и создание таблицы с колонкой NESTED_TABLE, содержащей термы для каждого документа и колонкой c целевым значением категории (target_column). В итоге табличка для построения модели имеет вид:
CREATE TABLE "TEXT_BUILD_NESTED"
("DOC_ID" NUMBER(6,0) NOT NULL ENABLE, -- ID документа
"CAT_ID" NUMBER, -- ID категории документа
"DOC_TEXT" "SYS"."DM_NESTED_NUMERICALS" ) -- термы (слова), выдранные из текста документа
NESTED TABLE "DOC_TEXT" STORE AS "BUILD_TEXT" RETURN AS VALUE
Далее происходит построение модели классификации:
DBMS_DATA_MINING.CREATE_MODEL(
model_name => 'Classification_model'
mining_function => dbms_data_mining.classification,
data_table_name => 'text_build_nested',
case_id_column_name => 'doc_id',
target_column_name => 'cat_id',
settings_table_name => 't_settings');
Таблица t_svmc_settings заполнена следующими настройкми:
INSERT INTO t_settings VALUES
(dbms_data_mining.algo_name, dbms_data_mining.algo_support_vector_machines);
INSERT INTO t_settings VALUES
(dbms_data_mining.svms_kernel_function,dbms_data_mining.svms_linear);
Модель строится. Затем, подготовив должным образом текст документов для классификации (по аналогии с подготовкой данных для обучения, с тем же текстовым индексом), применяем модель к набору документов.
В итоге классификация текстов работает, и довольно неплохо, надо сказать.
Но стоит только поменять настройки для построение модели методом Naive bayes:
INSERT INTO t_settings VALUES
(dbms_data_mining.algo_name, dbms_data_mining.algo_naive_bayes);
INSERT INTO t_settings VALUES
(dbms_data_mining.clas_priors_table_name,'category_priors');
И получается то, что при классификации, документ относится ко всем категориям с равной вероятностью (по сути классификация не работает).
Если же классифицировать не по текстовому полю, а по другим значениям (например, number и т.п.), работает как классификация методом опорных векторов, так и наивным байесом. Причем в "Oracle® Data Mining Concepts 11g Release 1 (11.1) B28129-04" указывается что вроде как Oracle Data Mining должен поддерживать классификацию текста методом Naive Bayes, a Oracle Text нет... (может тут где-то собака зарыта, но ведь использую я пакет DBMS_DATA_MINING):
|
Mining Function Oracle Data Mining Oracle Text Classification Text or mixed data can be mined using SVM, Text can be mined using SVM, GLM, or Naive Bayes decision trees, or user-defined rules
|
Может кто нибудь сталкивался с подобным!? Не уверен что привел достаточно подробные сведения, но могу уточнить... В частности интересует вопрос, работает ли вообще у кого-нибудь классификация текста наивным байесом? Уже исхитрялся и так и эдак, а он все равно равновероятный результат выдает, стоит только оставить для построения модели чисто текстовые данные.