Как я могу сгруппировать строки по общим темам?

10

Например, я пытаюсь сгруппировать строки о программировании с другими строками о программировании, строки о физике с другими строками о физике и т. Д. По широкому кругу тем. Несмотря на вопиющий теоретический лингвистический аспект проблемы, я собираюсь сделать это с помощью программирования / программного обеспечения.

Краткое изложение: Учитывая большое количество строк, как бы я сгруппировал их по семантической теме?

Конкретное приложение: у меня есть ~ 200 тыс. Пустяковых вопросов, которые я бы хотел разделить на общие группы (автомобили, компьютеры, политика, Канада, еда, Барак Обама и т. Д.).

Что я изучил: в Википедии есть список наборов инструментов для обработки естественного языка (при условии, что то, что я пытаюсь сделать, на самом деле называется 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 000 вопросов и ответов и, как правило, столько же «категорий». Я пытаюсь сгруппировать их в более широкие группы, подобные перечисленным выше. Кроме того, это форматирование может быть изменено для всех вопросов очень легко, я делаю это программно.

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

Whymarrh
источник
Как ты использовал морковь? Из моего краткого прочтения об этом кажется, что он должен легко обрабатывать 200 тыс. Записей.
Это заняло намного больше времени, чем я думал, и заставило меня увеличить первоначальный объем памяти JVM до 1024 м, а максимальный объем памяти - до 2048 м. Это было не так плохо, как я мог издать этот звук.
Вам просто нужно достаточно данных для обучения, и тогда вы сможете классифицировать вопросы по этим категориям. Полностью автоматический подход, скорее всего, приведет к группированию их другими способами, например, вопросами, содержащими слово «машина». Вы не можете выучить синонимы одновременно с созданием группировки.
ВЫЙТИ - Anony-Mousse
Эх, вы делаете массовую обработку; дать JVM на самом деле не проблема. Как долго это займет? Откуда вы грузите документы? Пользовательский источник?
Мне потребовалось, возможно, 10 минут, но я согласен, массовая обработка по определению занимает много времени и занимает много памяти. Хотя вся эта шумиха по поводу этого удушья была не проблемой, скорее побочным примечанием.

Ответы:

4

Это довольно стандартная проблема в НЛП, и волшебными словами Google, которые вы ищете, являются «тематическое моделирование». Хотя ваши строки довольно короткие, вы можете добиться некоторого успеха с помощью скрытого распределения дирихле или аналогичного метода. Там в блог хороший пост Эдвин Чен здесь , которая раскладывает общую идею позади алгоритма. Детали реализации описаны в этой заметке И Вана.

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

Мартин О'Лири
источник
Спасибо, сообщение в блоге Чена, кажется, точно о том, что я пытаюсь сделать. Есть ли шанс, что вы использовали что-либо из того, что вы перечислили / сделали это раньше? Я нахожусь здесь на совершенно новом уровне и был бы признателен за то, что мне нужно сделать (используя одно из готовых решений). Как мне отформатировать мои «документы»? Должен ли я применять идентификаторы для каждого вопроса и ответов, чтобы я мог определить, какой документ входит в какую группу? Как я могу использовать выведенные данные? Как я уже сказал, я не понимаю многих деталей.
Whymarrh
Я использовал пакет R topicmodels совсем немного. Я бы, конечно, рекомендовал это вместо того, чтобы свернуть свой собственный код - есть некоторая документация с работающим примером на сайте 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 вопросов» для данных обучения и помечаете их вручную, но также и «я могу быть на порядок», поэтому если бы я вместо этого использовал вопросы 5 или 50 тысяч, я бы все равно вручную пометить столько?
Дело в том; не видя ваших данных и не имея четкого представления о мельчайших деталях вашего проекта, трудно дать хорошую оценку. Однако, и это важно помнить, если 500 будут слишком низкими, усилия по мечению не будут потрачены впустую. Вам все еще нужны помеченные вручную вопросы для оценки. Чем больше у вас данных об оценке, тем лучше вы сможете их оценить.
Под порядком я подразумевал 50-500-5000. Я не думаю, что вам нужно классифицировать 50k. Это 1/4 всего вашего корпуса! Если 500 вопросов будут слишком низкими, то можно начать классификаторы. Идея в том, что вы обучаете классификатор на небольшом начальном корпусе (например, 500), а затем помечаете остальное. Теперь вы можете использовать некоторые случаи, когда классификатор был очень уверен в переобучении нового, более крупного классификатора.
Еще одна важная вещь, чтобы иметь в виду; производительность многих классификаторов не является линейной по количеству обучающих данных, но обычно представляет собой сигмовидную кривую. Это означает, что более 500 вопросов с тегами могут быть почти таким же хорошим преимуществом, как и 5000. Мой совет - работать небольшими шагами.
Какие детали дадут дополнительную информацию о моем проекте? Я могу поделиться некоторыми примерами вопросов, чтобы показать мое форматирование, но я хочу адаптировать формат моих вопросов и ответов в соответствии с процессом категоризации. Я ценю помощь.