Buscar en MySQL con REGEX y detectar cuentas... ¿falsas?

Escrito el , visto 2769 veces Ver usuariopor



No tenía idea de que se podía así groseramente en un query de la base de datos buscar utilizando expresiones regulares pero increíblemente funciona muy bien.

La cuestión surgió así: empecé a notar en mi aplicación de detección de actividad política que muchos usuarios de Twitter que podrían fácilmente asociarse a un partido político utilizaban para sus nombres el esquema Nombre+número. El número era bastante amplio y parecía el DNI o similar.

¿Bots? ¿Truchos? ¿Militantes? Un poco y un poco, mi impresión siempre fue que eran militantes que ponían el DNI en el usuario para ser medidos por alguien y luego "percibir" algún tipo de beneficio. El número era para confirmar quién era o algo así, su propio DNI, un teléfono, un ID único, no lo se. No pude encontrar correlación entre el nombre y el DNI en la muestra que usé pero eso no significa mucho.

Lo cierto es que sí había una correlación entre cuentas truchas o "semi truchas" y este patrón utilizado para el nombre. Una simple búsqueda con REGEX me sirvió:

SELECT screen_name, name , location, description , statuses_count , favourites_count , followers_count , friends_count
FROM user WHERE screen_name REGEXP '^[a-z]+.[0-9]+$'
AND (es09 = 100 or es10 = 100)


Donde screen_name es el nombre con el que uno aparece en Twitter, conservo eso en la base de datos tal cual, es09 son los macristas, es10 los kirchneristas, como para que la muestra me tire datos amplios, y lo gracioso es que me dio la misma proporción de usuarios partidarios de siempre, 3:1, cada tres kirchneristas un macrista.

Si se quiere filtrar más a la estructura y que no entren con un sólo numerito usé esto, que no es prolijo porque de expresiones regulares no se un cuerno:

SELECT screen_name, name , location, description , statuses_count , favourites_count , followers_count , friends_count
FROM user WHERE screen_name REGEXP '^[a-z]+.[0-9][0-9][0-9][0-9][0-9][0-9][0-9]+$'
AND (es09 = 100 or es10 = 100)


No voy a juzgar a todo aquel que utiliza un nombre de usuario del tipo pepe20202011 como si fuere un militante ciego o una cuenta trucha, pero hay una linda tendencia fácil de encontrar y tengo unos 20.000 usuarios ya clasificados utilizándola. Con ya clasificados me refiero a que ya los involucré en campañas por algún partido político.

Si me preguntan cual partido es el que más cuentas tiene "militando" es esa misma relación 3:1 que mencioné. ¿Son todas estas cuentas falsas? No, desde ya que no, hay de todo pero me llama mucho la atención que usualmente tienen participación política. Como si fuese que lo usan para identificarse de alguna manera y no es pepe_22 porque pepe estaba lleno de gente.

Tampoco se si es el teléfono, podría ser, medio boludo pero todo es posible :D ¿Las crea así una aplicación? Tipo al crear nuevo usuario desde la app? Pero de paso me sirvió para aprender algo nuevo en MySQL Guiño


Comentarios

  1. ¿De qué universo hablamos?
    Evidentemente, para vos es suficiente esta muestra, pero es una muestra suficientemente representativa como para extenderla a la totalidad de ese universo

    Citar »
  2. Alberto carrera dijo:
    ¿De qué universo hablamos?
    Evidentemente, para vos es suficiente esta muestra, pero es una muestra suficientemente representativa como para extenderla a la totalidad de ese universo


    Tengo actualmente capturada data de unos 80.000 usuarios con militancia comprobada para al menos tres grupos representativos grandes, Oficialismo (cambiemos y aliados), Kirchnerismo (y varios subgrupos) y "Otros" donde usualmente colecciono a la izquierda y partidos menores. Entre los dos primeros tenés el 90% de la participación activa.

    El kirnerismo tiene unos 45k de usuarios activos, el Pro unos 20k, con eso tenés suficiente para obtener muestra de cada acción que hacen, salta al toque con el sistema que armé porque va capturando en vivo todo hashtag o keyword donde se cuelgan estos y así colecciona al resto. Es interesante ver los partrones de cómo actúan.

    Ahora bien, lo interesante es que esta metodología de nombre + número es utilizada por ambos, ya sea porque son cuentas reales o fake, y si son fake ¿Será que tienen el mismo proveedor ambos? (dato: si, comparten proveedores, pero eso lo se por fuente directa :P)

    Citar »
  3. Tampoco soy capo con las expresiones regulares, pero esto [0-9][0-9][0-9][0-9][0-9][0-9] ¿no equivale a esto [0-9]*6?

    Respecto a qué son esos números, DNIs y teléfonos no son.

    Lo que no entiendo como es que hacés es ¿Hacés scraping para capturar usuarios con cierta actividad?
    No entiendo como hacés para enterarte de algún usuario bot ¿Vas saltando de seguidor en seguidor hasta que caés en cuentas sospechosas o pusiste los hashtag y a lo largo del tiempo vas capturando usuarios?
    ¿Te sirvió el Selenium?

    Citar »
  4. ^[a-z]+.[0-9][0-9][0-9][0-9][0-9][0-9][0-9]+$

    el ´+´ significa ´1 o mas´ asi que agregado al ultimo[0-9] te manda la cantidad de digitos aceptados al infinito, si se quiere solo 6 digitos seria:

    ^[a-z]+.[0-9]{6}$

    Basandome en la captura de pantalla y considerando 6 digitos como el minimo, y que ademas ha de haber algun maximo supuestamente razonable de letras (entre 2 y 10 per que me piace) puede ser:

    ^[a-z]{2,10}[0-9]{6,8}+$

    Las llaves indican rango, en el primer caso entre 2 y 10, para los digitos entre 6 y 8, si no se quiere minimo es {,8}, si no se quiere maximo {6,}

    Hay algunas minimas variaciones dependiendo de si se hace en php, mysql o (dios no lo quiera) perl.

    Citar »
  5. Jorge me ganó de mano.

    Lo que sí aporto es que en la regex original hay un "." después del "+" Diría que está de más, dado que el punto dentro de una regex significa "cualquier carácter"

    Mi propuesta más sencilla sería REGEXP ´^[a-z]+[0-9]+$´ : al menos una letra y al menos un número. Los corchetes definen una "clase de caracteres"

    Si querés controlar las cantidades podés definir cotas mínimas y máximas para cada clase de caracteres, como indica jorge, utilizando las llaves REGEXP ´^[a-z]{2,10}+[0-9]{1,8}$´

    Comentario editado el 23/07/2018 - 17:24:54

    Citar »
  6. mecacho me deje un + de +
    en vez de ^[a-z]{2,10}[0-9]{6,8}+$
    va ^[a-z]{2,10}[0-9]{6,8}$

    Citar »
  7. jorge dijo:
    ^[a-z]+.[0-9][0-9][0-9][0-9][0-9][0-9][0-9]+$

    el ´+´ significa ´1 o mas´ asi que agregado al ultimo[0-9] te manda la cantidad de digitos aceptados al infinito, si se quiere solo 6 digitos seria:

    ^[a-z]+.[0-9]{6}$

    Basandome en la captura de pantalla y considerando 6 digitos como el minimo, y que ademas ha de haber algun maximo supuestamente razonable de letras (entre 2 y 10 per que me piace) puede ser:

    ^[a-z]{2,10}[0-9]{6,8}+$

    Las llaves indican rango, en el primer caso entre 2 y 10, para los digitos entre 6 y 8, si no se quiere minimo es {,8}, si no se quiere maximo {6,}

    Hay algunas minimas variaciones dependiendo de si se hace en php, mysql o (dios no lo quiera) perl.


    gracias, algo así necesitaba Guiño

    Andrezgz dijo:
    Jorge me ganó de mano.

    Lo que sí aporto es que en la regex original hay un "." después del "+" Diría que está de más, dado que el punto dentro de una regex significa "cualquier carácter"

    Mi propuesta más sencilla sería REGEXP ´^[a-z]+[0-9]+$´ : al menos una letra y al menos un número. Los corchetes definen una "clase de caracteres"

    Si querés controlar las cantidades podés definir cotas mínimas y máximas para cada clase de caracteres, como indica jorge, utilizando las llaves REGEXP ´^[a-z]{2,10}+[0-9]{1,8}$´


    good, simplificando...


    Lelale dijo:

    Lo que no entiendo como es que hacés es ¿Hacés scraping para capturar usuarios con cierta actividad?
    No entiendo como hacés para enterarte de algún usuario bot ¿Vas saltando de seguidor en seguidor hasta que caés en cuentas sospechosas o pusiste los hashtag y a lo largo del tiempo vas capturando usuarios?
    ¿Te sirvió el Selenium?


    A ver, identificar si es o no es Bot es irrelevante hoy en día pero es fácil encontrar las cuentas fantasmas que hacen 2000 RTs y como mucho un sólo tuit perdido original. Esas cuentas son RE truchas y varias veces las vi con esta combinación de usuario pero no es excluyente, hay con nombres comunes.

    cómo obtengo la info? Creo que ya posteé al respecto pero vuelvo a detallarlo:

    La API de Twitter es abierta, tomo los últimos trending topics, busco los primeros 100 tuits y si encuentro gente ya catalogada como política en una cantidad apreciable , busco más y guardo. Si no hay politiquería, descarto. Así cada 5 minutos.

    Luego, cada tanto, chequeo qué tema candente hubo, los Pro y los K son fáciles de identificar porque le dan RT a ciertas personas en particular, ahí te asegurás un acierto del 99% y tal vez algún margen de error de RT irónico, pero no en lo que sea campaña, ahí son bastante blanco y negro.

    Eso me sirve para catalogar tendencia política solamente, no calidad, para lo otro hay varios otros parámetros que uso, casi todos "artesanales", como frecuencia de posteo (un tipo dando 200RTs en un minuto en una cuenta anónima sin avatar aunque está hace dos años, fake de una) y así.

    Esa masa, unos 80k identificados, me sirven para capturar info de forma automática todos los días y crear mapas de tendencias y alertas tempranas. It works!

    Citar »
  8. Próximo paso de Fabio, crear un machine learning para identificar al bot :D

    Ahora que pienso, es realizable, por ejemplo si el mismo tweet está repetido varias veces o cosas así...

    Respecto a mis habilidades de expresiones regulares, si, doy asco, ya lo se. Confundí dos temas, una vergüenza la mía.

    Comentario editado el 23/07/2018 - 18:27:35

    Citar »
  9. Y cuál es el algoritmo que usás para definir a un kirchnerista? Criticar a Macri? A veces pienso que no debe ser fácil esa tarea, puede haber un jubilado facho votante de macri, pero que esté indignado con el recorte de jubilación que tuvo, entonces lo criticó varias veces. Lo detectás como k? O un tipo que critica a los k por haber robado tal cosa, y ser de la izquierda ponele. Si bien debe haber casos definidos, creo que muchos no debe ser fácil. No?

    Citar »
  10. gonzametal dijo:
    Y cuál es el algoritmo que usás para definir a un kirchnerista? Criticar a Macri? A veces pienso que no debe ser fácil esa tarea, puede haber un jubilado facho votante de macri, pero que esté indignado con el recorte de jubilación que tuvo, entonces lo criticó varias veces. Lo detectás como k? O un tipo que critica a los k por haber robado tal cosa, y ser de la izquierda ponele. Si bien debe haber casos definidos, creo que muchos no debe ser fácil. No?
    Capo , eso lo explicó otras veces.

    Citar »
  11. gonzametal dijo:
    Y cuál es el algoritmo que usás para definir a un kirchnerista? Criticar a Macri? A veces pienso que no debe ser fácil esa tarea, puede haber un jubilado facho votante de macri, pero que esté indignado con el recorte de jubilación que tuvo, entonces lo criticó varias veces. Lo detectás como k? O un tipo que critica a los k por haber robado tal cosa, y ser de la izquierda ponele. Si bien debe haber casos definidos, creo que muchos no debe ser fácil. No?

    ampliá la captura de pantalla que puse, vas a poder identificar un par sin problemas :D

    si, como dice timoss, ya lo expliqué varias veces, inclusive una persona que hoy es K mañana podría ser Massista o Cambiemita, en teoría, eso no significa nada en el global, lo importante es medir tendencias, no un absoluto (nadie creo que lo sea)

    y no hace falta criticar a X para ser partidario de Z, sencillamente si toda tu publicación va alrededor de un tema y una tendencia y sólo republicás lo que dicen aquellos con los que tenés afinidad es fácil inferir una tendencia, ejemplo: un tipo que sólo le da RT a lo que diga Macri o Vidal, es fácil inferir que tiene una tendencia a favor de estos políticos, a veces hasta es demasiado obvio, y si no se pude definir, se deja como indefinido, no afecta al total de la estadística

    Citar »
  12. Como quedo la estadistica despues del barrido de twiter?

    Citar »

Deje su comentario:

(comentarios ofensivos o que no hagan al enriquecimiento del post serán borrados/editados por el administrador sin previo aviso)

Security Image

Negrita Cursiva Imagen Enlace

Guardar los datos: Si / No