Как использовать libsvm для классификации текста?

#machine-learning #svm #libsvm

#машинное обучение #svm #libsvm

Вопрос:

Я хотел бы написать программу фильтрации спама с помощью SVM и выбираю libsvm в качестве инструмента.
Я получил 1000 хороших писем и 1000 спам-писем, затем я классифицирую их на:
700 писем good_train, 700 писем spam_train,
300 писем good_test, 300 писем spam_test,
затем я написал программу для подсчета времени появления каждого слова в каждом файле, получил результат, подобный:

 good_train_1.txt:  
today 3  
hello 7  
help 5  
...    
  

Я узнал, что libsvm нужен формат, подобный:

1 1:3 2:1 3:0
2 1:3 2:3 3:1
1 1:7 3:9

в качестве входных данных. Я знаю, что 1, 2, 1 — это метка, но что означает 1: 3?
Как я мог бы перенести то, что у меня есть, в этот формат?

Ответ №1:

Скорее всего, формат

 classLabel attribute1:count1 ... attributeN:countN
  

N — общее количество разных слов в вашем текстовом корпусе. Вам нужно будет проверить документацию к используемому вами инструменту (или его исходные тексты), чтобы увидеть, можно ли использовать более разреженный формат, не включая атрибуты, имеющие значение 0.

Ответ №2:

 How could I transfer what I've got to this format?
  

Вот как я бы это сделал. Я бы использовал скрипт, который у вас есть, для вычисления количества слов для каждого сообщения в обучающем наборе. Затем используйте другой скрипт и перенесите эти данные в формат LIBSVM, который вы показали ранее. (Это можно сделать различными способами, но разумно писать на простом языке ввода / вывода, таком как Python) Я бы собрал все данные «good-mail» в один файл и обозначил этот класс как «1». Затем я бы проделал тот же процесс с данными «спам-почты» и пометил бы этот класс «-1». Как сказал нологин, LIBSVM требует, чтобы метка класса предшествовала функциям, но самих функций может быть любое количество, если они расположены в порядке возрастания, например, 2: 5 3: 6 5: 9 разрешено, но не 3:23 1:3 7:343.

Если вы обеспокоены тем, что ваши данные представлены в неправильном формате, используйте их скрипт

 checkdata.py
  

перед обучением и он должен сообщать о любых возможных ошибках.

Как только у вас есть два отдельных файла с данными в правильном формате, вы можете вызвать

 cat file_good file_spam > file_training
  

и сгенерируйте обучающий файл, содержащий данные как о хорошей почте, так и о нежелательной. Затем проделайте тот же процесс с набором тестов. Одним из психологических преимуществ формирования данных таким образом является то, что вы знаете, что лучшие 700 (или 300) писем в наборе для обучения (или тестирования) — это хорошая почта, а остальные — спам. Это упрощает создание других сценариев, которые могут потребоваться для обработки данных, таких как код точности / отзыва.

Если у вас есть другие вопросы, часто задаваемые вопросы наhttp://www.csie.ntu.edu.tw /~cjlin/libsvm/faq.html должен быть в состоянии ответить на несколько вопросов, а также на различные файлы README, поставляемые вместе с установкой. (Я лично нашел README в каталогах «Tools» и «Python» отличным подспорьем.) К сожалению, в FAQ мало что говорится о том, что сказал нологин о данных в разреженном формате.

В заключение, я сомневаюсь, что вам нужно вести учет всех возможных слов, которые могут появиться в почте. Я бы рекомендовал считать только самые распространенные слова, которые, как вы подозреваете, появляются в спаме. Другие потенциальные возможности включают общее количество слов, среднюю длину слова, среднюю длину предложения и другие возможные данные, которые, по вашему мнению, могут оказаться полезными.