Як можна групувати рядки за загальними темами?


10

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

Епізод: Зважаючи на велику кількість рядків, як би я міг згрупувати їх за семантичною темою?

Конкретний додаток: у мене є ~ 200k дрібниць питань, які я б хотів класифікувати в загальні групи (машини, комп'ютери, політика, Канада, їжа, Барак Обама тощо).

Що я розглянув: У Вікіпедії є список інструментальних інструментів для обробки природних мов (якщо припустити, що те, що я намагаюся зробити, насправді називається NLP), тому я переглянув декілька, але, здається, ніхто не робить нічого подібного до моїх потреб.

Примітки: Вказувалося, що для цього потрібні додаткові знання (наприклад, Porsche є автомобілем, C ++ є мовою програмування). Тоді я припускаю, що потрібні дані про навчання, але якщо у мене є лише перелік питань і відповідей, як я можу генерувати дані про навчання? Тоді як я можу використовувати дані про навчання?

Додаткові зауваження: Якщо поточне форматування моєї допомоги на запитання і відповіді (хоча воно виглядає як JSON, це в основному необроблений текстовий файл):

// row 1: is metadata
// row 2: is a very specific kind of "category"
// row 3: is the question
// row 4: is the answer
{
  15343
  A MUSICAL PASTICHE
  Of classical music's "three B's", he was the one born in Hamburg in 1833
  Johannes Brahms
}

Але перш ніж хтось зазначить, що категорія вже існує, зауважте, що є приблизно 200 тис. Запитань і відповідей, як це, і в основному стільки ж "категорій". Я намагаюся згрупувати їх у більш широкі групи, як перелічені вище. Також це форматування можна легко змінити для всіх питань, я це роблю програмно.

І ще зауваження: я насправді не знаю, скільки категорій мені знадобиться (принаймні 10-20), тому що я не перечитав усі питання. Я частково очікував, що під час категоризації якимось чином визначимо кінцеве число. У будь-якому випадку, я завжди можу вручну створити ряд категорій.


Як ви вживали моркву? З мого короткого прочитання про це, здається, він повинен легко обробляти записи з 200 тис.

Це просто зайняло набагато більше часу, ніж я думав, що це буде, і змусило мене збільшити початковий обсяг пам’яті JVM до 1024 м, а максимальну пам’ять - до 2048 м. Це було не так погано, як я, можливо, видав цей звук.

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

Е, ви займаєтеся об'ємною обробкою; надання СВМ насправді не є проблемою. Скільки часу пройшло? Звідки ви завантажували документи? Спеціальне джерело?

Я зайняв, можливо, 10 хвилин, але я згоден, об'ємна обробка за визначенням займає багато часу та займає пам'ять. Хоча цілий упевненість у тому, що задушитись, не була проблемою, більше стороною.

Відповіді:


4

Це досить стандартна проблема в NLP, і магічні слова Google, які ви шукаєте, - це "моделювання теми". Незважаючи на те, що ваші рядки досить короткі, можливо, у вас є певний успіх із виділенням Latent Dirichlet або подібним методом. Там в блог хороший пост Едвін Чен тут , яка розкладає загальну ідею позаду алгоритму. Деталі реалізації висвітлюються в цій записці Yi Wang.

Якщо ви шукаєте нестандартне рішення, я рекомендую випробувати topicmodelsпакет для R, оскільки це забезпечує досить приємний інтерфейс як для LDA, так і більш досконалої моделі коррельованої теми. Там також хороший список реалізацій , підтримуваних Девід Mimno тут .


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

Я досить мало використав пакет тематичних моделей R. Я, безумовно, рекомендую його прокручувати власний код - на cran.r-project.org/web/packages/topicmodels/vignettes/… є деяка документація з відпрацьованим прикладом . Конкретне форматування кожного документа насправді не має значення, оскільки все одно зводиться до подання "мішок слів". Просто киньте весь пов'язаний текст в один рядок.
Мартін О’Лірі

4

Ви намагаєтеся вирішити дві проблеми тут.

Завдання 1: Класифікуйте рядки питань у відповідній категорії.

Проблема 2: Створіть належні категорії.

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

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

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

Потім виникають нові запитання. По-перше: скільки мені потрібно навчальних даних? "Це залежить". Не бачивши ваших даних чи категорій, я не впевнений, що я навіть здогадався; але я можу взяти "бальну оцінку" і сказати про 500 запитань. Зауважте, що я міг вийти на порядок.

Це насправді означає, що вам доведеться позначити 500 питань вручну? Так і ні. Можна використати проміжні результати та деяку кмітливість для «завантаження» класифікаторів. Це все ще ручна робота, і коли ви подумаєте над цим 500 запитань, для тегування не знадобиться так довго. Розумність тут може швидко дати гірші результати, ніж працьовитість.

Коли у вас є достатня кількість навчальних даних, візьміть 75% від них і створіть класифікатор, використовуючи улюблений інструмент (наприклад, згадані тут чи що інше). Тепер нехай класифікатор спробує позначити затримані 25% даних і відмітити отриману точність. Якщо результат хороший, то поп шампанське. Якщо ні, то введіть більше даних про навчання або спробуйте інший класифікатор.

TL; DR

Підводячи підсумок, ось як я це зробив.

0) Use a supervised learner.
1) Create a category set yourself. 
2) Label manually about 500 questions
3) Use 75% of those to train a classifier.
4) Check performance.
5) If good then cheers else goto 2.

Одне невелике запитання: Ви кажете "близько 500 запитань" щодо даних про навчання та вручну позначити їх, але також "я міг би бути відключеним на порядок", тож якби я замість цього використав запитання 5k або 50k, чи все одно вручну позначити стільки?

Річ у тім; не бачивши своїх даних і не маючи чіткого уявлення про всі хвилини деталей у вашому проекті, важко дати хорошу оцінку. Однак, і це важливо пам’ятати, якщо 500 було б занадто низьким, зусилля з маркування не були марними. Ви все ще потребуєте питань, відмічених уручну для оцінки. Чим більше даних про оцінку у вас є, тим кращі оцінки ви можете зробити.

На один порядок я мав на увазі 50-500-5000. Я не думаю, що вам потрібно буде класифікувати 50k. Це 1/4 всього вашого корпусу! Якщо 500 запитань будуть занадто низькими, можна завантажити класифікатори. Ідея тут полягає в тому, щоб ви тренували класифікатор на невеликому початковому корпусі (наприклад, ваших 500), а потім додавали теги до решти. Тепер ви можете використовувати деякі випадки, коли класифікатор дуже впевнено перекваліфікував новий, більш великий класифікатор.

Ще одна важлива річ, яку потрібно пам’ятати; продуктивність багатьох класифікаторів не є лінійною за кількістю даних про навчання, але, як правило, буде сигмоподібною кривою. Це означає, що ще 500 мічених питань можуть бути майже такою ж користю, як і 5000. Моя порада - працювати невеликими кроками.

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