Как организовать кластеризацию десятков миллионов текстов?
С новым годом, дамы и господа!
По работе внезапно понадобилось классифицировать несколько десятков миллионов статей. Иными словами, определить категорию входных текстов. На выходе должно быть примерно следующее:
И так далее. Здесь "Статья 1" - это заголовок статьи (у нее есть и текст, разумеется). Данные в фигурных скобках - это пара-тройка максимальных категорий. Т.е. необходимо вычислять, к какой категории вероятнее всего относится статья, и этот коэффициент "вероятности", или скорее "похожести", выражать в процентах.
Категорий будет несколько десятков. Статей - десятки миллионов.
Я знаком с machine learning самую малость, к сожалению. Логически понимаю, что нужна тестовая выборка для "обучения" кластеризатора. Тестовая выборка у нас есть - десятки тысяч статей, уже имеющих определенную категорию (новостной сайт). Т.е. весь программный комплекс должен вначале пробежаться по тестовой выборке, "обучиться" (выявить какие-то слова-маркеры), а затем отклассифицировать наши "сырые" данные.
Времени у меня на обучение, просмотр длинных видео, написание своего кода и т.п. - нет. К сожалению, т.к. тема интересная. Но факт остается фактом - очень прошу скидывать ссылки на уже готовые решения для данной задачи (кластеризаторы), чтобы на допиливание не пришлось тратить уйму времени. Наверняка что-то подобное уже написано и выложено на гитхаб или еще куда-то. Но я к сожалению не нагуглил ничего.
Очень надеюсь на помощь хабрасообщества, которое уже выручало меня не раз.
P.S. Задача выглядит как классика для нейросетей, но 1) мои практические познания в этой области стремятся к нулю, 2) я опасаюсь, что нейросеть будет работать слишком медленно.
Благодарю за ответ. Хотя все же не совсем ясно, как это здесь применимо. Допустим, есть какая-то статья с заголовком "Новый Мерседес C-класса", в ней речь идет о том, что в сеть просочился концепт-арт нового автомобиля (т.е. дизайнерские эскизы). Слова "дизайн", "форма", "стиль", "вид" и им подобные будут встречаться с заметной частотой, в то время как слово "автомобиль" может содержаться всего 1-2 раза, и статья может запросто быть отнесена к категории "искусство" (что неверно) - категория "авто" будет следовать за ней с заметным отставанием. Другими словами - решение "в лоб" скорее всего будет работать неправильно. Важно не только количество тех или иных слов, но и соотношение между ними, близость к началу статьи, нахождение в тексте\заголовке, и возможно что-то еще.
Вам нужна классификация, а не кластеризация, это разные методы. Т. е. если будете гуглить, то ищите именно про автоматическую классификацию. В качестве готового решения можно попробовать взять что-нибудь типа Weka (www.cs.waikato.ac.nz/~ml/weka), но я не знаю, насколько хорошо оно работает с русскими текстами.
спасибо за подсказку про классификацию. Я думал, что кластеризация сама по себе основывается на классификации, ведь чтобы как-то сгруппировать объекты, необходимо вначале выделить какие-то общие характеристики. Weka выглядит весьма многообещающе, спасибо.
При классификации есть заранее заданный набор категорий и обучающая выборка. При кластеризации есть только сам набор документов, в котором нужно найти группы похожих документов.
Для похожих задач я использую реализованный в gensim алгоритм LDA. Автоматически создаётся определённое количество тем и вычисляется вероятность, с которой каждый документ относится к какой-либо теме
andyN это ни похожесть, и ни кластеризация, а это - СЕГМЕНТАЦИЯ.
Делается так: берется слово и ставится по всем необходимым типам веса.
Например, "президент":
[политика]:0.5
[закон]:0.5
[общество]: 0.4
[досуг]:0.1
[дети]:0.1
и т.д. для каждого КОРНЯ слова. Также, делается словарь синонимов, который будет линковать слова-синонимы к известным весам в таблице. Повторы КОРНЕЙ - не учитываем при суммировании веса.
После этого текст преобразуем по словарю синонимов и далее подсчитываем веса по каждой категории.
Профит!