Com automatitzar l’agrupació de paraules clau de SEO per intenció de cerca amb Python


Nota de l’editor: A mesura que s’acaba el 2021, estem celebrant amb un compte enrere dels 12 dies de Nadal dels articles d’experts més populars i útils del Search Engine Journal d’aquest any.

Aquesta col·lecció va ser seleccionada pel nostre equip editorial en funció del rendiment, la utilitat, la qualitat i el valor creat per a cada article, els nostres lectors.

Cada dia fins al 24 de desembre, tornarem a publicar una de les millors columnes de l’any, començant pel número 12 i fent el compte enrere fins al número 1. Avui és el número 11, publicat originalment el 28 de juliol de 2021.

Andreas Voniatis va fer un treball fantàstic explicant com crear grups de paraules clau per intenció de cerca amb Python. Les imatges i les captures de pantalla fan que sigui fàcil de seguir pas a pas, de manera que fins i tot l’usuari de Python més principiant pot seguir. Molt bé, Andreas!

Anunci

Continueu llegint a continuació

Gràcies per contribuir a Search Engine Journal i compartir la vostra saviesa amb els lectors.

Gaudiu tots!


Hi ha molt a saber sobre la intenció de cerca, de l’ús aprenentatge profund per inferir la intenció de cerca classificant el text i desglossar els títols SERP mitjançant el processament del llenguatge natural (NLP) tècniques, a agrupació basada en la rellevància semàntica amb els beneficis explicats.

No només coneixem els avantatges de desxifrar la intenció de cerca, sinó que també tenim diverses tècniques a la nostra disposició per a l’escala i l’automatització.

Però sovint, això implica construir la teva pròpia IA. Què passa si no tens temps ni coneixements per a això?

Anunci

Continueu llegint a continuació

En aquesta columna, aprendràs un procés pas a pas per automatitzar l’agrupació de paraules clau per intenció de cerca amb Python.

Les SERP contenen estadístiques per a la intenció de cerca

Alguns mètodes requereixen que obtingueu tota la còpia dels títols del contingut de la classificació per a una paraula clau determinada i, a continuació, l’introduïu en un model de xarxa neuronal (que després haureu de crear i provar), o potser utilitzeu PNL per agrupar paraules clau. .

Hi ha un altre mètode que us permet utilitzar la pròpia IA de Google per fer la feina per vosaltres, sense haver de raspar tot el contingut de SERP i crear un model d’IA.

Suposem que Google classifica els URL dels llocs segons la probabilitat que el contingut satisfaci la consulta de l’usuari en ordre descendent. Es dedueix que si la intenció de dues paraules clau és la mateixa, és probable que les SERP siguin similars.

Durant anys, molts professionals del SEO van comparar els resultats de SERP paraules clau per inferir la intenció de cerca compartida (o compartida) per mantenir-se al capdavant de les actualitzacions bàsiques, de manera que això no és cap novetat.

El valor afegit aquí és l’automatització i l’escala d’aquesta comparació, que ofereix tant velocitat com una major precisió.

Com agrupar paraules clau per intenció de cerca a escala mitjançant Python (amb codi)

Comenceu amb els resultats de les SERP en una descàrrega CSV.

Anunci

Continueu llegint a continuació

1. Importeu la llista al vostre quadern Python.

import pandas as pd
import numpy as np

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

A continuació es mostra el fitxer SERPs ara importat a un marc de dades de Pandas.

Fitxer SERP importat a un marc de dades Pandas.

2. Filtra les dades de la pàgina 1

Volem comparar els resultats de la pàgina 1 de cada SERP entre paraules clau.

Anunci

Continueu llegint a continuació

Dividirem el marc de dades en marcs de dades de mini paraules clau per executar la funció de filtrat abans de recombinar-lo en un únic marc de dades, perquè volem filtrar a nivell de paraula clau:

# 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. Converteix URL de classificació en una cadena

Com que hi ha més URL de resultats SERP que paraules clau, hem de comprimir aquests URL en una sola línia per representar la SERP de la paraula clau.

Així és com:

# 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

A continuació es mostra la SERP comprimida en una sola línia per a cada paraula clau.
SERP comprimit en una sola línia per a cada paraula clau.

4. Compara la semblança de SERP

Per realitzar la comparació, ara necessitem totes les combinacions de paraules clau SERP emparellades amb altres parells:

Anunci

Continueu llegint a continuació

# 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

Compareu la semblança de SERP.

L’anterior mostra totes les combinacions de parelles SERP de paraules clau, de manera que es prepara per a la comparació de cadenes SERP.

No hi ha cap biblioteca de codi obert que compare els objectes de llista per ordre, de manera que la funció s’ha escrit a continuació.

Anunci

Continueu llegint a continuació

La funció ‘serp_compare’ compara la superposició de llocs i l’ordre d’aquests llocs entre SERP.

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

Superposició de llocs i ordre d'aquests llocs entre SERP.

Ara que s’han executat les comparacions, podem començar a agrupar les paraules clau.

Anunci

Continueu llegint a continuació

Tractarem les paraules clau que tinguin una similitud ponderada del 40% o més.

# 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

Ara tenim el nom del tema potencial, la similitud de les paraules clau SERP i els volums de cerca de cadascun.
Agrupació de paraules clau.

Tingueu en compte que la paraula clau i la paraula clau_b s’han canviat de nom a tema i paraula clau, respectivament.

Anunci

Continueu llegint a continuació

Ara repetirem les columnes del marc de dades mitjançant la tècnica lamdas.

La tècnica lamdas és una manera eficient d’iterar sobre files en un marc de dades de Pandas perquè converteix les files en una llista en lloc de la funció .iterrows().

Aquí va:

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

A continuació es mostra un diccionari que conté totes les paraules clau agrupades per intenció de cerca en grups numerats:

{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']}

Fixem-ho en un marc de dades:

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

Marc de dades del grup de temes.

Els grups d’intencions de cerca anteriors mostren una bona aproximació de les paraules clau dins d’ells, cosa que probablement aconseguiria un expert en SEO.

Anunci

Continueu llegint a continuació

Tot i que només hem utilitzat un petit conjunt de paraules clau, el mètode òbviament es pot escalar a milers (si no més).

Activació de les sortides per millorar la vostra cerca

Per descomptat, l’anterior es podria fer més enllà mitjançant xarxes neuronals que processen el contingut de la classificació per a clústers i denominacions de grups de clústers més precises, com ja ho fan alguns dels productes comercials que hi ha.

De moment, amb aquesta sortida podeu:

  • Incorporeu-ho als vostres propis sistemes de taulers de SEO per crear les vostres tendències i Informes de SEO més significatiu.
  • Construeix millor campanyes de cerca de pagament estructurant els vostres comptes de Google Ads segons la intenció de cerca per obtenir un nivell de qualitat més alt.
  • Combina URL de cerca de comerç electrònic amb facetes redundants.
  • Estructureu la taxonomia d’un lloc de compres segons la intenció de cerca en lloc d’un catàleg de productes típic.

Anunci

Continueu llegint a continuació

Estic segur que hi ha més aplicacions que no he esmentat; no dubteu a comentar-ne les importants que encara no he esmentat.

En qualsevol cas, la vostra recerca de paraules clau de SEO acaba de ser una mica més escalable, precisa i ràpida!


Compte enrere de Nadal SEJ 2021:

Imatge destacada: Astibuag/Shutterstock.com

Anunci

Continueu llegint a continuació





Source link

Com automatitzar l’agrupació de paraules clau de SEO per intenció de cerca amb Python