<стр>Узнайте, как выявить каннибализацию ключевых слов с помощью встраивания текста OpenAI. Понимайте различия между различными моделями и принимайте обоснованные решения по SEO.
<п>Эта новая серия статей посвящена работе с LLM для масштабирования ваших SEO-задач. Мы надеемся помочь вам интегрировать искусственный интеллект в SEO, чтобы вы могли повысить свои навыки.
Мы надеемся, что вам понравилась предыдущая статья и вы понимаете, что такое векторы, векторные расстояния и встраивание текста.
После этого пришло время напрячь свои “мышцы знаний в области искусственного интеллекта” научившись использовать встраивание текста для обнаружения каннибализации ключевых слов.
Мы начнем с встраивания текста OpenAI и сравним их.
<тело> <тр>
Модель
размерность
Цены
Примечания
тр> <тр>
text-embedding-ada-002
1536
0,10 доллара США за 1 млн токенов
Отлично подходит для большинства случаев использования.
тр> <тр>
text-embedding-3-small
1536
0,002 доллара США за 1 млн токенов
Быстрее и дешевле, но менее точно
тр> <тр>
text-embedding-3-large
3072
0,13 доллара США за 1 млн токенов
Более точный для сложных задач, связанных с длинным текстом, медленнее
тр> тело> стол>
(*токены можно рассматривать как слова.)
Но прежде чем мы начнем, вам необходимо установить Python и Jupyter на ваш компьютер.
Jupyter — это веб-инструмент для профессионалов и исследователей. Он позволяет выполнять сложный анализ данных и разработку моделей машинного обучения с использованием любого языка программирования.
<п>
Как только вы это сделаете, настройте уведомления по электронной почте, чтобы информировать вас, когда ваши расходы превысят определенную сумму в пределах Ограничений использования.п> <п>Затем получите ключи API в Dashboard > ключи API,, которые следует хранить в тайне и никогда не публиковать публично.
Ключи API OpenAI
Теперь у вас есть все необходимые инструменты, чтобы начать экспериментировать с встраиваниями.
<ул>
Откройте командный терминал компьютера и введите jupyter lab.
В вашем браузере должно появиться что-то вроде изображения, показанного ниже.
Нажмите Python 3 под Notebook.
мкл>
jupyter lab
В открывшемся окне напишите свой код.
В качестве небольшой задачи давайте сгруппируем похожие URL-адреса из CSV-файла. Образец CSV-файла содержит два столбца: URL-адрес и заголовок. Задача нашего скрипта будет состоять в том, чтобы сгруппировать URL-адреса со схожим семантическим значением на основе заголовка, чтобы мы могли объединить эти страницы в одну и исправить проблемы каннибализации ключевых слов.
Вот шаги, которые вам нужно сделать:
Установите необходимые библиотеки Python с помощью следующих команд на терминале вашего ПК (или в ноутбуке Jupyter)
pip install pandas openai scikit-learn numpy unidecode <п>‘openai’ библиотека необходима для взаимодействия с API OpenAI для получения внедрений, а ‘pandas’ используется для манипулирования данными и обработки операций с файлами CSV.
The ‘scikit-learn’ библиотека необходима для расчета косинусного подобия, а ‘numpy’ необходим для числовых операций и обработки массивов. Наконец, для очистки текста используется unidecode.
Затем загрузите образец листа в формате CSV, переименуйте файл вpages.csv и загрузите его в папку Jupyter, где находится ваш скрипт.
Установите для ключа API OpenAI ключ, полученный на предыдущем шаге, и скопируйте и вставьте приведенный ниже код в блокнот.
Запустите код, щелкнув значок треугольника воспроизведения в верхней части блокнота.
<п>импортировать панд как pd импорт опенай из sklearn.metrics.pairwise импортировать cosine_similarity импортировать numpy как np импортировать CSV из Юнидекода импортировать Юнидекод # Функция очистки текста def clean_text(text: str) -> ул: # Сначала замените известные проблемные символы их правильными эквивалентами. замены = { '–': '–', # в тире '’': '’', # правая одинарная кавычка '“': '“', # левая двойная кавычка 'â€': '”', # правая двойная кавычка '‘': '‘', # левая одинарная кавычка 'â€': '—' #эм тире } для старого и нового в replaces.items(): текст = text.replace(старый, новый) # Затем используйте unidecode для транслитерации всех оставшихся проблемных символов Unicode. текст = юнидекод(текст) вернуть текст # Загрузите CSV-файл с кодировкой UTF-8 из корневой папки проекта Jupiter. df = pd.read_csv('pages.csv',coding='utf-8') # Очистите столбец «Название», чтобы удалить ненужные символы. df['Title'] = df['Title'].apply(clean_text) # Установите ключ API OpenAI openai.api_key = 'ваш-ключ-апи-идет сюда' # Функция для получения вложений защита get_embedding (текст): ответ = openai.Embedding.create(input=[text], engine=”text-embedding-ada-002″) вернуть ответ['данные'][0]['встраивание'] # Генерируем вложения для всех заголовков df['embedding'] = df['Title'].apply(get_embedding) # Создаем матрицу вложений embedding_matrix = np.vstack(df['embedding'].values) # Вычисляем матрицу косинусного подобия подобие_матрицы = косинус_сходство (встроенная_матрица) # Определить порог сходства likeity_threshold = 0,9 # поскольку порог несходства равен 0,1 # Создайте список для хранения групп группы = [] # Следите за посещенными индексами посетил = установить() # Группируем похожие заголовки на основе матрицы сходства для меня в диапазоне (len (similarity_matrix)): если я не посетил: # Найти все похожие заголовки like_indices = np.where(similarity_matrix[i] >=likeity_threshold)[0] # Сравнение журналов print(f”nПроверка сходства для '{df.iloc[i]['Title']}' (индекс {i}):”) печать(“-” * 50) для j в диапазоне (len (similarity_matrix)): if i != j: # Убедитесь, что заголовок не сравнивается сам с собой значение_сходства = матрица_сходства[i, j] сравнение_результат = 'больше', если значение_сходства >= порог_сходства, иначе 'меньше' print(f”По сравнению с '{df.iloc[j]['Title']}' (индекс {j}): сходство = {similarity_value:.4f} ({comparison_result}, чем пороговое значение)”) # Добавьте эти индексы в посещенные посетил.обновление(похожие_индексы) # Добавляем группу в список group = df.iloc[similar_indices][['URL', 'Title']].to_dict('records') groups.append(группа) print(f”nСформированная группа {len(groups)}:”) для товара в группе: print(f” – URL: {item['URL']}, Title: {item['Title']}”) # Проверяем, созданы ли группы если не группы: print(“Группы не созданы.”) # Определите выходной CSV-файл выходной_файл = 'grouped_pages.csv' # Запишите результаты в файл CSV с кодировкой UTF-8. с open(output_file, 'w', newline='',coding='utf-8') как CSV-файл: имена полей = ['Группа', 'URL', 'Название'] писатель = csv.DictWriter(csvfile, fieldnames=fieldnames) писатель.writeheader() для group_index, группа в перечислении (группы, начало = 1): для страницы в группе: clean_title = clean_text(page['Title']) # Убедитесь, что в выводе нет нежелательных символов Writer.writerow({'Группа': group_index, 'URL': страница['URL'], 'Заголовок': очищенный_заголовок}) print(f”Группа записи {group_index}, URL: {page['URL']}, Название: {cleaned_title}”) print(f”Вывод записывается в {output_file}”)
Этот код читает CSV-файл ‘pages.csv,’ содержащие заголовки и URL-адреса, которые вы можете легко экспортировать из своей CMS или получить, просканировав клиентский веб-сайт с помощью Screaming Frog.
Затем он очищает заголовки от символов, отличных от UTF, генерирует векторы внедрения для каждого заголовка с помощью API OpenAI, вычисляет сходство между заголовками, группирует похожие заголовки вместе и записывает сгруппированные результаты. в новый файл CSV, ‘grouped_pages.csv.’
В задаче каннибализации ключевых слов мы используем порог сходства 0,9, что означает, что если косинусное сходство меньше 0,9, мы будем считать статьи разными. Чтобы визуализировать это в упрощенном двумерном пространстве, это будет выглядеть как два вектора с углом между ними примерно 25 градусов.
<п>
В вашем случае вы можете использовать другой порог, например 0,85 (приблизительно 31 градус между ними), и запустить его на выборке ваших данных, чтобы оценить результаты и общее качество совпадений. Если это неудовлетворительно, вы можете увеличить порог, чтобы сделать его более строгим и повысить точность.
Вы можете установить ‘matplotlib’ через терминал.
pip установить matplotlib <п>И используйте приведенный ниже код Python в отдельном блокноте Jupyter, чтобы самостоятельно визуализировать сходство косинусов в двумерном пространстве. Попробуй это; это весело!
<п>импортировать matplotlib.pyplot как plt импортировать numpy как np # Определите угол для косинусного подобия 0,9. Измените здесь желаемое значение. тета = np.arccos(0,9) # Определим векторы u = np.array([1, 0]) v = np.array([np.cos(тета), np.sin(тета)]) # Определить матрицу поворота на 45 градусов вращение_матрица = np.array([ [np.cos(np.pi/4), -np.sin(np.pi/4)], [np.sin(np.pi/4), np.cos(np.pi/4)] ]) # Применяем поворот к обоим векторам u_rotated = np.dot(rotation_matrix, u) v_rotated = np.dot(rotation_matrix, v) # Построение векторов plt.figure() plt.quiver(0, 0, u_rotated[0], u_rotated[1], angulars='xy', Scale_units='xy', масштаб=1, цвет='r') plt.quiver(0, 0, v_rotated[0], v_rotated[1], angulars='xy', Scale_units='xy', масштаб=1, цвет='b') # Установка пределов графика только в положительные диапазоны plt.xlim(0, 1,5) plt.ylim(0, 1,5) # Добавляем метки и сетку plt.xlabel('ось X') plt.ylabel('ось Y') plt.grid(Истина) plt.title('Визуализация векторов с косинусоидальным сходством 0,9') #Показать сюжет plt.show()
Я обычно использую значение 0,9 и выше для выявления проблем каннибализации ключевых слов, но вам может потребоваться установить значение 0,5 при работе с перенаправлениями старых статей, поскольку в старых статьях могут отсутствовать почти идентичные статьи, которые являются более свежими, но частично близкими. .п>
В случае перенаправления также может быть лучше объединить метаописание с заголовком в дополнение к заголовку.
<п>Итак, это зависит от задачи, которую вы выполняете. Мы рассмотрим, как реализовать перенаправление, в отдельной статье этой серии позже.
Теперь давайте рассмотрим результаты трех упомянутых выше моделей и посмотрим, как они смогли идентифицировать близкие статьи из нашей выборки данных из статей Search Engine Journal.< /п>
Пример данных <п>Из списка мы уже видим, что 2-я и 4-я статьи посвящены одной и той же теме «мета-теги». Статьи в 5-й и 7-й строках практически одинаковы – обсуждение важности тегов H1 в SEO – и их можно объединить.
Статья в 3-м ряду не имеет сходства ни с одной из статей в списке, но имеет общие слова типа “Tag” или “SEO.”
Статья в 6-й строке снова посвящена H1, но не совсем так, как важность H1 для SEO. Вместо этого оно отражает мнение Google о том, должны ли они совпадать.
Артикулы в 8-й и 9-й строках довольно близки, но все же различны; их можно комбинировать.
<х2>text-embedding-ada-002
Используя ‘text-embedding-ada-002,’ мы точно нашли 2-ю и 4-ю статьи с косинусным сходством 0,92, а 5-ю и 7-ю статьи со сходством 0,91.
Снимок экрана из журнала Jupyter, показывающий сходство косинусов
И он генерировал выходные данные с сгруппированными URL-адресами, используя один и тот же номер группы для похожих статей. (цвета применяются вручную для целей визуализации).
Выводной лист с сгруппированными URL-адресами
Для 2-й и 3-й статей, в которых есть общие слова “Tag” и “SEO” но не связаны между собой, косинусное сходство составило 0,86. Это показывает, почему необходим высокий порог сходства 0,9 или выше. Если мы установим значение 0,85, оно будет полно ложных срабатываний и может предложить объединить несвязанные статьи.
text-embedding-3-small
Используя ‘text-embedding-3-small,’ Совершенно удивительно, что он не нашел ни одного совпадения с нашим порогом сходства 0,9 или выше.
Для 2-го и 4-го изделий косинусное сходство составило 0,76, а для 5-го и 7-го изделий – 0,77.
Чтобы лучше понять эту модель посредством экспериментов, я добавил слегка измененную версию 1-го ряда с ’15’ против ’14’ к образцу.
<ол>
“14 наиболее важных мета- и HTML-тегов, которые необходимо знать для SEO”
“15 наиболее важных мета- и HTML-тегов, которые нужно знать для SEO”
ол>
Пример, который показывает результаты встраивания текста 3-маленьких
Напротив, ‘text-embedding-ada-002’ дало косинусное сходство между этими версиями на 0,98.
<тело>
Title 1
Title 2
Косинусное сходство
тр>
14 наиболее важных мета- и HTML-тегов, которые нужно знать для SEO
15 Наиболее важные мета- и HTML-теги, которые нужно знать для SEOтд>
0.92
тр>
14 наиболее важных мета- и HTML-тегов, которые нужно знать для SEO
Метатеги: что нужно знать для SEO
0.76
тр> тело> стол>
Здесь мы видим, что эта модель не совсем подходит для сравнения названий.
text-embedding-3-large
<п>Размерность этой модели составляет 3072, что в 2 раза выше, чем у ‘text-embedding-3-small’ и ‘text-embedding-ada-002′, с размерностью 1536.
Поскольку у нее больше измерений, чем у других моделей, мы могли бы ожидать, что она уловит семантическое значение с большей точностью.
Однако это дало косинусное сходство 2-й и 4-й статей 0,70, а сходство 5-й и 7-й статей – 0,75.
<п>Я еще раз протестировал ее со слегка измененными версиями первой статьи с ’15’ против ’14’ и без ‘Самое важное’ в заголовке.
<ол>
“14 наиболее важных мета- и HTML-тегов, которые необходимо знать для SEO”
“15 наиболее важных мета- и HTML-тегов, которые нужно знать для SEO”
“14 мета- и HTML-тегов, которые нужно знать для SEO”
ол>
<тело> <тр>
Title 1
Title 2
Косинусное сходство
тр> <тр>
14 наиболее важных мета- и HTML-тегов, которые нужно знать для SEO
15 Наиболее важные мета- и HTML-теги, которые нужно знать для SEO
0.95
тр> <тр>
14 самых важных мета- и HTML-тегов, которые нужно знать для SEO
14 наиболее важных мета- и HTML-тегов, которые нужно знать для SEO
0.93
тр> <тр>
14 наиболее важных мета- и HTML-тегов, которые нужно знать для SEO
Метатеги: что нужно знать для SEO
0.70
тр> <тр>
15 наиболее важных мета- и HTML-тегов, которые нужно знать для SEO
14 Самое важное Мета- и HTML-теги, которые нужно знать для SEO
0.86
тр> тело> стол> <п>Итак, мы видим, что ‘text-embedding-3-large’ уступает по производительности по сравнению с ‘text-embedding-ada-002’ когда мы вычисляем косинусное сходство между заголовками.
Хочу отметить, что точность ‘text-embedding-3-large’ увеличивается с длиной текста, но ‘text-embedding-ada-002’ в целом производительность по-прежнему лучше.
Другим подходом может быть удаление стоп-слов из текста. Их удаление иногда может помочь сосредоточить встраивание на более значимых словах, что потенциально повышает точность таких задач, как расчет сходства.
<п>Лучший способ определить, повышает ли удаление стоп-слов точность вашей конкретной задачи и набора данных, — это эмпирически проверить оба подхода и сравнить результаты.
<ч2>Заключениеч2>
С помощью этих примеров вы научились работать с моделями встраивания OpenAI и уже можете выполнять широкий спектр задач.
Для определения порогов сходства вам необходимо поэкспериментировать с собственными наборами данных и посмотреть, какие пороговые значения имеют смысл для вашей конкретной задачи, запустив их на меньших выборках данных и выполнив проверку результатов человеком.стр>
Обратите внимание, что код, который мы имеем в этой статье, не оптимален для больших наборов данных, поскольку вам нужно создавать встраивания текста статей каждый раз, когда в вашем наборе данных происходят изменения, для сравнения с другими строками.< /п>
Чтобы сделать это эффективным, мы должны использовать базы данных векторов и хранить в них встраиваемую информацию после ее создания. Очень скоро мы рассмотрим, как использовать базы данных векторов, и изменим приведенный здесь пример кода для использования базы данных векторов.