Например, я пытаюсь сгруппировать строки о программировании с другими строками о программировании, строки о физике с другими строками о физике и т. Д. По широкому кругу тем. Несмотря на вопиющий теоретический лингвистический аспект проблемы, я собираюсь сделать это с помощью программирования / программного обеспечения.
Краткое изложение: Учитывая большое количество строк, как бы я сгруппировал их по семантической теме?
Конкретное приложение: у меня есть ~ 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), потому что я сам не прочитал все вопросы. Я частично ожидал, что конечное число будет определено как-то во время категоризации. В любом случае я всегда могу вручную создать ряд категорий.
источник
Ответы:
Это довольно стандартная проблема в НЛП, и волшебными словами Google, которые вы ищете, являются «тематическое моделирование». Хотя ваши строки довольно короткие, вы можете добиться некоторого успеха с помощью скрытого распределения дирихле или аналогичного метода. Там в блог хороший пост Эдвин Чен здесь , которая раскладывает общую идею позади алгоритма. Детали реализации описаны в этой заметке И Вана.
Если вы ищете готовое решение, я рекомендую попробовать
topicmodels
пакет для R, поскольку он обеспечивает достаточно хороший интерфейс как для LDA, так и для более сложной модели коррелированных тем. Там также хороший список реализаций , поддерживаемых Дэвид Mimno здесь .источник
Вы пытаетесь решить две проблемы здесь.
Проблема 1: классифицировать строки вопросов в соответствующей категории.
Проблема 2: Создать правильные категории.
Первая проблема может быть решена с помощью так называемых контролируемых алгоритмов, многие классификаторы могут дать очень хорошую точность и производительность. Тем не менее, проблема 2, создание категорий из воздуха (тонны данных), гораздо сложнее. Это неконтролируемая проблема, учитывая большое количество данных, которые компьютер автономно определяет категории с учетом некоторых критериев. В идеале эти критерии и алгоритм должны аккуратно организовать ваши данные в кластеры. Затем они могут быть помечены. Однако, поскольку это гораздо более сложная задача, я бы сказал, что здесь нет приемлемого решения, которое дало бы хороший результат без больших усилий по настройке, которые, скорее всего, потребуют экспертов.
Боюсь, здесь пока нет волшебной кнопки. Однако вы можете немного помочь машине. Например, вы можете выбрать набор категорий. Когда вы определились с категориями, вы можете создавать тренировочные данные. В этой настройке данные обучения - это просто вопрос и правильные пары категорий.
Чем больше тренировочных данных, тем лучше. Однако, поскольку задача по-прежнему заключается в том, чтобы что-то делать автоматически, нет смысла сначала делать что-то вручную. Теперь, почему вы хотели бы иметь данные обучения? Оценка точности. Если вы хотите хороших результатов, жизненно важно, чтобы вы могли выполнить какую-то оценку того, насколько хорошо работает установка. И единственный способ сделать это несколько систематически - вручную написать некоторые вопросы. В противном случае вы в слепой.
Затем возникают новые вопросы. Первый: сколько данных обучения мне нужно? "Это зависит". Не увидев ваши данные или категории, я не уверен, что даже предположил бы; но я могу взять «приблизительную оценку» и сказать около 500 вопросов. Обратите внимание, что я могу быть выключен на порядок.
Означает ли это, что вам нужно пометить 500 вопросов вручную? Да и нет. Можно использовать промежуточные результаты и некоторый ум для «начальной загрузки» классификаторов. Это все еще ручная работа, и, если подумать, 500 вопросов не займет так много времени. Быть умным здесь может быстро дать худшие результаты, чем трудолюбие.
Когда у вас есть тренировочные данные в достаточном количестве, возьмите их 75% и создайте классификатор, используя ваш любимый инструмент (например, упомянутые здесь или еще что-то). Теперь пусть классификатор попытается пометить удерживаемые 25% данных и измерить полученную точность. Если результат хороший, тогда поп шампанское. Если нет, то сделайте больше обучающих данных или попробуйте другой классификатор.
TL; DR
Подводя итог, вот как я бы это сделал.
источник