2012-04-18 4 views
5

Я пытаюсь сделать классификацию документов с использованием API-интерфейса Weka.Интерпретация вывода StringToWordVector() - Weka

Вот моя структура каталогов файлов данных.

+- text_example 
| 
+- class1 
| | 
| 3 html files 
| 
+- class2 
| | 
| 1 html file 
| 
+- class3 
    | 
    3 html files 

У меня есть файл 'arff', созданный с помощью 'TextDirectoryLoader'. Затем я использую фильтр StringToWordVector в созданном файле arff, с filter.setOutputWordCounts(true).

Ниже приведен образец выходного сигнала после подачи фильтра. Мне нужно разъяснить несколько вещей.

@attribute </form> numeric 
@attribute </h1> numeric 
. 
. 
@attribute earth numeric 
@attribute easy numeric 

Этот огромный список должен быть токенизацией содержимого исходных html-файлов. правильно?

Тогда у меня есть,

@data 
{1 2,3 2,4 1,11 1,12 7,..............} 
{10 4,34 1,37 5,.......} 
{2 1,5 6,6 16,...} 
{0 class2,34 11,40 15,.....,4900 3,... 
{0 class3,1 2,37 3,40 5.... 
{0 class3,1 2,31 20,32 17...... 
{0 class3,32 5,42 1,43 10......... 

почему нет атрибута класса для первых 3-х элементов? (он должен иметь класс 1). Что означает начало 0, как в {0 class2, ..}, {0 class3 ..}. В нем говорится, например, что в 3-м файле html в папке класса 3 слово, идентифицируемое целым числом 32, появляется 5 раз. Просто, чтобы узнать, как мне получить слово (токен), переданное 32?

Как уменьшить размерность вектор-функции? не нужно ли нам делать все векторы объектов одинакового размера? (например, рассмотрите только 100 наиболее частых терминов из учебного набора, а затем, когда дело доходит до тестирования, рассмотрите возможность появления только тех 100 терминов в тестовых документах. Потому что, таким образом, что произойдет, если мы придумаем совершенно новое слово на этапе тестирования классификатор просто игнорирует его?).

Я что-то упустил? Я новичок в Weka.

Также я очень ценю помощь, если кто-то может объяснить мне, как классификатор использует этот вектор, созданный с помощью фильтра StringToWordVector. (Например, создание словаря с подготовки данных, снижения размерности, те происходит внутри кода ВЕКА?)

ответ

8
  1. Огромный список @attribute содержит все маркеры, полученные от вашего входа.
  2. Ваш раздел @data находится в разреженном формате, то есть для каждого атрибута, значение указывается только в том случае, если оно отличается от нуля. Для первых трех строк атрибут класса является классом 1, вы просто не можете его увидеть (если он был неизвестен, вы увидите 0 ? в начале первых трех строк). Почему это так? Weka внутренне представляет номинальные атрибуты (включая классы) как удваивает и начинает отсчет с нуля. Итак, ваши три класса внутри: class1 = 0.0, class2 = 1.0, class3 = 2.0. Поскольку нулевые значения не указаны в разреженном формате, вы не можете видеть класс в первых трех строках. (См. Также раздел «Редкие файлы ARFF» на странице http://www.cs.waikato.ac.nz/ml/weka/arff.html)
  3. Чтобы получить слово/токен, представленный индексом n, вы можете подсчитать или, если у вас есть объект Instances, вызовите на нем attribute(n).name(). Для этого n начинает отсчет в 0.
  4. Чтобы уменьшить размерность вектор-функции, существует множество опций. Если вы хотите иметь только 100 наиболее частых терминов, то вы получите stringToWordVector.setWordsToKeep(100). Обратите внимание, что это попытается сохранить 100 слов каждого класса. Если вы не хотите хранить 100 слов в классе, stringToWordVector.setDoNotOperateOnPerClassBasis(true).Вы получите чуть выше 100, если есть несколько слов с одинаковой частотой, поэтому 100 является всего лишь своего рода целевым значением.
  5. Что касается новых слов, происходящих на этапе тестирования, я думаю, что этого не может быть, потому что перед классификацией вы должны передать stringToWordVector все экземпляры. Я не уверен на 100% на этом, хотя, поскольку я использую двухклассную настройку, и я позволяю StringToWordVector преобразовывать все мои экземпляры, прежде чем рассказывать классификатору что-нибудь об этом.

Я могу, как правило, рекомендовать вам экспериментировать с инструментом Weka KnowledgeFlow, чтобы узнать, как использовать разные классы. Если вы знаете, как это сделать, вы можете легко использовать эти знания для своего Java-кода. Надеюсь, я смог вам помочь, хотя ответ немного запоздал.

+0

Да, анс немного опоздал, когда я сам узнал ответы. Но спасибо за ваш ответ, и я принимаю его. Эй, у вас есть опыт работы с одной классификацией классов с libsvm (оберткой) в weka? Я как бы застрял в этом – KillBill

+0

@ user601 Нет, извините. Я никогда не использовал libsvm в Weka. Просто из любопытства: пишите ли вы диссертацию на тему машинного обучения/интеллектуального анализа данных? – Malhelo

+0

да, я занимаюсь диссертацией на год, который включает в себя классификацию текста. Вы делаете что-то подобное? – KillBill

Смежные вопросы