(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).
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.
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.
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
).
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
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
.
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
.
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).
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.
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.
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
.
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.
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.