Tipos de concordancias más restrictivas en Google Ads.
En este artículo evaluaremos los tipos de concordancias más restrictivas y haremos un análisis de las variables que hemos tenido en cuenta al estudiar los ejemplos en el artículo anterior.
En el articulo anterior evaluamos el impacto de las variables cercanas en las coincidencia exacta.
Estudiamos y resumimos;
- La nueva coincidencia exacta
- La Concordancia de frase
- El Modificador de concordancia
Tipos de concordancias más restrictivas resumen
Tipos de concordancia | Lo que está restringido para las consultas | Como las consultas pueden diferir la búsqueda |
Concordancia exacta 2018 | No hay palabras adicionales en la consulta a menos que estén estrechamente relacionadas con las palabras claves | El orden de las palabras puede ser cambiado. Los errores ortográficos de las pluralizaciones se derivan en función a las palabras con el mismo significado. |
Concordancia de frase 2018 | El orden de las palabras se conserva de forma aproximada, pero esas palabras se pueden cambiar en función de las fechas de cierre de las variantes del 2017. | Las palabras adicionales o suplementarias pueden ser anteriores o posteriores a la palabra clave, los errores ortográficos de las pluralizaciones se derivan en función a las palabras. |
Concordancia amplia modificada 2018 | Cualquier palabra con “+” solo se puede cambiar utilizando las reglas de variables cerradas de 2017. | Las palabras adicionales o suplementarias pueden estar en cualquier orden. El orden de las palabras se puede cambiar. Los errores ortográficos de las pluralizaciones se derivan en función a las palabras. |
Amplia coincidencia 2018 | Ninguna | Si pudiera ser relevante, pudiera mostrarse en el anuncio. |
Los tipos de concordancias que se consideran «más restrictivas» son la coincidencia exacta y la coincidencia de frase.
La coincidencia exacta y la coincidencia de frase difieren en la forma en que son restrictivas;
- La coincidencia exacta limita palabras adicionales en la consulta.
- La coincidencia de frase conserva el orden de las palabras clave.
Análisis de los ejemplos presentados.
Los ejemplos presentados expuestos en el artículo anterior, proceden de un ejemplo que básicamente muestra cómo se pueden relacionar las palabras claves con los términos de búsqueda.
Para ampliar el conocimiento, obtenga este informe en la interfaz de Google Ads (anteriormente Adwords).
El ejemplo utiliza medidas para la palabra clave y el término de búsqueda en una línea.
Haciendo más fácil comparar el rendimiento de la consulta con el de la palabra clave.
Agregamos en el informe la palabra clave y el tipo de concordancia.
Se agrego el tipo de concordancia de la palabra clave al informe. La palabra clave coincidió con la consulta y no con el tipo de concordancia que el anunciante especifico, en la columna de concordancia lo mostramos y se puede visualizar en la interfaz usuario de anuncios (IU).
Hay alguno casos en donde el anunciante,para responder a una búsqueda utiliza una misma palabra como «palabra clave de concordancia amplia» como » palabra clave de concordancia exacta » y como la «palabra clave»; por ejemplo la palabra «flores». Cuando esto ocurre, Google, no tiene la oportunidad de utilizar las variables cercanas y así poder generar varios tipos de coincidencias y por lo tanto no podemos analizar la capacidad que Google pueda tener .
Se adiciono una función de comparación en la secuencia de comando, que nos permite diferenciar la consulta y la palabra clave.
Para lo anterior utilizamos Levenshtein Distancia
Utilizamos el Levenshtein Distancia, permitiendo devolver la cantidad de caracteres que se deben agregar, eliminar o cambiar para convertir una cadena en otra cadena.
Un ejemplo de lo anterior, sería cuando utilizamos Levenshtein Distancia y agregamos una ‘s’ para convertir una palabra que está en singular en plural obteniendo como resultado una distancia de 1.
Otro ejemplo seria cuando se quiere cambiar la palabra clave ‘camping Yosemite’ por ‘campings Yosemite’, al hacer este cambio, obtenemos una distancia de 5 porque necesitamos cambiar tres letras y agregar dos nuevas para hacer la transformación
A través de estos valores numéricos, podemos ordenar más fácilmente los datos para ver primero las ampliaciones más grandes.
La “intención similar” del algoritmo evolucionará con el tiempo pudiendo monitorearlo .
SECUENCIA DE COMANDO PARA MEDIR EL IMPACTO DE LOS CAMBIOS
De manera gratuita, se enuncian una secuencia de comando que permiten obtener datos para medir el impacto de los cambios en sus propias cuenta;
// Informe sobre qué tan cerca se relacionan las variantes con sus palabras clave en Google Ads | |
// Script gratuito de AdWords cortesía de Optmyzr.com | |
// 12 de septiembre de 2018 | |
función main () { | |
// —————– | |
// Editar esta sección con tus preferencias | |
// —————- | |
var time = ‘LAST_30_DAYS’; | |
var reportVersion = ‘v201802’; | |
var emailAddresses = ‘example@example.com’; | |
var accountManagers = ‘example@example.com’; | |
var spreadsheetUrl = ‘new’; | |
var includeLevinsthein = 1; // establece el valor en 0 si el script se agota. al no agregar este puntaje, el script se ejecutará más rápido | |
// use 1 o ninguna de las dos configuraciones siguientes para limitar las campañas analizadas | |
var campaignNameContains = «»; // Esto no distingue entre mayúsculas y minúsculas | |
var campaignNameDoesNotInclude = «»; // Esto no distingue entre mayúsculas y minúsculas | |
// ——————- | |
// No realice ediciones después de esto a menos que sepa cómo escribir scripts | |
// ——————- | |
var map = new Array (); | |
// Obtenga identificaciones de campaña | |
var campaignsToCheck = new Array (); | |
if (campaignNameDoesNotInclude) { | |
if (campaignNameDoesNotInclude.indexOf («‘»)! = -1) | |
{ | |
var doesNotContainString = ‘»‘ + campaignNameDoesNotInclude + ‘»‘; | |
} else { | |
var doesNotContainString = «‘» + campaignNameDoesNotInclude + «‘»; | |
} | |
var campañas = AdWordsApp.campaigns () | |
.withCondition (‘Nombre DOES_NOT_CONTAIN_IGNORE_CASE’ + doesNotContainString) | |
.withCondition (‘Estado! = QUITADO’) | |
.obtener(); | |
} else if (campaignNameContains) { | |
if (campaignNameContains.indexOf («‘»)! = -1) { | |
var containsString = ‘»‘ + campaignNameContains + ‘»‘; | |
} else { | |
var containsString = «‘» + campaignNameContains + «‘»; | |
} | |
var campañas = AdWordsApp.campaigns () | |
.withCondition (‘Nombre CONTAINS_IGNORE_CASE’ + containsString) | |
.withCondition (‘Estado! = QUITADO’) | |
.obtener(); | |
} else { | |
var campañas = AdWordsApp.campaigns () | |
.withCondition (‘Estado! = QUITADO’) | |
.obtener(); | |
} | |
while (campaigns.hasNext ()) { | |
var campaign = campaigns.next (); | |
var campaignId = campaign.getId (); | |
Logger.log (campaignId); | |
campaignToCheck.push (campaignId); | |
} | |
// palabras clave | |
var query = | |
‘SELECT Id, KeywordMatchType, Criterios, Clics, Impresiones, Costo, ConversionValue, Conversiones, AveragePosition, Ctr, AverageCpc, AdGroupName, CampaignName, CampaignId, AdGroupId’ + | |
‘FROM KEYWORDS_PERFORMANCE_REPORT’ + | |
‘DONDE Impresiones> 0’ + | |
‘Y CampaignId IN’ + JSON.stringify (campaignToCheck) + «» + | |
‘DURING’ + tiempo; | |
var report = AdWordsApp.report (query, {apiVersion: reportVersion}); | |
var rows = report.rows (); | |
while (rows.hasNext ()) { | |
var row = rows.next (); | |
var adGroupId = row [‘AdGroupId’]; | |
var id = row [‘Id’]; | |
var criteria = row [‘Criteria’]; | |
//Logger.log(row[‘Criteria ‘]); | |
if (criteria.indexOf (‘+’)! = -1) { | |
var subMatchType = «BMM»; | |
} else { | |
var subMatchType = row [‘KeywordMatchType’]; | |
} | |
var clave = adGroupId + «-» + id; | |
if (! map [clave]) { | |
mapa [clave] = nuevo Objeto (); | |
map [key] .keyword = new Object (); | |
map [key] .searchTerms = new Array (); | |
mapa [clave] .keyword.criteria = fila [‘Criterios’]; | |
mapa [clave] .keyword.clicks = parseInt (fila [‘Clics’], 10); | |
map [key] .keyword.impressions = parseInt (row [‘Impressions’], 10); | |
map [key] .keyword.cost = getFloat (fila [‘Cost’]); | |
mapa [clave] .keyword.conversions = getFloat (fila [‘Conversiones’]); | |
map [key] .keyword.ctr = getFloat (row [‘Ctr’]); | |
map [key] .keyword.averagePosition = getFloat (row [‘AveragePosition’]); | |
mapa [clave] .keyword.averageCpc = getFloat (fila [‘AverageCpc’]); | |
map [key] .keyword.conversionValue = getFloat (row [‘ConversionValue’]); | |
map [key] .keyword.matchType = row [‘KeywordMatchType’]; | |
map [key] .keyword.subMatchType = subMatchType; | |
map [key] .keyword.campaignName = row [‘CampaignName’]; | |
map [key] .keyword.adGroupName = row [‘AdGroupName’]; | |
} | |
} | |
Logger.log («»); | |
// Términos de búsqueda | |
var query = | |
‘SELECT KeywordId, KeywordTextMatchingQuery, Query, QueryMatchTypeWithVariant, Clics, Impresiones, Costo, ConversionValue, Conversiones, AveragePosition, Ctr, AverageCpc, AdGroupName, CampaignName, CampaignId, AdGroupId’ + | |
‘FROM SEARCH_QUERY_PERFORMANCE_REPORT’ + | |
‘DONDE Impresiones> 0’ + | |
‘Y CampaignId IN’ + JSON.stringify (campaignToCheck) + «» + | |
‘DURING’ + tiempo; | |
var report = AdWordsApp.report (query, {apiVersion: reportVersion}); | |
var rows = report.rows (); | |
while (rows.hasNext ()) { | |
var row = rows.next (); | |
var adGroupId = row [‘AdGroupId’]; | |
var id = row [‘KeywordId’]; | |
var query = row [‘Query’]; | |
// Logger.log(query); | |
var clave = adGroupId + «-» + id; | |
if (! map [clave]) { | |
// muy probablemente una campaña de compras | |
// Logger.log («consulta no asociada con kw en campaña:» + fila [‘CampaignName’]); | |
} else { | |
if (! map [key] .searchTerms [query]) { | |
map [key] .searchTerms [query] = new Object (); | |
map [key] .searchTerms [query] .matchTypeVariant = row [‘QueryMatchTypeWithVariant’]; | |
map [key] .searchTerms [query] .clicks = parseInt (row [‘Clicks’], 10); | |
map [key] .searchTerms [query] .impressions = parseInt (row [‘Impressions’], 10); | |
map [key] .searchTerms [query] .cost = getFloat (row [‘Cost’]); | |
map [key] .searchTerms [query] .conversions = getFloat (row [‘Conversions’]); | |
map [key] .searchTerms [query] .ctr = getFloat (row [‘Ctr’]); | |
map [key] .searchTerms [query] .averagePosition = getFloat (row [‘AveragePosition’]); | |
map [key] .searchTerms [query] .averageCpc = getFloat (row [‘AverageCpc’]); | |
map [key] .searchTerms [query] .conversionValue = getFloat (row [‘ConversionValue’]); | |
map [key] .searchTerms [query] .impressions = parseInt (row [‘Impressions’], 10); | |
map [key] .searchTerms [query] .campaignName = row [‘CampaignName’]; | |
} | |
} | |
} | |
// Hoja de cálculo | |
var reportDate = new Date (); | |
var dateForFilename = reportDate.yyyymmdd (); | |
if (hoja de cálculoUrl.toLowerCase (). indexOf («nuevo»)! = -1) | |
{ | |
var spreadsheet = SpreadsheetApp.create («Keyword Analysis -» + AdWordsApp.currentAccount (). getName () + «-» + dateForFilename + «(» + time + «)»); | |
var spreadsheetUrl = spreadsheet.getUrl (); | |
} | |
var spreadsheet = SpreadsheetApp.openByUrl (spreadsheetUrl); | |
if (accountManagers && accountManagers! = «») { | |
var accountManagersArray = accountManagers.replace (/ \ s / g, «») .split («,»); | |
spreadsheet.addEditors (accountManagersArray); | |
} | |
// Hoja para informe de palabra clave | |
// obtener todas las hojas excepto primero y eliminarlas e insertar nuevas hojas cada vez para evitar el error de nombre | |
var allSheets = spreadsheet.getSheets (); | |
para (var i = 1, len = allSheets.length; i <len; i ++) { | |
spreadsheet.deleteSheet (allSheets [i]); | |
} | |
allSheets [0] .setName («Palabras clave»); | |
var kwSheet = allSheets [0]; | |
kwSheet.appendRow ([«Nombre de la campaña», «Nombre del grupo de anuncios», «Tipo de concordancia», «Tipo de concordancia secundaria», «Palabra clave», «Término de búsqueda», «Tipo de concordancia de consulta con variante», «Distancia de Levenshtein», | |
«Clics de KW», «Impresiones de KW», «Costo de KW», «CTR de KW», «CPC promedio de KW», «Conversiones de KW», «Valor de conv. KW», «Posición media de KW», | |
«Clics de consulta», «Impresiones de consulta», «Costo de consulta», «CTR de consulta», «CPC prom. De consulta», «Conversiones de consulta», «Valor de consulta de consulta», «Pos. Prom. Consulta»]); | |
kwSheet.setFrozenRows (1); | |
// Render | |
para (var clave en el mapa) { | |
// Logger.log (tecla); | |
var criteria = map [key] .keyword.criteria; | |
var matchType = map [key] .keyword.matchType; | |
var subMatchType = map [key] .keyword.subMatchType; | |
var kwClicks = map [key] .keyword.clicks; | |
var kwImpressions = map [key] .keyword.impressions; | |
var kwConversions = map [key] .keyword.conversions; | |
var kwCost = map [key] .keyword.cost; | |
var kwCtr = map [key] .keyword.ctr; | |
var kwAverageCpc = map [clave] .keyword.averageCpc; | |
var kwConversionValue = map [key] .keyword.conversionValue; | |
var kwAveragePosition = map [key] .keyword.averagePosition; | |
var campaignName = map [key] .keyword.campaignName; | |
var adGroupName = map [key] .keyword.adGroupName; | |
para (consulta var en el mapa [clave] .searchTerms) { | |
var queryClicks = map [key] .searchTerms [query] .clicks; | |
var matchTypeVariant = map [key] .searchTerms [query] .matchTypeVariant; | |
//Logger.log(criteria + «|» + query + «|» + matchType + «» + matchTypeVariant); | |
if (matchType.toLowerCase ()! = matchTypeVariant.toLowerCase ()) { | |
// var difference = getDifference (criterios, consulta); | |
// var diffLen = difference.length; | |
var rawCriteria = criteria.replace (/ \ + / g, «»); | |
if (includeLevinsthein) { | |
var diffLen = levDist (rawCriteria, consulta); | |
} else { | |
var diffLen = «»; | |
} | |
var queryClicks = map [key] .searchTerms [query] .clicks; | |
var queryImpressions = map [key] .searchTerms [query] .impressions; | |
var queryConversions = map [key] .searchTerms [query] .conversions; | |
var queryCost = map [key] .searchTerms [query] .cost; | |
var queryCtr = map [key] .searchTerms [query] .ctr; | |
var queryAverageCpc = map [key] .searchTerms [query] .averageCpc; | |
var queryConversionValue = map [key] .searchTerms [query] .conversionValue; | |
var queryAveragePosition = map [key] .searchTerms [query] .averagePosition; | |
//Logger.log(criteria + «» + matchType + «» + query + «» + matchTypeVariant + «» + kwClicks + «» + «» + diffLen); | |
kwSheet.appendRow ([campaignName, adGroupName, matchType, subMatchType, «‘» + criterios, query, matchTypeVariant, diffLen, | |
kwClicks, kwImpressions, kwCost, kwCtr, kwAverageCpc, kwConversions, kwConversionValue, kwAveragePosition, | |
queryClicks, queryImpressions, queryCost, queryCtr, queryAverageCpc, queryConversions, queryConversionValue, queryAveragePosition]); | |
} | |
} | |
} | |
// Notificar | |
Logger.log (hoja de cálculoUrl); | |
var body = «su informe está listo en:» + spreadsheetUrl; | |
MailApp.sendEmail (emailAddresses, «notifications@optmyzr.com», «Su análisis de tipo de concordancia está listo», cuerpo); | |
} | |
// funciones de fecha | |
Date.prototype.yyyymmdd = function () { | |
var yyyy = this.getFullYear (). toString (); | |
var mm = (this.getMonth () + 1) .toString (); // getMonth () está basado en cero | |
var dd = this.getDate (). toString (); | |
return yyyy + (mm [1]? mm: «0» + mm [0]) + (dd [1]? dd: «0» + dd [0]); // relleno | |
}; | |
function getFloat (entrada) { | |
if (! input || input == «» || typeof (input) === ‘undefined’) var input = «0.0»; | |
input = input.toString (); | |
var output = parseFloat (input.replace (/, / g, «»)); | |
salida de retorno; | |
} | |
// Función: levDist | |
// Autor James Westgate (https://stackoverflow.com/users/305319/james-westgate) | |
// Fuente: https://stackoverflow.com/questions/11919065/sort-an-array-by-the-levenshtein-distance-with-best-performance-in-javascript/11958496#11958496 | |
// Licencia: CC-BY-SA (https://creativecommons.org/licenses/by-sa/4.0/) | |
función levDist (s, t) { | |
var d = []; // matriz 2d | |
// Paso 1 | |
var n = s.length; | |
var m = t.length; | |
si (n == 0) devuelve m; | |
si (m == 0) devuelve n; | |
// Crea una matriz de matrices en javascript (un ciclo descendente es más rápido) | |
para (var i = n; i> = 0; i–) d [i] = []; | |
// Paso 2 | |
para (var i = n; i> = 0; i–) d [i] [0] = i; | |
para (var j = m; j> = 0; j–) d [0] [j] = j; | |
// Paso 3 | |
para (var i = 1; i <= n; i ++) { | |
var s_i = s.charAt (i – 1); | |
// Etapa 4 | |
para (var j = 1; j <= m; j ++) { | |
// Verifica el total de ld dentados hasta el momento | |
if (i == j && d [i] [j]> 4) return n; | |
var t_j = t.charAt (j – 1); | |
costo var = (s_i == t_j)? 0: 1; // Paso 5 | |
// Calcula el mínimo | |
var mi = d [i – 1] [j] + 1; | |
var b = d [i] [j – 1] + 1; | |
var c = d [i – 1] [j – 1] + costo; | |
if (b <mi) mi = b; | |
if (c <mi) mi = c; | |
d [i] [j] = mi; // Paso 6 | |
// Transposición Damerau | |
if (i> 1 && j> 1 && s_i == t.charAt (j – 2) && s.charAt (i – 2) == t_j) { | |
d [i] [j] = Math.min (d [i] [j], d [i – 2] [j – 2] + costo); | |
} | |
} | |
} | |
// Paso 7 | |
return d [n] [m]; | |
} |
Deja una respuesta