Bouillon collaboratif : dédoublonnage

Voir les billets précédents sur le Bouillon des bibliobsédés 2.0 :

S’abonner au Bouillon (RSS)

Dans les 15-20 sources, il y a forcément des informations qui seront signalées plusieurs fois par les veilleurs.

Les objectifs étaient

  1. de les dédoublonner
  2. de faire valoir le nombre de fois où la même info était partagée (le taux de recommandation rend à peu près compte de l’importance, intelligence, pertinence de l’info)
  3. d’indiquer, dans l’item dédoublonné, par qui il avait été partagé.
  4. de conserver éventuellement les commentaires rédigés par les différents veilleurs.

Pour ce billet, on verra juste les deux premiers points

Module Unique (dédoublonnage)

Yahoo Pipes propose un module de dédoublonnage, sur un seul critère

Rappelons qu’à la source, on a une fusion de 17 flux RSS où les items ont été retriés par date de publication. S’y trouvent donc des billets, articles , etc. identiques, partagés plusieurs fois.

Cela constitue un gros fichier XML de 100 à 200 items, comportant chacun :

  • un titre (item.title)
  • une URL (item.link)
  • une “description” (item.description) = contenu du billet
  • une date de publication (item.pubDate)
  • une “origine” (rajoutée à la source) = nom du veilleur

Le critère URL du billet (item.link) est le plus pertinent pour dédoublonner, évidemment.

Le module Unique fonctionne de la manière suivante :

  • Pour chaque item, il prend en compte le lien.
  • Il regarde dans la suite du fichier XML traité s’il y a des liens identiques.
  • S’il en trouve, il les supprime.
  • Dans le  1er item rencontré, le seul conservé, il stocke dans un nouveau champ item.y:repeatcount le nombre de fois où il a repéré le même lien.

Indication du nombre de recommandations

La valeur du champ item.y:repeatcount doit être ajoutée au titre, entre parenthèses.

Pour cela, on utilise une boucle (Loop) : pour chaque item, on concatène :

  • le titre
  • suivi d’une parenthèse “(” avec le signe “+”
  • suivi de l’indication du nombre de fois où l’item aura été partagée
  • suivi de la parenthèse fermante “)”

Et cette concaténation est mise comme nouveau titre

Ce qui donne :

Problèmes

Le module Unique ne conserve que le premier item rencontré.

Donc si, en dehors du critère “item.link”, il y avait des informations différentes dans les différents items dédoublonnés, celles stockées dans les items supprimés sont oubliées.

Par exemple :

Un veilleur utilise Google Reader (appelons-le Lully) pour partager sa veille, un autre utilise Delicious (appelons-le Couperin1).
Ils partagent par hasard le même billet.
Si Lully a le premier mis ce billet en partage, celui-ci se retrouvera fusionné dans le pipe commun, avec dans le champ “Description” l’intégralité du billet.
Ensuite Couperin partage ce billet à son tour. Lors du dédoublonnage, c’est celui de Couperin qui sera conservé.
Or dans Delicious le champ “Description” n’est renseigné qu’avec la description éventuellement mise par le veilleur.
Donc dans le résultat final, l’item ne fournira plus le contenu du billet

Donc selon l’ordre dans lequel le même billet a été partagé, vous retrouverez son contenu dans le Bouillon… ou non.

Autre problème : dans l’item final, le seul champ “Origine” conservé sera celui du dernier veilleur, le billet eût-il été partagé 8 fois !

De même, si les 8 veilleurs ont rajouté un commentaire lors du partage, seul le plus récent sera conservé.

Bref, une perte d’information importante dans le cadre d’une veille collaborative (puisqu’elle rend compte et légitime le résultat final).

Donc les prochaines fois, on verra les plus gros morceaux : récupération de la liste des “origine”, et de la liste des “commentaires”. Sachant que j’ai aussi plusieurs autres billets à finir…

___________________________

1. Parce que c’est un autre compositeur de l’époque moderne.

Bouillon collaboratif : Lien “traduction” Google

Juste avant le lancement du Bouillon, a été rajouté un lien “Traduction automatique (Google)” qui n’apparaît que sur les articles en anglais.

Or les flux RSS des sources ne fournissent pas, pour chaque billet, l’indication de langue : cette information n’est fournie nulle part. Il faut donc :

  1. demander au pipe de détecter automatiquement la langue
  2. mettre la valeur de la langue (“en”, “fr”, etc.) dans un champ “language”
  3. distinguer les billets dont la langue est “fr” de ceux dont c’est “en”, et pour ces derniers rajouter un lien.
  4. Il faut que ce lien soit la concaténation de : “http://translate.google.com/translate?sl=en&tl=fr&u=” suivi du lien du billet. L’URL racine qui correspond à la traduction automatique dans Google, où la langue de départ est l’anglais (sl=en, pour start language) et la langue de destination est le français (tl=fr, pour translation language).

Etape 1 : détection automatique de la langue

<

Vous vous doutez que, lorsque vous lancez une requête dans Google, le moteur est capable de reconnaître la langue utilisée pour la requête. Donc Google sait reconnaître une langue sur quelques mots.

Il existe un service Google (une API, pour être exact) qui donne une valeur de langue quand on lui fournit une phrase.

Par exemple, la phrase suivante :

Comment utiliser la traduction de Google

peut être transmise à cette API ainsi :

http://ajax.googleapis.com/ajax/services/language/detect?q=Comment+utiliser+la+traduction+de+Google&v=1.0

Si vous cliquez sur le lien ci-dessus, vous ouvrez un fichier texte en format JSON ou les attributs de la valeur utilisée (la phrase en question) sont imbriquées les unes dans les autres, de manière assez comparable à un fichier XML.

Bref, dans la copie d’écran ci-dessus, le premier encart (Loop) contient un “URL Builder” qui crée un nouveau champ pour chaque item, champ intitulé item.lang_url. Sa valeur est la concaténation de :

  • http://ajax.googleapis.com/ajax/services/language/detect?
  • &q=item.title (titre de chaque billet partagé)
  • &v=1.0

Le second encart (Loop) ouvre la page dont l’URL est celle qui vient d’être créée (avec un Fetch Data, dont l’adresse est item.lang_url).
Le champ “Path to item list” indique quelle valeur il faut récupérer, selon une syntaxe assez simple : dans le fichier dont l’URL est http://ajax.googleapis.com/ajax/services/language/detect?q=Comment+utiliser+la+traduction+de+Google&v=1.0, la langue est dans responseData > language. Donc on indique que la valeur responseData.language est à ranger dans item.language.

Ce faisant, Yahoo Pipes a récupéré en réalité toute une imbrication de l’information, et le dernier encart (Rename) simplifie le nom du champ : la valeur de langue (“fr”) avait été stockée dans item.language.0.content (on s’en rend compte assez vite dans le debugger). Elle sera désormais dans item.language.

Etape 2 : génération du lien vers Google Translate

Après que le champ item.language a été correctement renseigné grâce à l’étape 1, on divise le flux produit en deux. Le module “Split” produit deux flux identiques.

Dans celui de gauche, je ne laisse passer que les items de langue française, que je réinjecte dans le flux unique (Union).

Dans celui de droite, je bloque tous les items de langue française. Puis pour chacun de ces items, je génère la ligne suivante :

<p style=”text-align: right”> [créer un paragraphe aligné à droite]
<a href=”http://translate.google.com/translate?sl=en&tl=fr&u=item.link“>Traduction automatique (Google)
</a>
</p>

Puis je réinjecte ces items-là aussi dans le flux principal (module Union)

Et voilà.

Remarque

Notez que pour l’instant je n’ai pas abordé la question du dédoublonnage. C’est le plus gros morceau (rien à voir avec celui-ci). Donc j’avance progressivement (en tout cas, j’essaie !).

Silvère a dit : que le Bouillon soit. Et le Bouillon fut ! Et maintenant il devient…

… collaboratif.

S’abonner au Bouillon collaboratif

Le Bibliobsédé a proposé une ouverture à la collaboration pour les ingrédients de son Bouillon. Vous retrouverez l’information chez lui et ailleurs.

Il me revient naturellement la joie de vous expliquer, aussi pédagogiquement que possible, le casse-tête qu’à signifié cette collaboration sous l’angle “Tutoriel Yahoo Pipes”.

Parce que, grâce à Silvère (que mille tweets chantent sa gloire !), j’ai dû me tordre les méninges et les boyaux et les tuyaux (de Yahoo) pour structurer un résultat correct, manipulable et intéressant.

Donc, présentation du pipe (et merci de le prononcer “païpe”, même intérieurement) en plusieurs étapes. Comme le résultat est relativement complexe, cela fera l’objet de plusieurs billets (au moins 3)

Aujourd’hui : Les sources

Schéma Yahoo Pipes - les sources

Chaque “veilleur” a un outil propre de partage d’informations. Google Reader pour la plupart, mais aussi Delicious ou d’autres outils encore. Chaque fois qu’un veilleur enrichit sa page de partage, il enrichit aussi le flux RSS correspondant. Donc l’activité de partage de chaque veilleur fournit un flux RSS.

La combinaison des sources n’est pas très complexe (ou n’est pas le plus complexe) :

  • Un Fetch Feed pour intégrer le flux
  • L’ajout d’un champ “Origine” pour indiquer à qui appartient ce flux (Module Loop avec un String Builder)
  • Et la fusion de tout ça…
  • retrié par ordre de date de publication immédiatement (pour voir aussitôt dans le debugger ce que ça donne)

Juste avant la production du fil RSS, on rajoute le champ “Origine” à la “description” (la “description”, pour un item dans un flux RSS, c’est tout simplement le contenu du texte)

Mais s’il n’avait fallu que ça, peut-être Yahoo Pipes n’aurait pas été nécessaire (d’autres outils existent pour fusionner des flux RSS !). Yahoo Pipes permet aussi :

  • de dédoublonner
  • de récupérer la liste des personnes qui ont partagé le même billet
  • de récupérer d’éventuels commentaires de la part de ces personnes.
  • proposer les billets partagés par plus de deux personnes unqiquement (parce que la veille de 20 veilleurs environ, ça peut paraître excessif à beaucoup. Ils peuvent alors profiter du Nectar du bouillon, par RSS ou par mail)

Cela, c’était le plus drôle.

Depuis, j’ai aussi finassé en rajoutant un lien “Traduction automatique Google” quand le billet partagé était en anglais. Donc il a fallu utiliser un outil de reconnaissance automatique de la langue.

Bref, vous voyez qu’il y a de quoi parler pour quelques autres billets !