So automatisieren Sie SEO-Keyword-Clustering nach Suchabsicht mit Python

Anmerkung des Herausgebers: Das Jahr 2021 geht zu Ende und wir feiern dieses Jahr mit einem 12-Tage-Weihnachts-Countdown der beliebtesten und hilfreichsten Expertenartikel im Search Engine Journal.

Diese Sammlung wurde von unserem Redaktionsteam basierend auf der Leistung, dem Nutzen, der Qualität und dem Mehrwert jedes Artikels für Sie, unsere Leser, zusammengestellt.

Bis zum 24. Dezember veröffentlichen wir jeden Tag eine der besten Kolumnen des Jahres, beginnend bei Nr. 12 und rückwärts bis Nr. 1. Heute ist Nummer 11, ursprünglich veröffentlicht am 28. Juli 2021.

Andreas Voniatis hat fantastische Arbeit geleistet und erklärt, wie man mit Python Keyword-Cluster nach Suchabsicht erstellt. Die Bilder und Screencaps machen es einfach, Schritt für Schritt mitzumachen, sodass selbst der Anfänger mit Python mitmachen kann. Gut gemacht, Andreas!

Anzeige

Weiter unten lesen

Vielen Dank, dass Sie zum Search Engine Journal beigetragen und Ihr Wissen mit den Lesern geteilt haben.

Genießen Sie alle!


Es gibt viel über die Suchabsicht zu wissen, von der Verwendung von Deep Learning zum Ableiten der Suchabsicht durch Klassifizieren von Text und Aufschlüsseln von SERP-Titeln mithilfe von Techniken der natürlichen Sprachverarbeitung (NLP) bis hin zu Clustering basierend auf semantischer Relevanz mit den erläuterten Vorteilen.

Wir kennen nicht nur die Vorteile der Entschlüsselung der Suchabsicht, sondern verfügen auch über eine Reihe von Techniken zur Skalierung und Automatisierung.

Aber oft geht es dabei um den Aufbau einer eigenen KI. Was ist, wenn Sie weder die Zeit noch das Wissen dafür haben?

Anzeige

Weiter unten lesen

In dieser Spalte erfahren Sie Schritt für Schritt, wie Sie das Keyword-Clustering nach Suchabsicht mit Python automatisieren.

SERPs enthalten Erkenntnisse zur Suchabsicht

Einige Methoden erfordern, dass Sie die gesamte Kopie aus den Titeln des Ranking-Inhalts für ein bestimmtes Keyword abrufen und diese dann in ein neuronales Netzwerkmodell einspeisen (das Sie dann erstellen und testen müssen), oder Sie verwenden NLP, um Keywords zu clustern .

Es gibt eine andere Methode, mit der Sie die eigene KI von Google verwenden können, um die Arbeit für Sie zu erledigen, ohne den gesamten Inhalt der SERPs abkratzen und ein KI-Modell erstellen zu müssen.

Nehmen wir an, Google ordnet Site-URLs nach der Wahrscheinlichkeit, dass der Inhalt die Benutzeranfrage erfüllt, in absteigender Reihenfolge. Daraus folgt, dass die SERPs wahrscheinlich ähnlich sind, wenn die Absicht für zwei Keywords gleich ist.

Viele SEO-Experten haben jahrelang die SERP-Ergebnisse für Keywords verglichen, um eine gemeinsame (oder gemeinsame) Suchabsicht abzuleiten, um über Core-Updates auf dem Laufenden zu bleiben. Dies ist also nichts Neues.

Der Mehrwert hier ist die Automatisierung und Skalierung dieses Vergleichs, die sowohl Geschwindigkeit als auch höhere Präzision bietet.

So gruppieren Sie Schlüsselwörter nach Suchabsicht in großem Maßstab mit Python (mit Code)

Beginnen Sie mit Ihren SERPs-Ergebnissen in einem CSV-Download.

Anzeige

Weiter unten lesen

1. Importieren Sie die Liste in Ihr Python-Notizbuch.

import pandas as pd
import numpy as np

serps_input = pd.read_csv('data/sej_serps_input.csv')
serps_input

Unten ist die SERPs-Datei, die jetzt in einen Pandas-Datenrahmen importiert wurde.

2. Filterdaten für Seite 1

Wir möchten die Ergebnisse der Seite 1 jeder SERP zwischen den Keywords vergleichen.

Anzeige

Weiter unten lesen

Wir teilen den Datenrahmen in Mini-Schlüsselwort-Datenrahmen auf, um die Filterfunktion auszuführen, bevor wir ihn zu einem einzelnen Datenrahmen zusammenfügen, da wir auf Schlüsselwortebene filtern möchten:

# Split 
serps_grpby_keyword = serps_input.groupby("keyword")
k_urls = 15

# Apply Combine
def filter_k_urls(group_df):
    filtered_df = group_df.loc[group_df['url'].notnull()]
    filtered_df = filtered_df.loc[filtered_df['rank'] <= k_urls]
    return filtered_df
filtered_serps = serps_grpby_keyword.apply(filter_k_urls)

# Combine
## Add prefix to column names
#normed = normed.add_prefix('normed_')

# Concatenate with initial data frame
filtered_serps_df = pd.concat([filtered_serps],axis=0)
del filtered_serps_df['keyword']
filtered_serps_df = filtered_serps_df.reset_index()
del filtered_serps_df['level_1']
filtered_serps_df

3. Konvertieren von Ranking-URLs in einen String

Da es mehr SERP-Ergebnis-URLs als Keywords gibt, müssen wir diese URLs in eine einzige Zeile komprimieren, um die SERP des Keywords darzustellen.

Hier ist wie:

# convert results to strings using Split Apply Combine
filtserps_grpby_keyword = filtered_serps_df.groupby("keyword")
def string_serps(df):
    df['serp_string'] = ''.join(df['url'])
    return df    

# Combine
strung_serps = filtserps_grpby_keyword.apply(string_serps)

# Concatenate with initial data frame and clean
strung_serps = pd.concat([strung_serps],axis=0)
strung_serps = strung_serps[['keyword', 'serp_string']]#.head(30)
strung_serps = strung_serps.drop_duplicates()
strung_serps

Unten sehen Sie die SERP, die für jedes Keyword in einer einzigen Zeile komprimiert ist.
SERP komprimiert in einer einzigen Zeile für jedes Schlüsselwort.

4. Vergleichen Sie die SERP-Ähnlichkeit

Um den Vergleich durchzuführen, benötigen wir nun jede Kombination von Keyword SERP gepaart mit anderen Paaren:

Anzeige

Weiter unten lesen

# align serps
def serps_align(k, df):
    prime_df = df.loc[df.keyword == k]
    prime_df = prime_df.rename(columns = "serp_string" : "serp_string_a", 'keyword': 'keyword_a')
    comp_df = df.loc[df.keyword != k].reset_index(drop=True)
    prime_df = prime_df.loc[prime_df.index.repeat(len(comp_df.index))].reset_index(drop=True)
    prime_df = pd.concat([prime_df, comp_df], axis=1)
    prime_df = prime_df.rename(columns = "serp_string" : "serp_string_b", 'keyword': 'keyword_b', "serp_string_a" : "serp_string", 'keyword_a': 'keyword')
    return prime_df

columns = ['keyword', 'serp_string', 'keyword_b', 'serp_string_b']
matched_serps = pd.DataFrame(columns=columns)
matched_serps = matched_serps.fillna(0)
queries = strung_serps.keyword.to_list()

for q in queries:
    temp_df = serps_align(q, strung_serps)
    matched_serps = matched_serps.append(temp_df)

matched_serps

Vergleichen Sie die SERP-Ähnlichkeit.

Das Obige zeigt alle Schlüsselwort-SERP-Paarkombinationen und macht es für den SERP-String-Vergleich bereit.

Es gibt keine Open-Source-Bibliothek, die Listenobjekte nach Reihenfolge vergleicht, daher wurde die Funktion unten für Sie geschrieben.

Anzeige

Weiter unten lesen

Die Funktion ‘serp_compare’ vergleicht die Überlappung von Sites und die Reihenfolge dieser Sites zwischen SERPs.

import py_stringmatching as sm
ws_tok = sm.WhitespaceTokenizer()

# Only compare the top k_urls results 
def serps_similarity(serps_str1, serps_str2, k=15):
    denom = k+1
    norm = sum([2*(1/i - 1.0/(denom)) for i in range(1, denom)])

    ws_tok = sm.WhitespaceTokenizer()

    serps_1 = ws_tok.tokenize(serps_str1)[:k]
    serps_2 = ws_tok.tokenize(serps_str2)[:k]

    match = lambda a, b: [b.index(x)+1 if x in b else None for x in a]

    pos_intersections = [(i+1,j) for i,j in enumerate(match(serps_1, serps_2)) if j is not None] 
    pos_in1_not_in2 = [i+1 for i,j in enumerate(match(serps_1, serps_2)) if j is None]
    pos_in2_not_in1 = [i+1 for i,j in enumerate(match(serps_2, serps_1)) if j is None]
    a_sum = sum([abs(1/i -1/j) for i,j in pos_intersections])
    b_sum = sum([abs(1/i -1/denom) for i in pos_in1_not_in2])
    c_sum = sum([abs(1/i -1/denom) for i in pos_in2_not_in1])

    intent_prime = a_sum + b_sum + c_sum
    intent_dist = 1 - (intent_prime/norm)
    return intent_dist
# Apply the function
matched_serps['si_simi'] = matched_serps.apply(lambda x: serps_similarity(x.serp_string, x.serp_string_b), axis=1)
serps_compared = matched_serps[['keyword', 'keyword_b', 'si_simi']]
serps_compared

Überlappung von Sites und die Reihenfolge dieser Sites zwischen SERPs.

Nachdem die Vergleiche nun ausgeführt wurden, können wir mit dem Clustering von Schlüsselwörtern beginnen.

Anzeige

Weiter unten lesen

Wir behandeln alle Keywords, die eine gewichtete Ähnlichkeit von 40% oder mehr aufweisen.

# group keywords by search intent
simi_lim = 0.4

# join search volume
keysv_df = serps_input[['keyword', 'search_volume']].drop_duplicates()
keysv_df.head()

# append topic vols
keywords_crossed_vols = serps_compared.merge(keysv_df, on = 'keyword', how = 'left')
keywords_crossed_vols = keywords_crossed_vols.rename(columns = 'keyword': 'topic', 'keyword_b': 'keyword',
                                                                'search_volume': 'topic_volume')

# sim si_simi
keywords_crossed_vols.sort_values('topic_volume', ascending = False)


# strip NANs
keywords_filtered_nonnan = keywords_crossed_vols.dropna()
keywords_filtered_nonnan

Wir haben jetzt den potenziellen Themennamen, die SERP-Ähnlichkeit der Keywords und das Suchvolumen von jedem.
Clustering-Schlüsselwörter.

Sie werden feststellen, dass keyword und keyword_b in topic bzw. keyword umbenannt wurden.

Anzeige

Weiter unten lesen

Jetzt werden wir mit der Lamdas-Technik über die Spalten im Datenrahmen iterieren.

Die Lamdas-Technik ist eine effiziente Methode, um Zeilen in einem Pandas-Datenrahmen zu durchlaufen, da sie Zeilen im Gegensatz zur Funktion .iterrows() in eine Liste umwandelt.

Hier geht:

queries_in_df = list(set(keywords_filtered_nonnan.topic.to_list()))
topic_groups_numbered = 
topics_added = []

def find_topics(si, keyw, topc):
    i = 0
    if (si >= simi_lim) and (not keyw in topics_added) and (not topc in topics_added): 
        i += 1     
        topics_added.append(keyw)
        topics_added.append(topc)
        topic_groups_numbered[i] = [keyw, topc]          
    elif si >= simi_lim and (keyw in topics_added) and (not topc in topics_added):  
        j = [key for key, value in topic_groups_numbered.items() if keyw in value]
        topics_added.append(topc)
        topic_groups_numbered[j[0]].append(topc)

    elif si >= simi_lim and (not keyw in topics_added) and (topc in topics_added):
        j = [key for key, value in topic_groups_numbered.items() if topc in value]        
        topics_added.append(keyw)
        topic_groups_numbered[j[0]].append(keyw) 

def apply_impl_ft(df):
  return df.apply(
      lambda row:
        find_topics(row.si_simi, row.keyword, row.topic), axis=1)

apply_impl_ft(keywords_filtered_nonnan)

topic_groups_numbered = k:list(set(v)) for k, v in topic_groups_numbered.items()

topic_groups_numbered

Unten sehen Sie ein Wörterbuch mit allen Schlüsselwörtern, die nach Suchabsicht in nummerierte Gruppen gruppiert sind:

1: ['fixed rate isa',
  'isa rates',
  'isa interest rates',
  'best isa rates',
  'cash isa',
  'cash isa rates'],
 2: ['child savings account', 'kids savings account'],
 3: ['savings account',
  'savings account interest rate',
  'savings rates',
  'fixed rate savings',
  'easy access savings',
  'fixed rate bonds',
  'online savings account',
  'easy access savings account',
  'savings accounts uk'],
 4: ['isa account', 'isa', 'isa savings']

Lassen Sie uns das in einen Datenrahmen stecken:

topic_groups_lst = []

for k, l in topic_groups_numbered.items():
    for v in l:
        topic_groups_lst.append([k, v])

topic_groups_dictdf = pd.DataFrame(topic_groups_lst, columns=['topic_group_no', 'keyword'])
                                
topic_groups_dictdf

Datenrahmen der Themengruppe.

Die obigen Suchabsichtsgruppen zeigen eine gute Annäherung der darin enthaltenen Schlüsselwörter, was wahrscheinlich ein SEO-Experte erreichen würde.

Anzeige

Weiter unten lesen

Obwohl wir nur einen kleinen Satz von Schlüsselwörtern verwendet haben, kann die Methode offensichtlich auf Tausende (wenn nicht mehr) skaliert werden.

Aktivieren der Ausgänge, um Ihre Suche zu verbessern

Natürlich könnte das oben Gesagte weitergeführt werden, indem neuronale Netze verwendet werden, die den Rangfolgeinhalt für eine genauere Cluster- und Clustergruppenbenennung verarbeiten, wie es einige der kommerziellen Produkte bereits tun.

Mit dieser Ausgabe können Sie vorerst:

  • Integrieren Sie dies in Ihre eigenen SEO-Dashboard-Systeme, um Ihre Trends und SEO-Berichte aussagekräftiger zu gestalten.
  • Erstellen Sie besser bezahlte Suchkampagnen, indem Sie Ihre Google Ads-Konten nach Suchabsicht strukturieren, um einen höheren Qualitätsfaktor zu erzielen.
  • Führen Sie redundante E-Commerce-Such-URLs mit Facetten zusammen.
  • Strukturieren Sie die Taxonomie einer Shopping-Site nach der Suchabsicht anstelle eines typischen Produktkatalogs.

Anzeige

Weiter unten lesen

Ich bin sicher, es gibt noch mehr Anwendungen, die ich nicht erwähnt habe – kommentieren Sie gerne alle wichtigen Anwendungen, die ich noch nicht erwähnt habe.

Auf jeden Fall ist Ihre SEO-Keyword-Recherche jetzt noch ein bisschen skalierbarer, genauer und schneller!


2021 SEJ-Weihnachts-Countdown:

Ausgewähltes Bild: Astibuag/Shutterstock.com

Anzeige

Weiter unten lesen


source site

Leave a Reply