2013-06-18 3 views
1

Я пытаюсь сделать классификатор SMS SPAM с помощью библиотеки WEKA. У меня есть файл CSV с заголовками «label» и «text». Когда я использую этот код, он создает файл ARFF с двумя атрибутами:Как изменить тип атрибута на String (WEKA - CSV на ARFF)

@attribute label {ham,spam} 
@attribute text {'Go until jurong point','Ok lar...', etc.} 

В настоящее время, кажется, что атрибут форматирование текста в качестве номинального атрибута с текстом каждого сообщения в качестве значения. Но мне нужно, чтобы текстовый атрибут был атрибутом String, а не списком всего текста из всех экземпляров. Наличие текстового атрибута в виде строки позволит мне использовать фильтр StringToWordVector для обучения классификатора.

// load CSV 
CSVLoader loader = new CSVLoader(); 
loader.setSource(new File(args[0])); 
Instances data = loader.getDataSet(); 

// save ARFF 
ArffSaver saver = new ArffSaver(); 
saver.setInstances(data); 
saver.setFile(new File(args[1])); 
saver.setDestination(new File(args[1])); 
saver.writeBatch(); 

Я знаю, что могу создать атрибут String, как это:

Attribute tmp = new Attribute("tmp", (FastVector) null); 

Но я не знаю, как заменить текущий атрибут, или установить тип атрибута перед чтением в CSV.

Я попытался вставить новый атрибут String и удалить текущий номинальный атрибут, но при этом удаляется весь текст SMS вместе с ним. Я также попытался использовать renameAttributeValue, но это не работает для изменения типа атрибута.

EDIT: Я подозреваю, что это NominalToString filter будет делать эту работу, но я не знаю, как его использовать.

Любые предложения были бы очень признательны. Благодаря!

ответ

8

Это сделало трюк. Он изменил тип текстового атрибута, но не тип атрибута метки (хотя я не уверен, почему он сделал это, но не другой).

NominalToString filter1 = new NominalToString(); 
filter1.setInputFormat(data); 
data = Filter.useFilter(data, filter1); 

Там маленький кончик here

По умолчанию, не числовые атрибуты импортируются номинальными атрибутов, которые не обязательно желательной для текстовых данных, особенно если кто-то хочет использовать StringToWordVector фильтр. Для того чтобы изменить атрибут на STRING , можно запустить фильтр NominalToString (пакет weka.filters.unsupervised.attribute) по данным, с указанием индекса атрибута или диапазона индексов, который должен быть преобразован (Примечание: этот фильтр не исключает атрибут класса от преобразования!).

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

  • Нет связанных вопросов^_^