Неструктурована класифікація тексту


12

Я буду класифікувати неструктуровані текстові документи, а саме веб-сайти невідомої структури. Кількість класів, до яких я класифікую, обмежена (на даний момент я вважаю, що існує не більше трьох). Хтось пропонує, як мені почати?

Чи підхід "мішок слів" тут здійсненний? Пізніше я можу додати ще один етап класифікації на основі структури документа (можливо, дерева рішень).

Я дещо знайомий з Mahout та Hadoop, тому віддаю перевагу Java-рішення. Якщо потрібно, я можу перейти до Scala та / або Spark Engine (бібліотека ML).

Відповіді:


14

Давайте опрацюємо це з нуля. Класифікація (також відома як категоризація) - це приклад контрольованого навчання . У контрольованому навчанні ви маєте:

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

Тепер візьмемо простий випадок класифікації спаму. Ваш навчальний набір даних - це корпус електронних листів + ​​відповідні мітки - "спам" або "не спам". Набір даних тестування має таку саму структуру, але зроблений з деяких незалежних електронних листів (як правило, він просто розбиває свій набір даних і робить, скажімо, 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 частини:

  1. Вилучення особливостей - перетворення сирих текстів у функції векторів.
  2. Класифікація об'єктів - побудова та застосування моделі.

Перший пункт добре опрацьований у багатьох бібліотеках НЛП . По-друге, це стосується машинного навчання, тому залежно від вашого набору даних ви можете використовувати або Weka , або MLlib .


Оригінальний плакат використав слово "класифікувати", але "кластер" є більш точним описом його проблеми, оскільки він не має апріорних визначень категорій. Тому це не обов'язково проблема, що контролюється навчанням.
MrMeritology

@MrMeritology: Хм, з контексту я б сказав, що автор просто не впевнений у конкретних класах, які він буде використовувати, але все ж хоче класифікацію, а не кластеризацію. У всякому разі, він єдина людина, яка знає правду :)
подруга

Можливо, мені в точці було не ясно. Категорії будуть обрані порадами, тому це скоріше класифікація, ніж проблема кластеризації. Ідея створення вектора складних функцій виглядає цілком обґрунтованою - тим більше, що є деякі конкретні теги, які, швидше за все, швидше класифікують деякі зразки. Я не впевнений, чи буде SVM відповідати цій проблемі, оскільки я прогнозую високі нелінійності, але дерева рішень та Байєса здаються застосовними. Я також починаю думати про застосування гібридного алгоритму (дерева рішень на основі SVM).
Гжегож Е.

@GrzegorzE. - Якщо ваші категорії визначені заздалегідь, то перерахуйте ці три категорії у своєму запитанні. На мою думку, ви занадто зосереджені на алгоритмах ML та недостатньо суті вашої проблеми та характеру ваших даних. Наприклад, ви прогнозуєте "нелінійки" у функціях для веб-сайтів невідомої структури. Чому? Крім того, ви змішуєте теги з текстом веб-сторінок із "хто-що-що-що", і вони мають різне семантичне значення.
MrMeritology

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

5

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

Ви ставитесь до кожного документа як до пакету слів, попередньо обробляючи його для видалення зупинок тощо. За допомогою найпростіших методів ви попередньо вказуєте кількість тем. У вашому випадку ви можете або вказати "3", який є вашим обмеженим лімітом на категорії, або вибрати більшу кількість тем (від 10 до 100), а потім на окремому кроці сформувати три кластери для документів із загальним акцентом на теми. Можуть бути використані K-засоби або інші методи кластеризації. (Я рекомендую останній підхід)

Вам не потрібно кодувати програмне забезпечення для моделювання тем з нуля. Ось веб-сторінка з багатьма ресурсами, включаючи бібліотеки / пакети програм .

У Java немає жодного, але є способи запустити C ++ та Python під Java.


4

Ось кілька справді чудових програмних пакетів з відкритим кодом для класифікації тексту, які допоможуть вам почати:

  • MALLET - це ліцензований CPL інструментарій машинного навчання на основі Java, створений UMass для роботи з текстовими даними. Він включає реалізацію декількох алгоритмів класифікації (наприклад, наївний Байєс, максимальна ентропія, дерева рішень).
  • Stanford Класифікатор зі Стенфордського NLP Group є GPL ліцензії Java реалізацією максимальної ентропії класифікатора призначений для роботи з текстовими даними.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.