×
Россия +7 (495) 139-20-33

Как использовать Python для LSI-копирайтинга

Россия +7 (495) 139-20-33
Шрифт:
16 17513

Вы, скорее всего, слышали об LSI (скрытом семантическом индексировании).

Этот термин последнее время довольно популярен в SEO-индустрии. Кто-то утверждает, что LSI-копирайтинг является залогом попадания сайта в ТОП, кто-то считает это бесполезной тратой времени и ресурсов.

Давайте немного разберемся, что же такое LSI и как оно связано с SEO?

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

В теории, если поисковик может понять контент, он будет корректно его индексировать и ранжировать по целевым запросам. Использование синонимов и тематических слов также теоретически может усилить значимость общей части контента, что должно быть хорошо для SEO, верно? К огромному сожалению, нет прямых доказательств, подтверждающих это.

LSI-копирайтинг – довольно успешный маркетинговый ход. Теперь мы пишем не просто SEO-тексты, а LSI-тексты. Окей. Суть та же. Мы просто добавим синонимов.

Однако не все так плохо. Подобные анализы текстов позволяют сделать достаточно выводов, чтобы создать действительно полезный контент.

Благодаря тем замечательным людям, которые создают библиотеки, используемые в различных языках программирования, мы можем довольно быстро строить терм-документные матрицы, высчитывать TF-IDF и прочее. Если кому-то интересно, пишите в комментариях, я опишу, как это можно сделать на том же Python.

В этой статье не будем уходить в столь глубокий анализ. Относительно понятную картину контента, который ранжируется поисковиками, дает анализ N-грамм, встречающихся в текстах сайтов ТОПа и запросов Вордстат.

Ниже представлен код, написанный на Python 3.0.

Собственно, начнем с подключения того, что давно сделали за нас – импортируем библиотеки, которые понадобятся для работы:


На мой взгляд, pymorphy2 – пока лучшее, что придумано для работы с русскоязычными текстами. Именно эта библиотека дает наиболее точные результаты при работе с словоформами. Именно поэтому скрипт написан на Python.

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


Первое, что делаем – получаем данные Вордстат. Для этого нам нужно зарегистрировать свое приложение для API Яндекс.Директа и получить токен. С Директом все несколько сложнее, чем с другими API, т.к. необходимо подавать заявку на доступ приложения и ждать, пока ее подтвердят на стороне Яндекса.

Прописываем полученный токен:


Создаем запрос на формирование отчета к API и получаем в ответе id нашего отчета:


Дадим Яндексу время на формирование отчета:


В идеале нужно отправлять еще один запрос, ответом на который будет статус отчета, но, как показывает практика, 10 секунд вполне достаточно, чтобы сформировать этот отчет.

Теперь нам нужно получить сам отчет. Подставляем в свойство param наш id и обращаемся к API.


В итоге нам нужно сформировать два датафрейма, где один отвечает за столбец в Вордстат «Что искали со словом…» (SearchedWith), а второй – за похожие запросы (SearchedAlso).


API Директа отдает нам всего 300 запросов, то есть 6 страниц в разделе SearchedWith, то есть нужно учитывать, что это лишь часть запросов.

Теперь переходим к основной задаче – небольшому анализу текстов.

Для этого нам необходимо обратиться к XML выдаче Яндекса. После всех необходимых настроек переходим в раздел «Тест» и выставляем следующие параметры.

LSI и python

Чтобы сильно не перегружать систему, возьмем для анализа ТОП 50 вместо максимально доступного ТОП 100.

Под этим блоком формируется URL самой XML выдачи. Копируем его и подставляем в него наш декодированный запрос.


Прописываем путь к файлу, в которые запишутся все URL ТОП 50 выдачи по нашему запросу. Такой способ вывода результатов позволит в дальнейшем как иметь список URL, так и удалять из списка те, которые отдают ошибку при попытке достать оттуда информацию. Как правило, это случается крайне редко, но имеет место быть.


Отправляем запрос и парсим XML выдачу:


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


Парсим полученные URL и записываем контент тега p результаты в один файл. Тут нужна небольшая, но важная оговорка, что далеко не на всех сайтах текст оформляется тегами p, а некоторые в эти теги добавляют совершенно левую информацию. Но при анализе довольно большого объема текстов хватает информации, которую мы получаем таким образом. В конце концов перед нами не стоит задача создания точной терм-документной матрицы. Нам лишь нужно найти наиболее часто употребляемые N-граммы в текстах ТОП 50.


Приступаем к анализу полученных данных. Указываем файл, куда запишем результаты, загружаем данные парсинга и список стоп-слов, которые мы хотим исключить из анализа N-грамм (предлоги, союзы, технические и коммерческие слова и т.д.)


А дальше немного магии: приводим все слова к их исходной форме, настраиваем CountVectorizer на подсчет N-грамм с количеством слов от 2 до 4 и записываем результат в файл.


Все, что нужно дальше, – записать все результаты в один Excel-файл:


На первом листе выводим подсчет N-грамм, используемых в контенте сайтов:

LSI и python

Быстрый взгляд на первые 100 N-грамм позволяет нам отобрать следующие: «угол» «обзор», «oculus rift», «шлем виртуальный реальность», «vr box», «gear vr», «диагональ дисплей», «playstation vr», «vr очки», «виртуальный мир», «3d очки», «пульт управление», «100 градусов», «полный погружение», «совместимость ос android», «датчик приближение», «линза устройства», «vr гарнитур», «дополнить реальности». Это дает понять, что в тексте стоит затронуть такие понятия, как «угол обзора», «полное погружение», «линзы», «дополненная реальность», «датчик приближения», рассмотреть вопросы совместимости, использовать такие синонимы, как «шлем виртуальной реальности», «vr» и т.д.

На втором листе – данные Вордстат по похожим запросам (по сути, N-Граммы отобразили схожую картину, но порой тут можно встретить то, что в текстах замечено не было):

LSI и python

На третьем, собственно, 300 запросов из первого столбца Вордстат:

LSI и python

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

Подводя итоги, хочется сказать: чтобы не попасть в это самое «очко виртуальной реальности», важно понимать, что наличие LSI-запросов в тексте не является гарантом нахождения статьи в ТОПе. Нужно изучить тексты на хотя бы нескольких сайтах самостоятельно, помнить про основы оптимизации любой статьи, грамотно ее оформлять, размечать и проводить еще много-много работы для того, чтобы создавать понятный и полезный контент как для поисковика, так и для пользователя.

(Голосов: 4, Рейтинг: 5)
Читайте нас в Telegram - digital_bar

Есть о чем рассказать? Тогда присылайте свои материалы Ане Макаровой


Новые 
Новые
Лучшие
Старые
Сообщество
Подписаться 
Подписаться на дискуссию:
E-mail:
ОК
Вы подписаны на комментарии
Ошибка. Пожалуйста, попробуйте ещё раз.
Отправить отзыв
  • Evgeny Montana
    6
    комментариев
    0
    читателей
    Evgeny Montana
    больше года назад
    words_nf = [' '.join([m.parse(word)[0].normal_form for word in x.split()]) for x in texts]  - ругается на texts "Unresolved reference 'texts'"
    -
    0
    +
    Ответить
    • Evgeny Montana
      6
      комментариев
      0
      читателей
      Evgeny Montana
      больше года назад
      NameError: name 'texts' is not defined
      -
      0
      +
      Ответить
      • Иван Бурмистров
        7
        комментариев
        0
        читателей
        Иван Бурмистров
        Evgeny Montana
        больше года назад
        Тут маленький вопрос к публикации:
        После абзаца "Приступаем к анализу полученных данных..." Вставили предыдущую часть кода, вместо того, что было в материалах.

        В общем, в статье пропущена эта часть кода:
        sys.stdout.close()
        sys.stdout = open("C:\\Users\\UserName\\Documents\\result.txt", "w", encoding="utf-8")
        texts = [z.rstrip() for z in open('C:\\Users\\UserName\\Documents\\out.txt'...
        Тут маленький вопрос к публикации:
        После абзаца "Приступаем к анализу полученных данных..." Вставили предыдущую часть кода, вместо того, что было в материалах.

        В общем, в статье пропущена эта часть кода:
        sys.stdout.close()
        sys.stdout = open("C:\\Users\\UserName\\Documents\\result.txt", "w", encoding="utf-8")
        texts = [z.rstrip() for z in open('C:\\Users\\UserName\\Documents\\out.txt', encoding='utf-8')]
        stop_words = [z.rstrip() for z in open('C:\\Users\\UserName\\Documents\\stop_words.txt', encoding='utf-8')]


        Попробуйте после

        for pp in soup.select("p"):
                print(pp.text)
        -
        0
        +
        Ответить
        • Evgeny Montana
          6
          комментариев
          0
          читателей
          Evgeny Montana
          Иван Бурмистров
          больше года назад
          да вроде дальше пошел по стеку, но вот ошибка вывалилась.

          Traceback (most recent call last):
            File "C:/Users/Evgen/PycharmProjects/Montana/test/LSI.py", line 87, in
              ngrams = cvn.fit_transform(words_nf)
            File "D:\Upload\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py", line 869, in fit_transform
              self.fixed_vocabulary_)
           &n...
          да вроде дальше пошел по стеку, но вот ошибка вывалилась.

          Traceback (most recent call last):
            File "C:/Users/Evgen/PycharmProjects/Montana/test/LSI.py", line 87, in
              ngrams = cvn.fit_transform(words_nf)
            File "D:\Upload\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py", line 869, in fit_transform
              self.fixed_vocabulary_)
            File "D:\Upload\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py", line 811, in _count_vocab
              raise ValueError("empty vocabulary; perhaps the documents only"
          ValueError: empty vocabulary; perhaps the documents only contain stop words
          -
          0
          +
          Ответить
        • Дарья Калинская
          249
          комментариев
          0
          читателей
          Иван, Евгений, спасибо! Исправили.
          -
          0
          +
          Ответить
          • Evgeny Montana
            6
            комментариев
            0
            читателей
            Evgeny Montana
            Дарья Калинская
            больше года назад
            посмотрите выше вопрос
            -
            0
            +
            Ответить
            • Иван Бурмистров
              7
              комментариев
              0
              читателей
              Иван Бурмистров
              Evgeny Montana
              больше года назад
              Проверьте, пожалуйста, файл, в который были записаны результаты. Совпадает ли путь, приписанный к файлу, в который выгружаются результаты парсинга и файл, из которого достаются данные в переменную texts
              -
              0
              +
              Ответить
              • Evgeny Montana
                6
                комментариев
                0
                читателей
                Evgeny Montana
                Иван Бурмистров
                больше года назад
                спасибо помогло, только я еще убрал в пути папку Texts_Analyzer так как она не совпадает с url_list файлом который по пути документс в другой строке, выше. Можно ли также на английском выдачу парсить?
                -
                0
                +
                Ответить
                • Иван Бурмистров
                  7
                  комментариев
                  0
                  читателей
                  Иван Бурмистров
                  Evgeny Montana
                  больше года назад
                  В принципе, промежуточные результаты можно не записывать в отдельные файлы. Можно пользоваться функцией append.
                  С английским есть два момента. Если парсить гугл, то не через xml, т.к. аналога яндексовского у него нет. Но самих способов парсинга выдачи описано довольно много. Второе - pymorphy для обработки английского текста не подходит. Для этого нужно воспользоваться, например, библиотекой NLTK.
                  -
                  1
                  +
                  Ответить
  • Павел Горбунов
    6
    комментариев
    0
    читателей
    Павел Горбунов
    больше года назад
    Есть ли какие-то принципиальные отличия работы этого скрипта от того, что делает "Акварель"?
    -
    0
    +
    Ответить
    • Иван Бурмистров
      7
      комментариев
      0
      читателей
      Принципиальных нет, но результаты разные. Сравнивал по одинаковым запросам.
      Я, честно говоря, про Акварель узнал уже после написания скрипта.
      -
      0
      +
      Ответить
  • Boris Nikator
    2
    комментария
    0
    читателей
    Boris Nikator
    больше года назад
    Отличная статья, у самого есть скрипты Python для SEO задач=) Проблема только в теоретической части, здесь нет никакого "LSI", оно вообще для другого используется)

    LSI — Latent Semantic Indexing использует технологию SVD для построения 2х матриц, в обработке текстов, чаще всего, одна — с корпусом документов и топиками, другая с топиками и токенами (ключевыми словами). В данном скрипте эта технология не используется.

    Из полезного: sklearn так...
    Отличная статья, у самого есть скрипты Python для SEO задач=) Проблема только в теоретической части, здесь нет никакого "LSI", оно вообще для другого используется)

    LSI — Latent Semantic Indexing использует технологию SVD для построения 2х матриц, в обработке текстов, чаще всего, одна — с корпусом документов и топиками, другая с топиками и токенами (ключевыми словами). В данном скрипте эта технология не используется.

    Из полезного: sklearn также обладает возможностью делать TF-IDF анализ.
    -
    2
    +
    Ответить
  • afgna4uk
    1
    комментарий
    0
    читателей
    afgna4uk
    больше года назад
    Не получается импортировать библиотеки начиная с from sklearn.feature_extraction.text import CountVectorizer
    -
    0
    +
    Ответить
    • Иван Бурмистров
      7
      комментариев
      0
      читателей
      Иван Бурмистров
      afgna4uk
      больше года назад
      Попробуйте перед этим добавить import sklearn
      Есть sklearn в принципе не находит, то через pip install (!pip install)
      -
      0
      +
      Ответить
ПОПУЛЯРНЫЕ ОБСУЖДЕНИЯ НА SEONEWS
Что скрывает «Прогноз бюджета Яндекс.Директ»?
Михаил Мухин
15
комментариев
0
читателей
Полный профиль
Михаил Мухин - Здравствуйте! 1-2. Считает стенд. Ссылка на него дана, но могу повторить: online.p-c-l.ru/competition/task/card/id/106. Нажмите на кнопку "Начать" и заранее приготовьте прогноз бюджета Яндекс. Суть расчета: перебор комбинаций всех ставок на всех фразах, построение бюджетных когорт - бюджетов с одинаковым СРС, отбор в каждой когорте бюджета с максимальным количеством кликов и ..., да упорядочивание этих бюджетов по мере возрастания СРС, причем берем не все, а с фиксированным шагом. 3. Гугл считается через поправочные коэффициенты. Мы перевариваем океан данных и представляем их. На удивление, получается не менее, хотя и не более точно, как и прогноз Яндекс. Конечно, нужно понимать, что это очень примерные прикидки, фактически перевод неточного прогноза Яндекс в удобочитаемую форму, не больше. Самое интересное начинается, когда применяешь метод бюджетных когорт к измерению показателей фраз на реальной рекламной кампании в режиме 48х7. Первые результаты очень хорошие. Если хотите присоединиться к бесплатному тестированию, напишите Эльвире r-support@r-broker.ru. В теме укажите "хочу присоединиться к тестам Умного управления рекламой"
Ссылочное продвижение локальных сайтов: ТОП худших SEO-методов
demimurych
8
комментариев
0
читателей
Полный профиль
demimurych - о господи. это для регионального сайта? в яндексе? где у сайта по региону конкурентов меньше чем выдачи на двух страницах из которых перваш это реклама москвы? потешно ей богу. ктото чего то не понеимает.
Зачем подменять контент на сайте: разбираем инструмент и развенчиваем мифы
Дмитрий Сульман
4
комментария
0
читателей
Полный профиль
Дмитрий Сульман - Все верно, об этом я и говорю. У крупных компаний есть много данных и они имеют доступ к дорогим технологиям и решениям для персонализации контента. Топовые западные сервисы для персонализации, такие как RichRelevance или Dynamic Yield, стоят от нескольких тысяч до десятков тысяч долларов в месяц. Понятно, что малый бизнес не может себе этого позволить. Да даже если бы чисто теоретически и мог, то это вряд ли бы имело хоть какой-то смысл. Во-первых, у малого бизнеса недостаточно данных, чтобы подобные алгоритмы персонализации начали эффективно работать, а во-вторых, тот профит, который МСБ получит от персонализации, никогда не покроет таких расходов. Мы же предлагаем решение, доступное как раз для малого и среднего бизнеса. При этом наше решение комплексное: МультиЧат - это одновременно и инструмент для персонализации, и для коммуникации.
От мечты стать юристом к собственному SMM-агентству. Как найти себя в современном цифровом мире
Виктор Брухис
5
комментариев
0
читателей
Полный профиль
Виктор Брухис - Статья выглядит так, как пожелали редакторы и интервьюер) Вопросы к интервью подбирал не я)) Хотя, в целом я согласен с вашим видением. А за пожелание удачи большое спасибо!
Монетизируйте свой сайт вместе с VIZTROM
VIZTROM
3
комментария
0
читателей
Полный профиль
VIZTROM - Добрый день! Так как мы сейчас работаем в приватном режиме, Вы врятли можете объективно оценить нашу рекламную площадку. У нас будет официальный запуск 3 марта для вебмастеров. Приглашаем Вас присоединиться к нам и лично посмотреть наш функционал.
Как удвоить выручку за счет продвижения в поиске. Кейс coffee-butik.ru
Максим Боровой
3
комментария
0
читателей
Полный профиль
Максим Боровой - Последний вопрос (извиняюсь за количество) - почему на "В корзину" стоит Nofollow. Осознанно для распределение весов?
Digital-разговор: Михаил Шакин про SEO, Google и заработок в интернете
Анна Макарова
368
комментариев
0
читателей
Полный профиль
Анна Макарова - Подготовим ) Пока предлагаю почитать интервью с Денисом Нарижным из той же серии. Там стенограмма =) www.seonews.ru/interviews/digital-razgovor-denis-narizhnyy-pro-ukhod-iz-seo-i-zarabotok-na-partnerkakh/
Автоматические SEO-аудиты: как напугать некорректными выводами
SEOquick
38
комментариев
0
читателей
Полный профиль
SEOquick - Парсинг сайтов – это самый лучший способ автоматизировать процесс сбора и сохранения информации. Конкурентов всегда нужно мониторить, а не сравнивать свой сайт через автоматический аудит анализатора.
Где SEO-специалист может углубить свои навыки в области поискового продвижения
Ирина Полинина
1
комментарий
0
читателей
Полный профиль
Ирина Полинина - Полезно! Спасибо
Почему вы торгуетесь за показы, даже если платите за клики
Константин Требунских
3
комментария
0
читателей
Полный профиль
Константин Требунских - Дмитрий, спасибо за комментарий, хорошие замечания!) 1. "Какая-то подмена понятий. CPM у “Original Works” взлетает не от того, что у них РАВНАЯ цена клика, а оттого, что вы "с потолка" поставили ему CPC в 2 раза выше, чем был. Логично, что и CPM в 2 раза увеличился (см. формулу выше). Если бы вместо 5 вы всем решили поставить 2 или 1.5, то он бы наоборот уменьшился." Вы правы, что CPM уменьшился бы. В первой и второй табличке берем одинаковое количество показов (именно за них мы платим сначала) и считаем данные, в том числе CPC. Мы поставили рекламодателей в одинаковые условия и посмотрели их эффективность в разрезе цены клика при одинаковом количестве показов. А затем изменился аукцион, и, взяв получившиеся данные по кликам и CTR, мы поставили рекламодателей тоже в одинаковое положение, но уже по цене клика, ведь мы теперь за него платим. Посчитали эффективность в разрезе уже CPM. Тут если и есть подмена понятий, то она точно не моя, а рекламных систем, потому и обозначена, как "ход конем" :) 2. "Ок, смотрим таблички "как оно было" и "как оно стало". Было: система суммарно за 2 000 денег показала рекламу 4 000 раз. Стало: система суммарно за 2 000 денег показала рекламу 13 500 раз. Сомнительный профит для системы." Вы правы, именно поэтому для рекламодателей с низким CTR ставка будет выше, чем для рекламодателей с высоким CTR. Просто чтобы система окупилась. Потому что, системе выгодно продавать показы тем, у кого кликов будет больше (ведь они платят за клик). По факту реальные цены за клик в аукционе будут как в таблице 2. Но ранжирование системы проводят по таблице 5.
ТОП КОММЕНТАТОРОВ
Комментариев
910
Комментариев
834
Комментариев
554
Комментариев
540
Комментариев
483
Комментариев
373
Комментариев
368
Комментариев
262
Комментариев
249
Комментариев
171
Комментариев
156
Комментариев
139
Комментариев
121
Комментариев
108
Комментариев
97
Комментариев
97
Комментариев
96
Комментариев
85
Комментариев
80
Комментариев
77
Комментариев
67
Комментариев
60
Комментариев
59
Комментариев
57
Комментариев
55

Отправьте отзыв!
Отправьте отзыв!