La partie 2 du TP3 est à rendre pour le 23 avril. Il s'agit de calculer les similarités entre les flux RSS et determiner quels sont les K-plus-proches voisins de chaque flux. Calculer pour chaque flux RSS un vecteur du score TF-IDF des mots y apparaissant. Le score TF-IDF d'un mot, pour un document (flux RSS) donne, se calcule comme suit: tf-idf(mot, document) = tf(mot, document) * log(idf(mot)) ou tf(mot, document) correspond a la frequence d'apparition du mot dans le document (par exemple, 10 apparitions/400 mots, donc .025), et idf(mot) a l'inverse de la frequence d'apparition du mot dans tous les documents (par exemple, apparait dans 4 documents sur 10, donc 2.5). Cela revient a donner un poids a chaque mot: plus le mot revient dans plusieurs document, moins il est important pour caracteriser un document. On aura donc, pour chaque document, une association de chaque mot dans le document vers son score TF-IDF. La ponderation permet de calculer la proximite entre les documents en tenant compte du fait que certains mots sont plus frequents que d'autres, et que les mots moins communs sont plus important. Comme mesure de proximite, nous utiliserons la distance cosinus, qui correspond (a peu de choses pres) a l'angle entre deux vecteurs: proximite(A, B) = A.B/(|A| * |B|) ou le point est le produit scalaire, et |A| la norme de A. Plus la proximite, une valeur dans [0, 1], est grande, plus les documents sont similaires; plus elle est petite, plus ils sont differents. Le produit scalaire de deux vecteurs se calcule en faisant la somme des produits des entrees correspondantes. Dans ce cas-ci, on fera donc la somme des produits des scores TF-IDF de chaque mot dans les deux documents. Puisque, pour tout score TF-IDF x, 0*x = 0, il suffit de passer a travers les mots presents dans un des deux documents, de multiplier le score de chaque mot dans les deux documents, et d'additionner les produits. La norme d'un vecteur A correspond a sqrt(A.A), la racine carree du produit scalaire du vecteur avec lui-meme. Il suffit donc de faire la somme du score TF-IDF au carre de chaque mot dans le document, puis d'en prendre la racine. Enfin, avec cette mesure de proximite, il est possible de trouver, pour chaque flux RSS, les (autres) flux qui lui ressemblent le plus (dont la proximite est proche de 1). Il faudra fournit la liste des k plus proches voisins de chaque flux dans le format neato: k étant une valeur donnée au lancement du programme. Dans l'exemple ci-dessous, il s'agit du second argument (le "2") du programme. Exemple d'utilisation: > java TP3_2 flux.lst 2 digraph G { center "" A -> B; A -> C; B -> D; B -> E; C -> B; C -> D; D -> A; D -> B; E -> C; E -> D; } Les noms des noeuds dans le graph sont les noms des sites webs (pas leur adresses), sans quoi le graph ne sera pas lisible. Finalement, il est possible de visualiser le graphe correspondant en passant la sortie du TP dans neato, par exemple: > java TP3_2 flux.lst 2 | neato -Tpng -o flux.png Qui donnera un rendu du graphe en format png dans le fichier flux.png