Игра слов, или как любить гречневый каша
Для тех, кому не только нравится разглядывать весёлые картинки, но и любопытно, как они создаются.
Любая программа с машинным обучением начинается со сбора и подготовки данных. Выудить из блокчейна более миллиона постов – дело нехитрое, хоть и времязатратное. Куда веселее потом с этим словесным потоком разбираться. Ведь это не русский язык в чистом виде, а некий крипто-хайпо-сленг вперемешку со ссылками, картинками, смайлами и прочими посторонними примесями. Приходит на ум меткий белорусский термин – трасянка.
Был огромный соблазн просто вытрясти из этой трасянки всё, что не встречается в русском алфавите, но мне хотелось оставить в словаре всякие хайповые словечки типа ICO, airdrop, GBG – и позже они свою роль сыграли. Поэтому пришлось избирательно вычищать всё лишнее, а именно: html-теги, ссылки, картинки, смайлы, цифры, знаки препинания и всякие оформительские звёздочки-решёточки. Кроме того, все прописные буквы превратились в строчные, а несчастная буква ё по извечной традиции заменилась на е. Однобуквенные предлоги были беспощадно выброшены за ненадобностью – смысловой нагрузки не несут.
Так, после косметических процедур прекрасный пост известного комнатного гурмана @alena4e превращается в не менее симпатичный (на мой программистский взгляд) текст:
наша страна обладает феноменальной гречкотерпимостью толерантность данному продукту вызывает ухмылку европейца пусть думаю гречкоменьшинства нашей страны могут смело пройтись парадом по красной площади при поддержке столовых госбезопасности студпита также организаторов школьного питания заведующих детских садов надписи на майках транспарантах мир труд гречка гречка всему голова щи да гречневая каша пища несомненно наша любители гречки всех стран объединяйтесь
Но на этом подготовка ещё не закончена. Наоборот, начинается самое интересное. Не секрет, что русский язык очень богат словоформами. Гречка, гречку, гречки, гречкой – компьютерная программа посчитает их разными словами, хотя по смыслу они идентичны, так же как и любить, люблю, любила. Есть два подхода, как решать эту проблему.
Первый называется стемминг – это когда берётся основа слова (все помнят морфологию из уроков великого и могучего?). Все варианты гречки превращаются в гречк, а проявления любви в люб. Однако это скользкий путь, ведь, например, под люб может скрываться слово любой, что совсем не в тему. Или – что я видел своими глазами – Китай сокращается до кит, таким образом приравниваясь к многоуважаемому на Голосе млекопитающему.
Поэтому я выбрал второй подход – лемматизацию, то есть приведение слова к его нормальной (словарной) форме. Как бы вы ни любили гречку, это выражение всегда превратится в "любить гречка". Вот, что получилось:
наш страна обладать феноменальный гречкотерпимость толерантность дать продукт вызывать ухмылка европеец пусть думать гречкоменьшинство наш страна мочь сметь пройтись парад красный площадь поддержка столовый госбезопасность студпить также организатор школьный питание заведовать детский сад надпись майк транспарант мир труд гречка гречка весь голова щи гречневый_каша пища несомненно наш любитель гречка страна объединяться
Напоминает речь иностранца, позавчера начавшего учить русский язык.
В последнем варианте текста можно заметить ещё одну уловку: гречневый_каша – так называемая биграмма. Это пара слов, которые часто встречаются вместе и несут общий смысл, хотя могут употребляться и по отдельности.
Самый очевидный пример биграмм – имена и названия: робинзон крузо, маршал жуков, советский союз, набережная челны, полина гагарин (только так можно не спутать певицу с первым космонавтом). Ещё это могут быть устойчивые сочетания, такие как искусственный интеллект, соц сеть, народный артист, спинной мозг, грань исчезновение, ложиться спать, легкий атлетика, борьба коррупция, пенсионный реформа, кривить душа, спаржевый фасоль и любимый кулинарами приятный аппетит. И, наконец, характерные для Голоса: vox populi и golos io.
Итак, все тексты прошли предварительную обработку и уместились в одном файле размером 1.5 Gb. Следующим этапом было построение гигантской статистической таблицы, в строках которой посты, в столбцах слова, а в каждой клеточке число – сколько раз слово встречается в посте. Примерно вот так:
гречка | любить | голос | конкурс | биткойн | блокчейн | ... | |
---|---|---|---|---|---|---|---|
Пост 1 | 8 | 1 | 0 | 0 | 0 | 0 | ... |
Пост 2 | 0 | 1 | 3 | 2 | 0 | 1 | ... |
Пост 3 | 0 | 0 | 0 | 0 | 9 | 6 | ... |
... | ... | ... | ... | ... | ... | ... | ... |
Имея на руках такую статистику, можно легко избавиться от двух категорий ненужных слов, которые вряд ли помогут, а скорее даже исказят желаемые результаты. Во-первых, это слишком частые слова, которые попадаются более чем в половине текстов: что, где, как, который, надо и т. д. Во-вторых, крайне редкие, которые встречаются только в единичных случаях (экспериментально я выбрал цифру менее 0.4% от всех документов). Сюда попадают узкая терминология, опечатки и оригинальные авторские находки вроде гречкотерпимости или гречкоменьшинств. Вспоминаются также кабачкоголизм и цуккини-лайфстайл, изобретённые всё тем же кабачково-инертным комнатным гурманом (кстати, "комнатный гурман" программа тоже посчитала биграммой).
А теперь, внимание, чёрный ящик! (пам-пам-пара-па-па-пам-пам, и так далее)
Да, в машинном обучении обязательно должен быть таинственный чёрный ящик, в котором происходит некое волшебство. Нет, я конечно могу рассказать подробнее о Латентном размещении Дирихле, но, пожалуй, пусть оно посидит в ящике, не распугивая оставшихся читателей (если таковые ещё присутствуют). Главное, надо понимать, что мы кладём в ящик (вышеупомянутую таблицу), и что затем из него извлекаем. А извлекаем мы две важные вещи.
1. Представление тем в виде набора слов
Это те самые картинки из прошлого поста. Алгоритм автоматически выбирает самые выделяющиеся темы и характерный для них словарь.
2. Представление постов в виде набора тем
Теперь для любого поста можно прикинуть, к каким темам он относится. Как правило, это будет сочетание нескольких тем в процентном соотношении. Давайте посмотрим что-нибудь относительно свеженькое.
Что можно делать с этими цифрами дальше? Тут уж есть где разгуляться. Например, @avoice высказала идею снять с пользователей бремя придумывания тегов к своим творениям. Только надо всё же доработать алгоритм, чтобы он выделял больше узких тем. Можно поискать связь между тематикой и выплатами, как предложил @ivprst. Мне же хочется полученные данные запихать в очередной чёрный ящик и вывести из семантики постов что-то ещё более интересное. Надеюсь, продолжение следует.
Источники картинок: