Pregunta

Los temas de tendencias de Twitter a menudo consisten en más de una palabra. Pero para los términos compuestos, a menudo hay diferentes maneras de deletrear, por ejemplo:

" El príncipe mestizo " / " El príncipe mestizo "

Para encontrar todas las actualizaciones que mencionan un tema de tendencias, necesita todas las formas de ortografía. Twitter hace esto:

 Administrador de temas de tendencias de Twitter

Tienes el nombre del tema a la izquierda y las diferentes formas de deletrear a la derecha. ¿Crees que esto se hace de forma manual o automática? ¿Es posible hacer esto automáticamente? En caso afirmativo: ¿cómo?

Espero que me puedas ayudar. Gracias de antemano!

¿Fue útil?

Solución 2

Intentaré responder mi propia pregunta basada en el comentario de Broken Link (gracias por esto):


Ha extraído frases de 1 a 3 palabras de su base de datos de documentos. Entre estas frases extraídas se encuentran las siguientes frases:

  • El príncipe mestizo
  • Príncipe Mestizo
  • Príncipe sangre media

Para cada frase, elimina todos los caracteres especiales y espacios en blanco y hace que la cadena esté en minúsculas:

$ frase = 'El príncipe mestizo'; $ frase = preg_replace ('/ [^ a-z] / i', '', $ frase); $ frase = strtolower ($ frase); // el resultado es " halfbloodprince "

Cuando hayas hecho esto, las 3 frases (ver arriba) tienen una ortografía en común:

  • El príncipe mestizo = > halfbloodprince
  • Príncipe mestizo = > halfbloodprince
  • Halfblood Prince = > halfbloodprince

Así que " halfbloodprince " es la frase padre. Usted inserta ambos en su base de datos, la frase normal y la frase principal.

Para mostrar un " Administración de temas de tendencias " al igual que Twitter, haces lo siguiente:

// first select the top 10 parent phrases
$sql1 = "SELECT parentPhrase, COUNT(*) as cnt FROM phrases GROUP BY parentPhrase ORDER BY cnt DESC LIMIT 0, 10";
$sql2 = mysql_query($sql1);
while ($sql3 = mysql_fetch_assoc($sql2)) {
    $parentPhrase = $sql3['parentPhrase'];
    $childPhrases = array(); // set up an array for the child phrases
    $fifthPart = round($sql3['cnt']*0.2);
    // now select all child phrases which make 20% of the parent phrase or more
    $sql4 = "SELECT phrase FROM phrases WHERE parentPhrase = '".$sql3['parentPhrase']."' GROUP BY phrase HAVING COUNT(*) >= ".$fifthPart;
    $sql5 = mysql_query($sql4);
    while ($sql6 = mysql_fetch_assoc($sql5)) {
        $childPhrases[] = $sql3['phrase'];
    }
    // now you have the parent phrase which is on the left side of the arrow in $parentPhrase
    // and all child phrases which are on the right side of the arrow in $childPhrases
}

¿Es esto lo que pensaste, Broken Link? ¿Funcionaría esto?

Otros consejos

Lo que básicamente quieres es encontrar la similitud entre dos cuerdas .

Creo que el algoritmo Soundex es lo que estás buscando. Se puede utilizar para comparar cadenas en función de cómo suenan. O como lo describe la wiki:

  

Soundex es un algoritmo fonético para indexar nombres por sonido, como se pronuncia en inglés. El objetivo es que los homófonos se codifiquen en la misma representación para que puedan coincidir a pesar de las pequeñas diferencias en la ortografía.

Y:

  

Usando este algoritmo [EDIT: es decir, " calificación " palabras por una letra y tres dígitos], ambos " Robert " y " Rupert " devuelve la misma cadena " R163 " mientras que " Rubin " Los rendimientos " R150 " ;. " Ashcraft " cede " A261 " ;.

También hay la distancia Levenshtein .

Buena suerte.

Hay muchas maneras de hacer esto. Un artículo sencillo sobre el estilo de Google " ¿quiso decir " La verificación es una buena lectura para obtener ideas sobre cómo lograr esto. escrito por Peter Norvig, director de investigación de google.

http://norvig.com/spell-correct.html

" anderstornvig " mencionó la distancia Levenshtein / edit, que es una gran idea pero no es del todo adecuada porque ciertas permutaciones son más significativas que otras. El problema parece ser que estamos usando una gran cantidad de conocimiento específico del dominio cuando determinamos qué diferencias son " significativas " y que son " insignificantes. " Por ejemplo, sabemos que el guión en " Half-Blood Prince " es muy importante, pero el número en " Firefox 3 " es muy importante.

Por este motivo, podría considerar personalizar una métrica simple como Levenshtein. Agregue parámetros que le permitan personalizar qué tipos de diferencias son importantes y qué tipos no son importantes.

En particular, Levenshtein cuenta el número de " ediciones " (es decir, inserciones, eliminaciones y sustituciones) necesarias para convertir una cadena en otra. Efectivamente, pesa cada edición de la misma. Podrías escribir una implementación que ponderara algunas ediciones de manera diferente. Por ejemplo, cambiando un " - " a un " " Debe tener un peso muy bajo (lo que indica poca importancia). Cambiando un " 3 " a " 2 " ;, cuando el número está solo, debe tener un peso muy alto (lo que indica una gran importancia).

Al parametrizar el cálculo, creas una vía para mejorar continuamente tu algoritmo. Cree una configuración inicial y ejecútela en algunos datos de prueba. Busque lugares donde la métrica es débil, donde combina dos términos que cree que deberían estar separados, por ejemplo, y modifique la parametrización hasta que esté satisfecho.

De esta manera, puede entrenar su algoritmo utilizando su conocimiento específico de dominio.

Lo más probable es que tengan algunos sistemas automáticos que sugieran posibles candidatos para la combinación, y luego un humano toma la decisión definitiva de combinarlos. Puede haber algunos que se combinan automáticamente.

  • Tu sugerencia de eliminar espacios y otros signos de puntuación es buena. Lo más probable es que combinen cosas que solo difieren en la puntuación o el espacio en blanco solo de forma automática.
  • Plural contra singular: buscar estas diferencias sería fácil de automatizar y produciría posibles candidatos para la combinación.
  • Errores ortográficos comunes: hay bases de datos de errores ortográficos comunes. Incluso pueden confiar en la API de Google para las sugerencias de ortografía (creo que lo exponen).
  • Soundex (o similar) es una buena opción para encontrar errores de ortografía, pero Primero debe pasar por los dos filtros anteriores (eliminar espacios, puntuación y plurales) y, luego, lo más probable es que necesite un ser humano para hacer la llamada si son iguales. Pero si pudiera presentar una representación gráfica que muestre la agrupación con el mismo soundex o similar, entonces realmente haría esa parte fácil. Podría enviar automáticamente una notificación cuando un clúster comience a aparecer y crear tendencias (de todos modos, solo se preocupan por los temas de tendencias, por lo que si incluso un clúster combinado no tiene tendencias, pueden esperar para examinarlo).

Donde realmente necesitas que un humano intervenga es cuando hay apodos comunes. Como Michael Jackson, MJ, Michael, etc. O MacDonalds, McD, Micky-D's, etc. Y luego, con la técnica, tiene Visual Studio, VS2008, VS, etc. o StackOverflow, SO, etc. Luego, C #, C-Sharp, C # .NET son todos iguales, pero C y C ++ son diferentes.

Por lo tanto, tendría que ser una combinación. Puede basarse en una base de datos de variaciones y combinaciones conocidas basadas en análisis anteriores u otras fuentes, pero un editor mantendría esa base de datos con regularidad.

Suponiendo que los temas de tendencia se generan computacionalmente, será difícil adivinar el algoritmo exacto que lo hace en Twitter. Lo más probable es que sea altamente confidencial y también patentado (por más aterrador que pueda parecer a los algoritmos de patentes).

Me parece razonable creer que usarían algún tipo de algoritmo de lenguaje natural. Dependiendo del caso, a menudo son muy pesados ??de realizar computacionalmente y solo harán lo que usted quiera hasta cierto punto.

Una lectura obvia útil sobre el tema es de wiki:

Buena suerte.

Recuerdo que cuando MJ falleció, Twitter regresó manualmente y corrigió los temas para señalar los tweets de su muerte. Sería mucho pedirle a una computadora en estos días que haga algo como esto de forma automática, aunque se puede hacer sin apretar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top