jeudi 9 juin 2016

Récupérer des profils Twitter en masse

Introduction

Pour un projet, j'ai besoin de données de issues de Twitter. J'ai donc monté un serveur, ainsi qu'une chaîne d'acquisition. Dans  cet article Je vais décrire: l'objectif, l'architecture, les technologies utilisées, les résultats,  mais aussi les emm*rdes ;) , et les solutions...

UPDATES :
  1. j'ai mis à disposition une petite fraction de ces données (40k profils) sur le site Kaggle : https://www.kaggle.com/hwassner/TwitterFriends
  2.  J'ai mis en ligne un article décrivant l'analyse que je fais sur ces données.

L'objectif

 Je veux faire de la classification non-supervisée d'utilisateurs de Twitter. C'est à dire que je veux utiliser un algorithme pour classer des utilisateurs Twitter sans donner d'objectif précis de classification. C'est l'algorithme lui-même qui va décider du classement en fonction des données dont il dispose.  Je discuterai de l'interprétation des résultats de cet algorithme dans un autre article.

Les données

Je cherche a acquérir une base de données de comptes Twitter. Je veux que mon classement se base sur les abonnements des utilisateurs de Twitter. De plus j'aimerai avoir surtout des données venant de gens qui tweetent.
(Sur Twitter : 90% des messages sont crée par 10% des utilisateur).

Le protocole

J'ai crée un programme en Java qui exploite l'API publique de Twitter. Ce programme va aller chercher les "Trending Topics" (TT), toutes les 5 minutes. Les TT sont des sujets qui sont les plus discutés sur Twitter pour une région données au niveau d'une ville ou d'un pays (j'utilise la zone France), il s'agit simplement d'une liste de mots.

Grâce à cette liste de mots, je peux alors ouvrir un flux (stream) de tweets filtrés par les sujets en questions. Je dispose donc d'un échantillonnage de tweets en français.

À partir des ces tweets, je collecte l'identifiant des émetteurs de ces tweets (ou re-tweets), et je collecte alors leur liste d'abonnement. Je stocke le tout en base de données.

Cela peut se résumé comme ceci :

   Trending Topics --> stream tweets --> user ID --> liste d'abonnements

L'implémentation

Pour l'accès aux données Twitter j'utilise leur API publique, via Twitter4j (en Java)

Pour le stockage, j'utilise mongoDB.







Pour contrôler mongoDB, (ainsi qu'un serveur web qui accède à ses données) j'utilise Docker



Les Emm*rdes ... et leur solutions

  • L'API Twitter est raisonnablement généreuse pour ce qui est des tweets, mais pour ce qui est des listes de lecture de ses utilisateur c'est autre chose... Twitter limite à 15 liste d'abonnements par minute.
    C'est vraiment peu, et d'après ce que j'ai pu me renseigner auprès de revendeur de données Twitter (swift & Gnip), aucun ne donne accès à ces information.
    => J'ai donc fédèré plusieurs comptes (plus précisemment les clés d'application) pour disposer d'un débit plus confortable sur la donnée qui m'intéresse...
  • mongoDB c'est bien mais, ça bouffe toute la mémoire disponible. C'est très efficace pour la base de donné, mais du coup le serveur ne peut plus faire grand chose d'autre. Et dans mon cas mon serveur doit aussi faire la collecte de tweets et de de profiles Twitter. J'ai donc opté pour Docker pour contenir mongodb

Résultats

Les données stockées par utilisateur Twitter sont :
  • L'ID, le screenName (les nom qui commence par @...)
  • la liste des abonnements.
  • la liste des hashtag sur lequel l'utilisateur à tweeté
  • le nombre de follower
  • la photo d'avatar

 Et voici quelques chiffres le serveur tourne depuis près d'un an a enregistrer les trending topics, et surtout les gens qui tweetent sur ces sujets.

La suite ...

Vous vous en doutez probablement cette collecte de donnée n'est qu'une première étape. La suite est la création d'un algorithme profilage automatique en fonction des abonnements des utilisateurs. J'ai déjà beaucoup avancé sur le sujet mais il faut maintenant le temps d'écrire l'article qui sera bientôt publié ici ...

UPDATE : ça y est j'ai (enfin) écris un article décrivant l'analyse que je fais avec ces données.