Как использовать libsvm для классификации текста? - PullRequest
4 голосов
/ 30 мая 2011

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

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?
Как я могу перевести то, что у меня есть, в этот формат?

Ответы [ 2 ]

4 голосов
/ 30 мая 2011

Вероятно, формат

classLabel attribute1:count1 ... attributeN:countN

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

1 голос
/ 05 июля 2012
How could I transfer what I've got to this format?

Вот как бы я это сделал. Я бы использовал скрипт, который вам нужен, чтобы вычислить количество слов для каждого письма в обучающем наборе. Затем используйте другой скрипт и перенесите эти данные в формат LIBSVM, который вы показали ранее. (Это может быть сделано разными способами, но было бы разумно писать с простым языком ввода / вывода, таким как Python). Я бы собрал все данные «good-mail» в один файл и обозначил бы этот класс как «1». , Затем я проделал бы тот же процесс с данными «spam-mail» и пометил бы этот класс «-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 в каталогах «Инструменты» и «Python» очень полезны.) К сожалению, часто задаваемые вопросы не касаются того, что сказал Нологин, о данных, представленных в разреженном формате.

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

...