Выделение ключевых слов из массивных названий страниц

Выделение ключевых слов из массивных названий страниц

Выделение ключевых слов из массивных названий страниц

Проблема, которая была и остается достаточно актуально по сей день. Однако наша задача немного более специфична.

И так, что у нас есть?
На входе у нас объем названий страниц (порядка 30 тыс.) совсем не читабельного вида (Например: «Произведенный газ и услуги по распределению газообразного топлива по магистралям»), ясно что никакой здравомыслящий человек не будет искать такого в поисковых системах (однако информация содержащаяся на данных страницах релевантная, правда, основная часть — это статистика).
А чего мы хотим?
Подобрать наиболее правильные ключевые слова к каждому названию, не используя ручную работу.

Первоначально нам необходимо выделить все слова, которые могут иметь отношение к данной странице. Для этого разбиваем название страниц на слова (оставляя только уникальные) и подбираем к каждому слову n-ое количество синонимов, которые доступны в словаре синонимов (конечно, лучше использовать специализированные словари, чтобы не потерять суть названия при его синонимизации). Также не стоит искать синонимы к словам длиной меньше чем 4-5 букв.

Теперь у нас есть массив слов из него мы составляем варианты ключевых фраз для данного названия (очевидно, что количество таких вариантов будет равно два в степени n (количество слов + количество синонимов)). Поскольку массив вариантов может достигать достаточно больших значений, для минимизации памяти, которую будет занимать вариант, каждый из вариантов будем представлять в виде последовательность ноликов (слово не используется) и единичек (слово используется). Например у нас есть массив слов
0 -> «произведенный»,
1 -> «газ»,
2 -> «и»,
3 -> «услуги», etc.
Вариант «произведенный газ» в новой записи будет выглядеть так: 1100…0.

После того как мы создали массив всех вариантов нужно ранжировать, его по каким-то параметрам. Поскольку семантику слов программно проанализировать невозможно, будем опираться на статистические параметры, которые косвенно влияют на то, будет ли введена такая фраза пользователями поисковой системы или нет. Изначально примем, что ранг каждой фразы равен единице.

Параметры, которые можно проанализировать:

  • количество слов в фразе;
  • среднее количество букв в словах фразы;
  • степень схожести слов в одной фразе;
  • части речи, к которым относятся данные слова.

Теперь проанализируем более детально каждый из параметров, который будем рассчитывать.

Количество слов в фразе

Существует достаточно много аналитических статей, которые говорят о том, что среднестатистический запрос рядового пользователя содержит 2-3 слова (как один из примеров таких статей исследование Яндекса 2008 года). Поэтому ранг каждого варианта умножим на плотность гауссовского распределения, случайной величиной будет количество единичек в нашей записи вариантов фраз. μ — будет равно 2.5 (среднее количество слов в запросе), дисперсию в конечном итоге подберем подгонном под результат.

Среднее количество букв в словах фразы

Несомненно наиболее употребляемые слова в поисковых запросах содержат не тридцать букв, и не две. Поэтому положившись на частотный словарь употребления букв в словах в жизни (который утверждает, что среднестатистически слово содержит 5.28 букв), наложим его на наши фразы. Используя тот же метод, что и для предыдущего параметра (случайной величиной будет среднее количество букв в словах фразы).

Степень схожести слов в одной фразе

Очевидно, что слова в поисковых запросах разнятся между собой. Поэтому для уменьшения ранга тавтологических фраз используя алгоритм Оливера высчитываем вероятность того, что во фразе содержится одно и тоже слово в разных вариациях. Для этого попарно сравниваем слова, после чего перемножаем все эти вероятности. Получившаяся вероятность — вероятность того, что все слова в данной фразе это одно и тоже слово. Отнимаем полученную вероятность от единицы, получаем вероятность того, что все слова разные, а данную вероятность умножаем на ранг фразы.

Части речи, используемые в фразе

Интуитивно понятно, что запрос не должен состоять исключительно из одних числительных или наречий. Поэтому для каждого используемого слова определяем часть речи, к которой оно относиться (в реализации данного алгоритма, как основной ЯП использовался PHP, для которого существует библиотека морфологического анализа phpMorphy, позволяющая определять часть речи для определённого набора языков, в том числе для русского). После чего анализируем слова и связки слов входящие во фразу, соответственно присваивая каким-то связкам более высокий коэффициент, каким-то более низкий, каким-то отрицательный. После чего нормируем все коэффициенты на единицу. И в зависимости от наличия тех или иных связок частей речи в фразе умножаем ранг на соответствующий коэффициент.

После проведения такого ранжирования, выбираем варианты из топа и отправляем их на проверку вWordStat. После проверки мы получаем массив ключевых фраз (слова в которых уже согласованы) с соответствием количества запросов в Яндексе за последний месяц. Что дает нам возможность подобрать наиболее удачные средне частотные поисковые запросы, которые близки по тематике к содержанию страниц.

Вывод

Благодаря данному алгоритму нам удалось найти достаточно релевантные поисковые запросы для наших страниц. Конечно же, как и ожидалось данный алгоритм периодически давал сбои с определением ключевых слов, когда суть страницы заключалась именно в словах, которые с его точки зрения никогда не будут употреблены в запросах (Например: коксопродукты), однако таких ошибок было 5-7%, что вполне допустимо на данном объеме.

Хабр рулит.