Широка масштабна класифікація тексту


18

Я хочу зробити класифікацію моїх текстових даних. У мене 300 classes200 навчальних документів на заняття (так 60000 documents in total), і це, ймовірно, призведе до дуже високих розмірних даних (ми можемо шукати розміри, що перевищують 1 мільйон ).

Я хотів би виконати наступні кроки в трубопроводі (просто щоб ви зрозуміли, які вимоги є у мене):

  1. Перетворення кожного документа у векторний ( tf-idfабо vector space model)
  2. Feature selection( Mutual Informationбажано на основі, або будь-який інший стандартний)
  3. Навчання класифікатора ( SVM, Naive Bayes, Logistic Regressionабо Random Forest)
  4. Прогнозування небачених даних на основі навчальної моделі класифікатора.

Отже, питання полягає в тому, які інструменти / рамки я використовую для обробки таких високомірних даних? Мені відомі звичайні підозрювані (R, WEKA ...), але, наскільки я знаю (я можу помилятися), можливо, ніхто з них не може обробляти такі великі дані. Чи є якийсь інший інструмент, який я можу подивитися?

Якщо мені доведеться паралелізувати це, чи варто дивитись на Apache Mahout ? Схоже, це може ще не забезпечити потрібну мені функціональність.

Дякуємо всім заздалегідь.


Оновлення: я оглянув цей веб-сайт , список розсилки R та Інтернет взагалі. Мені здається, що в моїй ситуації можуть виникнути такі проблеми:

(1) Попередня обробка моїх даних за допомогою R ( зокрема пакету tm ) може бути недоцільною , оскільки tmбуде надмірно повільною.

(2) Оскільки мені потрібно буде використовувати ансамбль пакетів R (попередня обробка, розріджені матриці, класифікатори тощо), сумісність між пакетами може стати проблемою, і я можу зазнати додаткових накладних витрат при перетворенні даних з одного формату в інший . Наприклад, якщо я виконую попередню обробку за допомогою tm(або зовнішнього інструменту, такого як WEKA), мені потрібно буде знайти спосіб перетворення цих даних у форму, яку можуть читати бібліотеки HPC в R. І знову мені незрозуміло, чи пакети класифікаторів безпосередньо братимуть дані, передбачені бібліотеками HPC.

Я на правильному шляху? І що ще важливіше, я маю сенс?


R може обробляти набори даних набагато більше, ніж це, вам просто потрібно добре використовувати наявні інструменти. Немає різниці між тим, що можна досягти в будь-якій важливій мові чи середовищі, хоча Weka та Mahout відстають у відношенні наявного. FWIW, це досить невеликий розмір вибірки, а розміри 1М - це не великий показник, але він також є статистично надмірним. Мої рекомендації - це R або Python, оскільки вони є безкоштовними та легкими для початківців. Матлаб не безкоштовний, але також хороший. Він також несе великий податок, коли ви використовуєте багато комп'ютерів.
Ітератор

1
Набагато важливішим моментом є те, що у вас є більше класів, ніж прикладів на клас, і ви вбудовуєте його в дуже великому просторі. Я не впевнений, що ви отримаєте дуже гарне розділення класу. Чи є у вас якісь структурні стосунки для занять? Якщо так, то деякі з цих методів можуть погано пройти без цього розуміння.
Ітератор

1
Ви можете використовувати параметр foreachзапису паралельного коду бібліотеки в Р. Це особливо добре поєднується з випадковими лісами, які по суті легко паралелізувати.
Зак

2
Кілька питань: 1) Чи зацікавлені ви в порівнянні всіх типів підходів до навчання, які ви згадуєте, чи вам просто потрібен той, щоб влаштуватись на роботу? 2) Чи належить кожен документ до 1, 1 або більше, або 0 або більше класів? 3) Ви спеціально хочете скористатися вибором функцій з якихось причин або ви просто вважали це необхідним? Я погоджуюся з іншими коментарями, що це проблема скромного розміру за сьогоднішніми стандартами, і зменшення розмірності не потрібно.
DavidDLewis

1
Я працюю над класифікацією тексту, що включає майже 10 000 тем (наприклад, класи або категорії або будь-який термін, який ви хочете). Зараз я працюю над налаштуванням цієї системи класифікації тексту в такому масштабі. Я не можу поділитися власними методами, оскільки вони є власником, але в мене є одна порада: будьте дуже обережні, вважаючи, що деякі запропоновані методи масштабуються, якщо це вже не було доведено. На мій досвід, дуже мало.

Відповіді:


13

Це повинно бути можливим, щоб воно працювало до тих пір, поки дані представлені у вигляді розрідженої структури даних, scipy.sparse.csr_matrixнаприклад, в Python. Я написав підручник для роботи над текстовими даними . Крім того, можна додатково зменшити використання пам'яті, використовуючи трюк хешування: адаптувати його до використання HashingVectorizerзамість CountingVectorizerабо TfidfVectorizer. Це пояснюється в розділі документації з текстовими функціями вилучення .

Випадкові ліси в цілому набагато дорожчі, ніж лінійні моделі (такі як лінійні векторні машини підтримки та логістична регресія) та багаточленні або наївні Берєллі Байеса, і для більшості проблем класифікації тексту, які не приносять значно кращої точності прогнозування, ніж простіші моделі.

Якщо scikit-learn не зможе розширити свою проблему, Vowpal Wabbit зробить (і, швидше за все, швидше, ніж sklearn), хоча він не реалізує всі моделі, про які ви говорите.

Відредаговано у квітні 2015 року, щоб відобразити поточний стан бібліотеки scikit-learn та виправити зламані зв’язки.


Ну а проблема використання будь-якої "нестандартної" техніки зменшення розмірів полягає в тому, що ви, ймовірно, зіткнетеся з проблемою, коли спробуєте опублікувати свою роботу. Принаймні в полі класифікації тексту я знаю факт, що рецензенти люблять бачити загальновживані методи (полегшує також порівняння з існуючими методами класифікації).
user721975

Не хвилюйтесь - @ogrisel не згадав нічого нестандартного, принаймні, не так, як це стосується найсучаснішої класифікації тексту тексту, хоча я ще не читав його навчальних посібників.
Ітератор

+1 Я думаю, що Python - це, мабуть, приємний шлях. У R є кілька самих останніх пакетів для видобутку тексту, але якщо один має більше обчислювальних, ніж статистичний досвід та інтереси, Python буде моєю рекомендацією.
Ітератор

@ogrisel: Кудо за внесок, який ви та інші внесли в склеарн. Я рекомендував це багатьом, хто працює в Python - весь дизайн є зразковим.
Ітератор

Що стосується "нестандартного" зменшення розмірів (з використанням випадкових проекцій) та перевірки хеш-функцій хитрість хешування Джона Ленгфорда та цю дискусію щодо метаоптимізації .
ogrisel

10

Gensim для Python - це магія. А оскільки він знаходиться в Python, ви можете використовувати його спільно з пропозицією @ ogrisel.


1

Я не зубнув власний ріг, але я зробив досить популярну відеосеріал про аналітику тексту з Rapidminer. Ви можете побачити його тут:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

Можливо, ви можете уникнути вибору функцій, просто використовуйте класифікатор, який не створює матрицю мільйона * мільйонів у пам'яті :)

Логістичний регрес задушить такі аспекти. Наївний Бейс набуває незалежних розмірів, тому вам буде добре. SVM не залежить від кількості розмірів (але від кількості векторів підтримки), тому буде добре.

300 - це багато занять, хоча. Я б почав лише з декількох і попрацював ваш шлях вгору.


Чудовий вказівник та порада. Спасибі. Чи можете ви, будь ласка, пояснити, що ви маєте на увазі під "почніть лише з кількох і працюйте вперед"?
user721975

ну замість 300 класів (наприклад, "скрипка, альта, віолончель, труба ..."), ви можете перекласифікувати їх на меншу кількість, наприклад "струнна, духова".
Ніл МакГуйган

Гаразд, я розумію зараз.
user721975

1

По-перше, виходячи з ваших коментарів, я б трактував це як 300 двійкових (так / ні) проблем класифікації. Існує багато простих у використанні відкритих джерел бінарних класифікаторів, які навчаються, і це дозволяє обміняти час на пам'ять.

SVM та логістична регресія - це, мабуть, найпопулярніші підходи для класифікації тексту. Обидва можуть легко впоратися з розмірами 1000000, оскільки в сучасних реалізаціях використовуються розрізнені структури даних і включають параметри регуляризації, що уникають перевитрати.

Кілька наборів машинного навчання з відкритим кодом, включаючи WEKA та KNIME , включають як SVM, так і логістичну регресію. Автономні реалізації SVM включають libSVM і SVMlight . Для логістичної регресії я підключу BXRtrain та BXRclassify , які я розробив разом з Мадіганом , Генкіним та іншими. BXRclassify може створити індекс пам'яті тисяч моделей логістичної регресії та застосовувати їх одночасно.

Щодо перетворення тексту в атрибутивну векторну форму, я якось завжди закінчую писати трохи Perl, щоб зробити це з нуля. :-) Але я думаю, що згадані мною комплекти машинного навчання включають токенізацію та код векторизації. Іншим маршрутом було б пройти з більшою кількістю інструментів на природній мові, як LingPipe , хоча це може бути для вас надмірним.


+1 Хороші коментарі. Якби я робив 300 класифікацій «так / ні», як би я вибрав негативні дані навчання для класу? Позитивними даними, очевидно, є документи, які належать до класу.
user721975

Ще один коментар. SVM / Logistic reg напевно може обробити мільйон розмірів, але як я можу проводити експерименти, щоб вибрати параметри для цих класифікаторів? Наприклад, на невеликому наборі даних ви можете запустити 10-кратну перехресну перевірку, щоб визначитися з параметрами, але який підхід потрібно використовувати для таких великих даних, щоб алгоритм закінчував роботу в розумний час?
user721975

@ user721975: Для певної дискримінації позитивними документами є документи, на яких розміщено позначку X, а негативні - усі інші документи.
DavidDLewis

@ user721975: Важко дати загальну пораду щодо часу виконання, оскільки деталі сильно відрізняються між алгоритмами та реалізаціями. 10-кратна перехресна перевірка може бути непрактичною для вашого набору даних: 60000 прикладів - це не так.
DavidDLewis

1
Неврівноважені набори тренувань не обов'язково є проблемою. Але насправді я усвідомлюю, що я щось плутаю: оскільки документи можуть належати до 0, 1 або декількох класів, що ви маєте на увазі, маючи 200 навчальних документів у класі? Ви щось робили для видалення документів із 0 класами або 2+ класами? Загалом, як ви створили цей набір 60000 документів?
DavidDLewis

1

Оскільки Sklearn 0.13 дійсно є реалізацією HashingVectorizer .

EDIT: Ось повноцінний приклад такої програми від sklearn docs

В основному цей приклад демонструє, що ви можете класифікувати текст на даних, які не можуть вміститися в основній пам'яті комп'ютера (а саме на диску / мережі / ...).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.