Давайте опрацюємо це з нуля. Класифікація (також відома як категоризація) - це приклад контрольованого навчання . У контрольованому навчанні ви маєте:
- модель - те, що наближає внутрішню структуру ваших даних, що дозволяє вам міркувати про це і робити корисні прогнози (наприклад, клас прогнозування об’єкта); зазвичай модель має параметри, які ви хочете "вивчити"
- навчальні набори та тестування наборів даних - набори об'єктів, які ви використовуєте для тренування своєї моделі (знаходження хороших значень параметрів) та подальшої оцінки
- алгоритми навчання та класифікації - перший описує, як вивчити модель з набору даних, другий показує, як отримати клас нового об'єкта за заданою навчальною моделлю
Тепер візьмемо простий випадок класифікації спаму. Ваш навчальний набір даних - це корпус електронних листів + відповідні мітки - "спам" або "не спам". Набір даних тестування має таку саму структуру, але зроблений з деяких незалежних електронних листів (як правило, він просто розбиває свій набір даних і робить, скажімо, 9/10 його для використання для навчання та 1/10 - для тестування). Один із способів моделювання електронних листів - представляти кожен із них як набір (мішок) слів. Якщо припустити, що слова не залежать одне від одного, ми можемо використовувати класифікатор Naive Bayes , тобто обчислити попередні ймовірності для кожного слова та кожного класу (навчальний алгоритм), а потім застосувати теорему Байєса, щоб знайти задню ймовірність того, що новий документ належить конкретний клас.
Отже, в основному ми маємо:
raw model + training set + training algorithm -> trained model
trained model + classification algorithm + new object -> object label
Тепер зауважимо, що ми представляли наші предмети (документи) як мішок слів. Але це єдиний спосіб? Насправді ми можемо витягти набагато більше із сирого тексту. Наприклад, замість слів як ми можемо використовувати їхні стебла чи лемми , викидати шумні слова стоп , додавати POS-теги слів, витягувати названі об’єкти або навіть досліджувати HTML структуру документа. Насправді більш загальне подання документа (і взагалі будь-якого об’єкта) є вектором ознак . Напр. Для тексту:
actor, analogue, bad, burn, ..., NOUN, VERB, ADJ, ..., in_bold, ... | label
0, 0, 1, 1, ..., 5, 7, 2, ..., 2, ... | not spam
0, 1, 0, 0, ..., 3, 12, 10, ..., 0, ... | spam
Тут перший рядок - це список можливих функцій, а наступні рядки показують, скільки разів ця функція виникає в документі. Наприклад, у першому документі немає слова "актор", 1 зустріч слова "спалити", 5 іменників, 2 прикметники та 2 шрифти тексту жирним шрифтом. Останній стовпець відповідає міті класу в результаті.
Використовуючи функціональний вектор, ви можете включити будь-які властивості ваших текстів. Хоча пошук хорошого набору можливостей може зайняти деякий час.
А як щодо моделі та алгоритмів? Ми зв'язані з Наївними Байєсами. Зовсім ні. логістична регресія , SVM , дерева рішень - лише згадати декілька популярних класифікаторів. (Зауважимо, що ми говоримо "класифікатор" у більшості випадків маємо на увазі модель + відповідні алгоритми для навчання та класифікації).
Щодо реалізації, ви можете розділити завдання на 2 частини:
- Вилучення особливостей - перетворення сирих текстів у функції векторів.
- Класифікація об'єктів - побудова та застосування моделі.
Перший пункт добре опрацьований у багатьох бібліотеках НЛП . По-друге, це стосується машинного навчання, тому залежно від вашого набору даних ви можете використовувати або Weka , або MLlib .