TP2: Javascript et les Tweets

(voir ce sujet sans les cadres: [ici])

Dans ce TP, vous allez développer une batterie de fonctions qui permettent de traiter une collection de tweets récupérés de l'application Twitter. Les données sont au format JSON et sont donc directement utilisables dans un programme javascript. Environ 1000 tweets sont disponibles pour développer votre programme. Il se peut que cela soit volumineux pour codeboot. J'ai donc déposé des collections de différentes tailles. Rien ne vous empêche de commencer à développer à l'aide de la plus petite d'entre-elle, puis de tester le passage à l'échelle sur des collections plus grandes.

Le sujet qui suit décrit en détail ce qui vous est demandé. Prenez le temps de le lire. N'hésitez pas à poser des questions. Je ne répondrai cependant plus aux questions une semaine avant la remise (et encore moins aux courriels du genre: "Je ne comprends rien, expliquez moi ce qu'il faut faire" envoyés 2 jours avant la remise).

Ressource

La première ligne du programme devoir2.js que vous devez remettre doit commencer par inclure une collection de tweets, via une commande load. La ressource complète est disponible ici: [tweets.js]. Il s'agit d'un tableau de tweets dont le nom est tweets; chaque tweet étant décrit par un objet, dont voici un exemple:

  {
  IdTweets:"272055041588862976",
  response_To_User:"null",
  response_To_Tweet:"-1",
  Text:"I feel a migraine coming onnnn! Time for a nap #zzzzzz",
  Auteur:{
      ID:"kcarisse",
      Pref_Lang:"en",
      Friend_Count:"219",
      Followers_Count:"",
      Date_Inscription:"Wed Mar 04 14:26:12 EST 2009",
      Nombre_de_Tweets:"2868"
  },
  Hashtags:["zzzzzz"]
  }

Notez que toutes les propriétés ne sont pas nécessaires pour la réalisation de ce devoir. Voici des versions plus modestes de la collection de tweets. Toutes les ressources sont au même format et se contentent de déclarer le tableau tweets:

Vous pouvez bien sûr télécharger ces ressources sur votre ordinateur, les intégrer à votre environnement codeboot.

Cahier des charges

Vous devez remettre un programme devoir2.js qui offre un ensemble de fonctions décrites ci-après. Vous êtes encouragés à développer vos propres objets pour cela (quelques fonctions requièrent de créer des objets).

Votre programme doit commencer par l'instruction load("tweets.js"); qui donne accès dans l'espace global au tableau tweets. Votre code ne doit en aucun cas contenir une déclaration de la variable tweets. Il est possible qu'au moment de la correction, nous testions vos programmes à l'aide d'une nouvelle collection (au même format).

Nous testerons votre code en lancant des fonctions dont la syntaxe est spécifiée ci-après.

Important: Le sujet vous demande de n'utiliser aucune fonction de tri, que ce soit une fonction vue en cours ou en démonstration, l'une des fonctions standard de tri (par exemple la méthode sort de la classe Array), ou l'une que vous seriez tenté d'écrire. Il vous est cependant spécifié un ordre sur certains tableaux que vous allez créer. Il n'y a pas de contradiction: vous pouvez maintenir trié un tableau (au début vide) en insérant à sa place chaque élément. Nous avons vu cela en cours (avec les fonctions de recherche dichotomique et d'insertion dans un tableau trié que vous pouvez (devez) adapter aux besoins de ce devoir. Si vous n'y arrivez pas, utilisez les tris...

Les exemples dans ce qui suit ont été lancés sur la plus grosse ressource.



getTweetsEcrisPar(<id>)

Retourne un tableau des indices des éléments du tableau tweets qui sont des tweets dont l'auteur a pour identificateur la valeur id (propriété Auteur.ID). Les indices seront présentés en ordre croissant. Si aucun message dans la collection n'a été écrit par l'auteur spécifié, alors la fonction retourne un tableau vide ([]). Voici un exemple:

print(getTweetsEcrisPar("DanielaIzabelle"));

qui affichera le tableau [158,163,171,187,199], soit les indices des 5 messages dans la collection qui sont de l'auteur d'identificateur DanielaIzabelle. Dans l'exemple, le tableau est directement passé à la fonction print qui en produit l'affichage (158,163,171,187,199).

getTweetsAvecHTag(<tag>)

Retourne un tableau des indices des éléments du tableau tweets qui sont des tweets qui contiennent tag parmi leur htags (propriété Hashtags). Les indices seront présentés en ordre croissant. Si aucun message dans la collection ne contient le tag spécifié, alors la fonction retourne un tableau vide ([]). Voici un exemple:

 
print(getTweetsAvecHTag("wtf"));

qui affiche 7,475,534,640



getTweetsEcrisParAuteurPopulaire(<nb>)

Retourne un tableau des indices des éléments du tableau tweets qui sont des tweets écris par un auteur dont la popularité (telle que définie par la propriété Auteur["Friend_Count"]) est supérieure ou égale à nb. Les indices seront présentés en ordre croissant. Là encore, un tableau vide ([]) sera retourné si aucun tweet ne correspond à ce critère. Voici un exemple:

 
print(getTweetsEcrisParAuteurPopulaire(4000));

qui affiche 108,116,144,156,172,219,227,611,669,679,691,791,832,912,928,998.



getTweetsEnReponseAuTweet(<id>)

Retourne un tableau des indices des éléments du tableau tweets qui sont des tweets écris en réponse au tweet d'identificateur id. Cette information est contenue dans la propriété response_To_Tweet (-1 indique qu'il ne s'agit pas d'une réponse). Les indices seront présentés en ordre croissant. Là encore, un tableau vide ([]) sera retourné si aucun tweet ne correspond à ce critère. Voici un exemple:

 
print(getTweetsEnReponseAuTweet("272100663335460864"));

qui affiche 864,888.



getHTags(<nb>)

Retourne un tableau qui contient les nb htags les plus fréquents dans la collection ainsi que leur fréquence, c'est-à-dire le nombre de fois où un htag apparait dans une propriété htags de la collection. Ce tableau doit être trié en ordre décroissant de fréquence des htags. L'exemple:

 
print(getHTags(20));

produit l'affichage (les retours chariots ont été ajoutés à la main pour (peut-être) plus de lisibilité)

[FF,29],[a11ymtl,16],[BlackFriday,14],[fdemocratie,11],[Montreal,10],
[blackfriday,9],[Ottawa,7],[ff,6],[clouds,5],[lol,5],[boew,5],
[Fabigate,5],[love,4],[eventssleepover2012,4],[wtf,4],
[thuggy,4],[montreal,4],[colombianoqueserespete,4],[yum,3],[views,3]

qui indique que le htag le plus fréquent est FF qui apparait 29 dans la collection, etc. Notez que l'affichage produit peut différer de celui proposé pour plusieurs raisons. Notamment, il existe plusieurs htags de fréquence 3 dans la collection et 2 seulement sont affichés (yum et views).

note: pour réaliser correctement cette question, vous devez créer un objet qui abritera une paire d'élément (un htag et sa fréquence).



getHTagFrequency(<htag>)

Retourne la fréquence du htag spécifié en argument. Si le htag n'est pas présent dans la collection, la fonction retourne 0. Exemple:

 
getHTagFrequency("ottawa");

vaut 3, le nombre de fois où ottawa est présent dans une propriété Hashtags de la collection.



getAuteurs()

Retourne un tableau des différents auteurs de la collection ainsi que le nombre de messages de cet auteur dans la collection et ses messages. Vous devez donc créer un objet pour représenter un auteur dans ce tableau qui doit être trié en ordre lexicographique. Exemple:

 
var auteurs = getAuteurs();
print(auteurs.slice(0,3).join("\n"));

produit l'affichage:

 
Auteur 007Kimberly : 1 message
	tweet 1 @Roadie206 aww!! #sweet

Auteur 07BBS2K : 1 message
	tweet 1 #SeinfeldReference  I'm outta the contest!

Auteur 0hbi3ber : 2 messages
	tweet 1 @takestyles aw mds #ferry é vida, apenas
	tweet 2 @takestyles sim aaaaaaaah eu amei como eu não pensei nisso antes? team #lastin

Vous noterez dans cet exemple que l'affichage du tableau produit du texte. Votre affichage peut différer dans la forme pour autant que: chaque auteur soit identifié facilement, ainsi que le nombre de messages de lui qui sont dans la collection et chacun de ces messages (numérotés). Il existe par exemple 2 tweets de l'auteur d'identificateur 0hbi3ber dans la collection.

Note: Ces contraintes imposent qu'un élément du tableau retourné par la fonction est un objet.



getWords(<id>,<nb>)

Retourne un tableau des nb mots les plus plus fréquents dans les tweets de l'auteur dont l'identificateur est spécifié en argument. Chaque mot doit être accompagné de sa fréquence, c'est-à-dire le nombre de fois où ce mot apparaît dans l'ensemble des messages de l'auteur. Le tableau doit donc contenir des paires (objets) qui doivent être affichées en ordre décroissant de fréquence. Voici un exemple:

print(getWords("DanielaIzabelle",7));

qui produit:

  
DanielaIzabelle [is,4],[to,3],[#3Uact3s4,3],[are,2],[you,2],[@macbeth:,2],[the,2]

Votre affichage peut différer, notamment car plusieurs mots ont la même fréquence dans la production d'un auteur.

Et voici à titre indicatif les messages de l'auteur concerné:

  
Auteur DanielaIzabelle : 5 messages
  tweet 1 @macbeth: banquo is dead but only half the job is done. His son Fleance has fled and is now my next target #angry #3Uact3s4
  tweet 2 @macbeth: what is happening? Why do I have to be the one to be haunted? #3Uact3s4
  tweet 3 @ross: @macbeth are you ok? You seem like you are talking to yourself or something #crazypeople #3Uact3s4
  tweet 4 WHUDDUP MISS :D #3UAct3S4
  tweet 5 Follow me on Instagram ! : oxdanielaizabelle ! #3UAct3S4

Vous pouvez utiliser la fonction split de la classe string afin de découper un texte en mots (des caractères séparés par un espace ou une fin de chaine). "Halo? Bonjour" contient donc deux mots Halo? et Bonjour.



getChaines(<nb>,<id>)

Une chaîne de tweets est une liste de tweets liés par la relation est en réponse à encodée dans la propriété response_To_Tweet. Une chaine de longueur nb est une chaine contenant nb tweets. Voici un exemple de chaîne de longueur 4 affichée par la function décrite ci-après:

  
link 0001 0002 0003 0004
 4 0001 auteur: felipe text: C'est cool les tweets
   3 0002 auteur: houssem text: Les tweets c'est nul
     2 0003 auteur: ift1015 text: Javascript ou Java
       1 0004 auteur: javascript text: To be or not to be

Cet affichage indique que le tweet d'identificateur 0004 a été écrit par l'auteur d'identificateur javascript, en réponse au tweet 0003 (écrit par ift1015) en réponse au tweet 0002 (écrit par houssem) en réponse au tweet 0001 (écrit par felipe). Le texte de chacun de ces tweets est également présent.

Écrivez une fonction qui repère et affiche dans la collection l'ensemble des chaînes de longueur nb identifiées. L'affichage produit par votre commande peut différer pour autant que les informations présentes dans l'exemple précédant en fasse partie (l'auteur, le texte et l'identificateur du tweet).

Note: l'argument id n'a pas été spécifié dans le sujet initial. Dans l'esprit, il s'agissait de l'identificateur d'un tweet, comme dans la question getTweetsEnReponseAuTweet(id). Si vous avez pris un autre type d'identificateur, c'est correct !

Suggestion: Pensez les choses de manière récursive.

Notation

Ce travail est à faire de préférence en binôme, mais il est possible de le faire seul. Si vous travaillez en binôme, il est important que le nom des deux personnes soit indiqué en entête de tous les documents remis. Vous pouvez également remettre un document dans lequel vous pouvez souligner les spécificités de votre devoir.

Conseil: Commencez à travailler dès maintenant. Si vous avez l'impression d'écrire souvent du code très similaire c'est que vous pouvez l'organiser plus efficacement. Beaucoup de fonctions réalisent des choses très proches.

Notation: La notation dépendra de la lisibilité de votre code, de sa bonne organisation, et de sa robustesse à des tests que nous effectuerons.