Классификация текстовых документов с помощью Oracle Data Mining и Oracle Text

Dmitrych-G
Дата: 01.12.2009 18:54:30
Поставлена задача классификация документов средствами 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

Может кто нибудь сталкивался с подобным!? Не уверен что привел достаточно подробные сведения, но могу уточнить... В частности интересует вопрос, работает ли вообще у кого-нибудь классификация текста наивным байесом? Уже исхитрялся и так и эдак, а он все равно равновероятный результат выдает, стоит только оставить для построения модели чисто текстовые данные.
Dmitrych-G
Дата: 05.03.2010 17:30:39
Итак, решение было найдено еще в начале января, только вот руки не доходили написать сообщение:) Может кто-то найдет через поисковик...

Дело оказалось в глючной версии оракла 11.1.0.6, на 11.1.0.7 тот же самый код для построения модели классификации методом Байеса, без каких-либо изменений, прекрасно работает. Модель строится с вменяемыми коэффициентами для термов и нормально классифицирует тексты. Вот так.
tociacla
Дата: 09.08.2013 13:44:03
Добрый день, уважаемый Dmitrych-G!
Извините пожалуйста за оффтоп, но не могли бы Вы предоставить более полный пример построения SVM модели в Oracle запросом? В частности, я не понимаю, что нужно указать в качестве settings_table_name: какая это должна быть таблица, с какими полями, с какими данными? Может быть, Вы можете скинуть ссылку на какое-либо руководство? Ничего не могу нагуглить((((
Заранее спасибо!