- Le blog participatif de bioinformatique francophone depuis 2012 -

#JOBIM2018 : une étude de réseau

Comme une par­tie de la com­mu­nau­té bio­in­for­ma­tique fran­çaise, et pro­ba­ble­ment du lec­to­rat de ce blog, je me suis ren­du à la 19è édi­tion des Jour­nées Ouvertes en Bio­lo­gie, Infor­ma­tique et Mathé­ma­tiques (JOBIM). Celle-ci se tenait à Mar­seille, au Palais du Pha­ro, et pour celles et ceux d'entre vous curieux·ses de connaître le conte­nu scien­ti­fique, voi­là le résu­mé des inter­ven­tions. Et pour l'ambiance, voi­là les pho­tos !

Si vous sui­vez ce blog depuis long­temps, vous n'êtes pas sans savoir qu'on aime ana­ly­ser les tweets : c'était le cas pour JOBIM2013, JOBIM/​ECCB2014, JOBIM2015… En effet, la com­mu­nau­té bio­in­for­ma­tique fran­co­phone gazouille pas mal, et il est pos­sible de récu­pé­rer auto­ma­ti­que­ment les don­nées de ce réseau social. Alors cette année on remet le cou­vert, mais de manière un peu plus détaillée, et sous forme de réseau ! Et, cerise sur le gâteau, on en fait un tuto­riel. On va ici concen­trer sur deux mots-dièse (ou hash­tag, pour les anglo­phones) : #JOBIM2018 et #dark­jo­bim (l'existence de ce mot-dièse trol­lesque est un peu sombre, mais un bioin­fo-twit­tos a une piste).

Alors, dans cet article, nous allons :

  1. télé­char­ger les tweets des mots-dièse sélec­tion­nés
  2. les syn­thé­ti­ser sous forme de trois réseaux (i. mots-dièse, ii. twit­tos et iii. mots-diè­se/t­wit­tos, un réseau qu'on dit "bipar­tite")
  3. inter­pré­ter les résul­tats !

Allez hop, c'est par­ti ! 💪

Téléchargement des tweets

Pour cette par­tie, quelques notions de Python seront néces­saires. Si vous n'êtes pas sûr·e d'avoir les bases, n'hésitez pas à fouiller par­mi les articles qui concernent ce lan­gage de pro­gram­ma­tion.

L'idée est d'utiliser l'API de Twit­ter via le paquet Twee­py. Une API, pour Appli­ca­tion Pro­gram­ming Inter­face, est comme son nom l'indique une inter­face qui nous per­met, dans ce cas pré­cis, d'accéder de manière pro­gram­ma­tique au réseau social. Avec Twee­py, on peut twee­ter, suivre des gens, faire des recherches… Tout ! Ou presque : l'API de Twit­ter, ou plu­tôt sa ver­sion gra­tuite, a quelques limi­ta­tions, comme l'impossibilité de recher­cher des tweets plus vieux que 7 jours à par­tir de la date actuelle. Mais dans notre cas c'est suf­fi­sant : j'ai lan­cé la requête à la fin de la confé­rence.

Pour uti­li­ser l'API de Twit­ter, il faut pas­ser par trois étapes : créer un compte Twit­ter, deman­der l'accès Déve­lop­peur à Twit­ter, et géné­rer des jetons d'identification. La pre­mière étape (obli­ga­toire depuis juillet 2018 seule­ment, et requé­rant d'écrire un texte de 300 carac­tères) se passe ici. Une fois votre compte vali­dé, vous pour­rez créer une appli­ca­tion, ici, et géné­rer 4 iden­ti­fiants : les clés d'API (une publique et une secrète) et les jetons d'accès (un public et un secret). Conser­vez ces 4 iden­ti­fiants, ce sont eux qui vous per­met­tront de vous connec­ter à Twit­ter via Twee­py.

Allez, après toutes ces for­ma­li­tés, met­tons un peu les mains dans le cam­bouis ! Je ne vais pas dans cet article insé­rer tout le code rédi­gé pour ce petit pro­jet, mais seule­ment les élé­ments les plus impor­tants. Pour les détails et l'implémentation, vous pou­vez jeter un œil à l'intégralité du code,  dis­po­nible en ligne sur Github.

Le pre­mier bout de code impor­tant à avoir, c'est donc la connexion à Twit­ter !

# On peut tes­ter en récu­pé­rant des tweets de notre propre time­line
public_​tweets = api.home_timeline()
for tweet in public_​tweets :
print(tweet.text)

Main­te­nant qu'on est connec­té, on va pou­voir faire des requêtes sur les tweets d'un mot-dièse par­ti­cu­lier, et les enre­gis­trer dans des dic­tion­naires. Cela nous per­met­tra de géné­rer les dif­fé­rents réseaux qu'on veut faire à par­tir d'une seule requête sur Twit­ter. Pour ceci, la méthode à suivre est rela­ti­ve­ment simple : elle fait appel à l'objet Cur­sor de Twee­py, qui per­met de récu­pé­rer les résul­tats d'une requête de manière pagi­née.

Ensuite, vu que Twit­ter ne nous laisse pas accé­der à l'intégralité de sa base de don­nées, j'ai enre­gis­tré au for­mat JSON cette requête. J'ai ain­si récu­pé­ré 669 tweets conte­nants les mots-dièse #JOBIM2018 et/​ou #dark­jo­bim, entre le 1er et le 6 juillet 2018. Le fichier JSON est acces­sible ici.

Génération des réseaux

Ça y est, on a nos don­nées brutes ! 🎉 Dans cette sec­tion, on va les trans­for­mer un peu, pour qu'on puisse les visua­li­ser sous forme de réseaux. Pour rap­pel, on va en construire trois : un réseau de mots-dièse, un réseau des twit­tos et un réseau qui asso­cie les deux. On pour­ra donc avoir deux types de nœuds : d'une part les mots-dièse et d'autre part les twit­tos, qui peuvent être les auteurs des tweets ou bien en men­tion dans les tweets.

Réseau des mots-dièse

Ce pre­mier réseau ne va donc conte­nir que des mots-dièse : ce seront les nœuds du réseau. Ils seront connec­tés par des arêtes, qui n'existeront qu'entre les mots-dièse appa­rais­sant en même temps dans au moins un tweet (notion co-occur­rence).

Pour ce faire, on va lire les tweets un par un, et à chaque fois qu'on voit plu­sieurs mots-dièse dans un même tweet, on met à jour un dic­tion­naire. S'il s'agit d'un nou­veau lien, on crée une entrée dont la clé sera le nom des deux nœuds. Sinon, on met à jour l'entrée déjà exis­tante, qui contient quelques valeurs (nombre de tweets, de ret­weets, de favo­ris…). Voi­là ce que ça donne en Python :

Vous l'aurez remar­qué : j'enregistre pour chaque asso­cia­tion entre deux mots-dièse plu­sieurs valeurs : le nombre de tweets (n), le nombre de fois que le tweet a été aimé (fav) et ret­wee­té (rt). Je pro­pose éga­le­ment un score (dis­cu­table) qui somme le tout. Tout cela va nous ser­vir lors de la visua­li­sa­tion.

On a donc notre réseau de mots-dièse, avec en prime des carac­té­ris­tiques (appe­lées "attri­buts") pour chaque arête. Pour des ques­tions de visua­li­sa­tion, on aime­rait aus­si avoir des attri­buts par nœuds, pour savoir com­bien de fois un mot-dièse a été twee­té par exemple. On fait ça comme ça :

Le code pour géné­rer les deux autres réseaux sont très simi­laires, vous pou­vez jeter un œil dans le code en ligne (fonc­tionstweets_to_mentions() et tweets_to_bipartite()).

Écriture du fichier

Nous avons à pré­sent nos jolis dic­tion­naires Python qui ras­semblent nos nœuds et nos arêtes, repré­sen­tant nos dif­fé­rents réseaux. Et main­te­nant ? Pour visua­li­ser tout ça, il faut conver­tir cette infor­ma­tion en un for­mat que votre logi­ciel favo­ri sup­porte. Dans mon cas, j'ai choi­si Gephi, notam­ment parce qu'un super article (encore un !) parle de lui sur ce blog.

Note : d'autres logi­ciels sont évi­dem­ment dis­po­nibles, je vous encou­rage à lire un article, tout aus­si génial, qui fait le tour d'horizon des outils de visua­li­sa­tion des réseaux bio­lo­giques.
De plus, le code dis­po­nible en ligne sup­porte éga­le­ment l'export au for­mat Cytos­cape.

On va uti­li­ser le for­mat GDF, qui res­semble à ça :

Une pre­mière par­tie ( nodedef ) défi­nit les nœuds ; il est pos­sible d'ajouter autant d'attributs qu'on veut. S'ensuit la par­tie défi­nis­sant les arêtes ( edgedef ), avec éga­le­ment la pos­si­bi­li­té d'ajouter des attri­buts.

Dans un pre­mier temps, on va donc lis­ter les nœuds pré­sents et leurs attri­buts, puis les arêtes :

Ayé, après ça vous devriez avoir un super fichier de réseau, lisible par Gephi ! Il ne vous reste plus qu'à l'ouvrir pour le visua­li­ser. 😎 N'oubliez pas le didac­ti­ciel Gephi sur le blog si vous êtes perdu·e.

 

Résultats et discussion

Le réseau des mots-dièse

Voi­là donc à quoi res­semble notre réseau final :

Réseau des mots-dièse de JOBIM2018
Réseau des mots-dièse de JOBIM2018. La taille des nœuds repré­sente le nombre de tweets conte­nant le mot-dièse. L'épaisseur des arêtes montre le "score" vu pré­cé­dem­ment. Fichier SVG.Fichier Gephi.

Ici la taille des nœuds repré­sente le nombre de tweets com­por­tant le mot-dièse, mais visuel­le­ment les autres métriques donnent un résul­tat très simi­laire. On voit donc deux gros paquets, autour des deux mots-dièse qu'on a sélec­tion­né.
Côté #dark­jo­bim, les dis­cus­sions sem­blaient plu­tôt légères : ça par­lait cigales, bla­ck­ma­gic, dis­rup­tif, jojo­bim­bim et blo­ck­chain quan­tique. Quelques tweets asso­ciaient #dark­jo­bim et #jobim2018, à pro­pos de Bioin­fuse, bio­in­for­ma­tics­job, jebif

Bon, et pour #jobim2018 alors ?  Eh bien d'après les mots-dièse, une par­tie des tweets étaient sérieux (syn­te­ny, rstats, micro­biote, sfbi, AG). Pour le reste… voyez par vous-même. 🤐

Le réseau des twittos

Concer­nant les inter­ac­tions entre twit­tos eux-mêmes, ça part net­te­ment plus dans tous les sens :

Réseau des mots-dièse de JOBIM2018.
Réseau des twit­tos de JOBIM2018. La taille des nœuds repré­sente le nombre de tweets rédi­gés par le twit­tos. L'épaisseur des arêtes montre le "score" vu pré­cé­dem­ment. Fichier SVG. Fichier Gephi.

On voit que cer­tains twit­tos ont été assez pro­li­fiques (je ne don­ne­rai pas de noms). Le réseau est for­mé d'un grand module inter­con­nec­té (on appelle ça une com­po­sante connexe), et d'autres plus petites avec deux ou trois twit­tos seule­ment. Et en un coup d'œil à ce réseau, on note que le hub Pas­teur porte éga­le­ment bien son nom ! 😬

N'hésitez pas à télé­char­ger les fichiers Gephi et les ouvrir avec le logi­ciel pour navi­guer faci­le­ment dans le réseau.

Bon, et qu'est-ce que les twit­tos se sont racon­tés alors ? On va le voir avec le pro­chain réseau !

Le réseau bipartite : mots-dièse — twittos

Réseau bipartite des mots-dièse et des twittos de JOBIM2018.
Réseau bipar­tite des mots-dièse et des twit­tos de JOBIM2018. Fichier SVG. Fichier Gephi.

Dans ce réseau on a deux types de nœuds (mots-dièse et twit­tos), et on ne peut pas connec­ter deux nœuds d'un même type. Par consé­quent, ce qu'on voit c'est lit­té­ra­le­ment "qui a dit quoi" ! Beau­coup de twit­tos n'ont uti­li­sé que le mot-dièse #jobim2018 (le groupe de nœuds vers la droite du réseau). Et puis d'autres ont visi­ble­ment eu plus d'imagination. 🗣

Conclusion

Pfiou, on aura vu pas mal de choses dans cet article mine de rien ! Com­ment récu­pé­rer des tweets et les enre­gis­trer dans un fichier JSON, com­ment à par­tir de ces tweets éta­blir dif­fé­rents réseaux, et com­ment les visua­li­ser. Et avec tout ça on aura eu un petit aper­çu de JOBIM2018 ! Les tech­niques uti­li­sées, sur­tout pour géné­rer et visua­li­ser les réseaux, peuvent être adap­tables pour étu­dier des réseaux bio­lo­giques (inter­ac­tion pro­téine-pro­téine, simi­la­ri­té de séquences…)

Pour ce petit pro­jet, des amé­lio­ra­tions sont pos­sibles, en voi­ci quelques-unes (n'hésitez pas à en ajou­ter dans les com­men­taires) :

  • un petit nombre de mots-dièse (ou twit­tos) concentrent beau­coup de tweets, ce qui rend l'échelle de la taille des nœuds assez peu repré­sen­ta­tive (on ne voit pas la dif­fé­rence entre 1 et 20 tweets). On pour­rait chan­ger cette échelle.
  • il y a d'autres mots inté­res­sants dans les tweets que les mots-dièse, on pour­rait aus­si les uti­li­ser.

Je rap­pelle que le code que j'ai écrit est en ligne à cette adresse : https://​github​.com/​b​i​o​i​n​f​o​-​f​r​/​h​a​s​h​t​a​g​-​n​e​t​w​ork

Enfin, petit coup de pub à une école d'été à laquelle j'ai pu par­ti­ci­per sans laquelle rien n'aurait été pos­sible grâce à laquelle j'ai appris à construire des réseaux : Evo­lu­net. 🤓

Encore une fois, énorme mer­ci aux relec­teurs et admins (en l'occurrence Mathu­rin & Yoann M.) ! 💜

Alors, arri­ve­rez-vous à repro­duire tout ça lors la pro­chaine confé­rence à laquelle vous par­ti­ci­pe­rez ? 😃

Vous avez aimé ? Dites-le nous !

Moyenne : 0 /​ 5. Nb de votes : 0

Pas encore de vote pour cet article.

Partagez cet article :




Commentaires

2 réponses à “#JOBIM2018 : une étude de réseau”

  1. Sup' dude !

    J'profite du fait que j'ai vou­lu essayer de suivre ton tuto, et j'me deman­dais : com­ment tu fais pour gérer les rate limit ? 😮

    1. Mer­ci pour ton inté­rêt ! 🙂
      Effec­ti­ve­ment le "rate limit" est un peu contrai­gnant : par fenêtre de 15 minutes, seul un cer­tain nombre de requêtes est pos­sible (https://​deve​lo​per​.twit​ter​.com/​e​n​/​d​o​c​s​/​b​a​s​i​c​s​/​r​a​t​e​-​l​i​m​i​t​ing).
      Pas de solu­tion, à part la par­ci­mo­nie dans les tests, mal­heu­reu­se­ment…

Laisser un commentaire