TFIDF

Проверка TF / IDF запроса

Часто возникает вопрос, на сколько релевантный контент продвигаемому запросу, как можно померить в цифрах релевантность «запрос vs документ»?

Существует разнообразные способы, которые дают понимание лучшей релевантности:

  • TF/IDF
  • BM25
  • BM25F
  • BM11
  • BM15

Разбор TF/IDF

Возьмем краткое описание с Википедии, чтобы понять в чем заключается данный алгоритм, более подробнее тут.

TFIDF (от англ. TF — term frequency, IDF — inverse document frequency) — статистическая мера, используемая для оценки важности слова в контексте документа, являющегося частью коллекции документов или корпуса.

Попробуем сейчас на реальных данных посчитать релевантность документов, а именно заголовка title.

Вместо Title вы можете взять любые другие тексты, например все тексты конкурентов из топ 10.

Для этого мне понадобится:

  1. Запрос  — Продвижение сайтов.
  2. Выбрать регион — Москва.
  3. Топ 10 сайтов по запросу (либо руками собираем либо через сервисы типа Арсенкин или Пиксель Тулз, можно еще Key Collector использовать).
  4. Сравниваем с конкурентами согласно своему интенту (морды с мордами, внутряки с внутряками).
  5. Отсеиваем сайты с дополнительным бустом, например сервисы Яндекса.
  6. Пробегаемся по урлам с помощью Screaming Frog SEO Spider
  7. Копируем title и проверяем со своими значениями.

Проверка онлайн с помощью Python TF/IDF

Я отобрал 5 сайтов c title на которых я буду тестировать алгоритм + добавлю свой сайт, чтобы можно было сравнивать цифры и экспериментировать.

  1. https://www.rookee.ru/vitrina-uslug/seo/ => Поисковое продвижение сайта в ТОП поисковых систем Яндекс и Google, цена услуги — заказать SEO-продвижение и раскрутку запросов в интернете
  2. https://www.metko.ru/seo-prodvizhenie-sayta.html => SEO Продвижение сайта в Москве на выгодных условиях | Интернет агентство Metko
  3. https://www.a-move.ru/prodvizhenie/ => Продвижение сайтов в ТОП ► SEO услуги по раскрутке сайта в Москве
  4. https://www.demis.ru/services/seo-prodvizhenie-saitov/ => Продвижение сайтов в ТОП-10 ☝ Заказать SEO раскрутку в Москве
  5. https://www.inetmarketing.ru/services/seo => Поисковое продвижение сайтов в ТОП-10 Яндекс, заказать seo продвижение, раскрутка веб сайта в Москве
  6. МОЙ Сайт = >
    Поисковое продвижение сайта в ТОП Поисковое продвижение сайта Поисковое продвижение сайта поисковых систем Яндекс и Google, заказать в Москве и по всей России

Нам понадобится пару библиотек для работы с данными:

import numpy as np
import pandas as pd
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
from stop_words import get_stop_words
stop_words = get_stop_words('russian')

Также воспользуемся написанными функциями для облегчения работы с данными.

Работа с лемматизацией

def lemma (text):
    morph_analyze = morph.parse( text.lower() )
    return ( morph_analyze[0].normal_form )

Получение TF/IDF

def tfidf(word, sentence, docs):      
      # Получаем число слов вхождений слов / на длину документов, а именно TF
      tf = sentence.count(word) / len(sentence)    
      # Получаем IDF
      idf = np.log10(len(docs) / sum([1 for doc in docs if word in docs[doc] if word not in stop_words]))
      return round(tf*idf, 4)

Обработка данных с помощью Python

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

title = {}
title['page'] = {
    'https://www.rookee.ru/vitrina-uslug/seo/':'Поисковое продвижение сайта в ТОП поисковых систем Яндекс и Google, цена услуги - заказать SEO-продвижение и раскрутку запросов в интернете',
    'https://www.metko.ru/seo-prodvizhenie-sayta.html':'SEO Продвижение сайта в Москве на выгодных условиях | Интернет агентство Metko',
    'https://www.a-move.ru/prodvizhenie/':'Продвижение сайтов в ТОП ► SEO услуги по раскрутке сайта в Москве',
    'https://www.demis.ru/services/seo-prodvizhenie-saitov/':'Продвижение сайтов в ТОП-10 ☝ Заказать SEO раскрутку в Москве',
    'https://www.inetmarketing.ru/services/seo':'Поисковое продвижение сайтов в ТОП-10 Яндекс, заказать seo продвижение, раскрутка веб сайта в Москве',
    'МОЙ сайт':'Поисковое продвижение сайта в ТОП, заказать сайт в Москве и по всей России'
    }

Нас интересует насколько хорошо ранжируются тексты по запросу «продвижение сайта».

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

key = ['продвижение сайта'][0].split()
new_result = {}
for i in title['page']:
  url = title['page']
  title_page = title['page'][i].lower().split()   
  new_result[i] = {}
  for k in key:
    k = k.lower()       
    res = tfidf(k, title_page, url)     
    new_result[i].update({k:res})
    

Результат

Rang Top url продвижение сайта Сумма
0 https://www.rookee.ru/vitrina-uslug/seo/ 0.0151 0.0040 0.0382
1 https://www.metko.ru/seo-prodvizhenie-sayta.html 0.0251 0.0066 0.0634
2 https://www.a-move.ru/prodvizhenie/ 0.0251 0.0066 0.0634
3 https://www.demis.ru/services/seo-prodvizhenie… 0.0301 0.0000 0.0602
4 https://www.inetmarketing.ru/services/seo 0.0215 0.0057 0.0544
5 МОЙ сайт 0.0393 0.0103 0.0992

Тест кейс

Теперь представим вы находитесь в топ 10 по вкусному запросу, но к вам подходит руководитель или менеджер и говорит нужно добавить текст на страницу, всего + 10 слов или +40% от исходного, совсем немного, что же будет в данном случае, давайте попробуем это симулировать.

title = {} 
title['page'] = { 
'https://www.rookee.ru/vitrina-uslug/seo/':'Поисковое продвижение сайта в ТОП поисковых систем Яндекс и Google, цена услуги - заказать SEO-продвижение и раскрутку запросов в интернете',
'https://www.metko.ru/seo-prodvizhenie-sayta.html':'SEO Продвижение сайта в Москве на выгодных условиях | Интернет агентство Metko',          
'https://www.a-move.ru/prodvizhenie/':'Продвижение сайтов в ТОП ► SEO услуги по раскрутке сайта в Москве', 
'https://www.demis.ru/services/seo-prodvizhenie-saitov/':'Продвижение сайтов в ТОП-10 ☝ Заказать SEO раскрутку в Москве',  
'https://www.inetmarketing.ru/services/seo':'Поисковое продвижение сайтов в ТОП-10 Яндекс, заказать seo продвижение, раскрутка веб сайта в Москве', 
'МОЙ сайт':'Поисковое продвижение сайта в ТОП, заказать сайт в Москве и по всей России. Интернет магазин Рога и копыта предлагает воспользоваться услугой адресной доставки' }

 

Rang Top url продвижение сайта Сумма
0 https://www.rookee.ru/vitrina-uslug/seo/ 0.0151 0.0040 0.0191
1 https://www.metko.ru/seo-prodvizhenie-sayta.html 0.0251 0.0066 0.0317
2 https://www.a-move.ru/prodvizhenie/ 0.0251 0.0066 0.0317
3 https://www.demis.ru/services/seo-prodvizhenie… 0.0301 0.0000 0.0301
4 https://www.inetmarketing.ru/services/seo 0.0215 0.0057 0.0272
5 МОЙ сайт 0.0131 0.0034 0.0165

Как видим релевантность документа снизилась на 0.0827, была 0.0992 стала 0.0165.

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

Лемматизация документа и запроса

Теперь посмотрим, как релевантность документов изменится при лемматизации термов.

Используем нашу прошлую функцию, но добавляем параметр: lemm = True.

title = {}
title['page'] = {
    'https://www.rookee.ru/vitrina-uslug/seo/':'Поисковое продвижение сайта в ТОП поисковых систем Яндекс и Google, цена услуги - заказать SEO-продвижение и раскрутку запросов в интернете',
    'https://www.metko.ru/seo-prodvizhenie-sayta.html':'SEO Продвижение сайта в Москве на выгодных условиях | Интернет агентство Metko',
    'https://www.a-move.ru/prodvizhenie/':'Продвижение сайтов в ТОП ► SEO услуги по раскрутке сайта в Москве',
    'https://www.demis.ru/services/seo-prodvizhenie-saitov/':'Продвижение сайтов в ТОП-10 ☝ Заказать SEO раскрутку в Москве',
    'https://www.inetmarketing.ru/services/seo':'Поисковое продвижение сайтов в ТОП-10 Яндекс, заказать seo продвижение, раскрутка веб сайта в Москве',
    'МОЙ сайт':'Поисковое продвижение сайта в ТОП, заказать сайт в Москве и по всей России'
    }

Как видим из таблицы сумма значений \изменилась, на сайте demis.ru не использовался запрос «сайт» в title, но когда мы применили лемматизацию, поиск стал учитывать данный фактор.

Rang Top url продвижение (лемма) сайт (лемма) Сумма
0 https://www.rookee.ru/vitrina-uslug/seo/ 0.0795 0.1297 0.2092
1 https://www.metko.ru/seo-prodvizhenie-sayta.html 0.1297 0.1297 0.2594
2 https://www.a-move.ru/prodvizhenie/ 0.1297 0.1590 0.2887
3 https://www.demis.ru/services/seo-prodvizhenie… 0.1297 0.1297 0.2594
4 https://www.inetmarketing.ru/services/seo 0.0795 0.1590 0.2385
5 МОЙ сайт 0.1297 0.1590 0.2887

Я ориентируюсь обычно, чтобы цифры текстовой оптимизации были в диапазоне 0.50-0.75 персентиле, а именно больше медианы и меньше 75% от значений топа.

Только за счет текстовой оптимизации и внутренней перелинковки, мне удавалось попасть в ТОП 30 по ВЧ ВК запросам, а уже дальше нужны ссылки, ПФ и многое другое.

Микрозаймы

Есть желание затестить код, велком

Вопросы и ответы

Нужно ли проверять TF IDF
Можно конечно просто взять текст и посчитать количество униграмм в текстах, взять медиану вхождений и длину текста. Но как я писал выше, нужно понимать, что может быть с оценкой ранжирования, если вы просто добавите десяток слов или например убавите.
Насколько формула отличается от BM25
Формулы отличаются, но не сильно. Разберем в следующей статье. Основное отличие это внедрение коэффициентов, а также разбор разных зон документа.
Можно считать только в Python?
Можно считать как на голом Python, с помощью библиотеки scikit learn, а также на другом любом языке программирования или даже на калькуляторе :).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *