Publicité

Recherche

Calendrier

Novembre 2009
L M M J V S D
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
<< < > >>

Illustrations

  • Linea.jpg
  • Eleanore O'Ryan

Catégories

Présentation

Recommander

Overblog

Jeudi 1 octobre 2009
PHP est un langage qui allie le moins bon et le meilleur. Le module SimpleXML en est un excellent exemple. A la base, ce module permet une gestion simple et intuitive du XML, sans la complexité du DOM.

Malheureusement dans ce cas, la Simplicité rime aussi avec Limitation. Certaines gestions sont très approximative, le typage des données est curieux par moments. C'est en gros ce qui m'est arrivé hier. Dans le cadre de la programmation du coeur d'Overblog, je me suis retrouvé dans un cas où je voulais mettre à jour la valeur d'un noeud unique à partir d'un xpath.Et là, c'est le drame, ça ne marche absolument pas comme ça devrait. Alors on fouille un peu, et on trouve l'exemple qui correspond exactement à ce qu'on cherche, qui explique que ça ne fonctionne pas comme prévu, et qui donne une façon de contourner le problème : http://fr.php.net/manual/en/simplexml.examples.php#87011.

Bingo ! Problème réglé ? En fait non, car la "correction" ne fonctionne pas mieux... Elle ne marche pas, mais différement. 

Encore une fois, il faut passer au plan B. Bon, le bon point de SimpleXML, c'est qu'on peut étendre la classe SimpleXMLElement. On ne peut pas surcharger les méthodes existantes certes, mais on peut en créer des nouvelles. En outre il est possible de passer du objet SimpleXML à un objet DOM et réciproquement, et donc on peut en général toujours s'en sortir de cette manière. 

class ExtendedSimpleXMLElement extends SimpleXMLElement
{
public function getParent ()
{
$node = dom_import_simplexml($this);
$parent = simplexml_import_dom($node->parentNode);

return ($parent);
}

public function setValueFromXpath($xpath, $value)
{
$nodes = $this->xpath($xpath);

if (count($nodes) !== 1 or (count($nodes[0]->children()) > 1))
{
return false;
}
$parent = $nodes[0]->getParent();
$name = $nodes[0]->getName();
$parent->{$name} = $value;
return true;
}
}

Et là miracle, ça marche. Mais quelle galère pour en arriver là, et que de temps perdu.

Prions pour qu'un jour SimpleXML soit crédible !
Par Torgan
Ecrire un commentaire - Voir les 0 commentaires
Vendredi 14 août 2009
Tout le monde le sait (ou presque du moins) : overblog est basé sur le framework PHP Jelix (version 1.1.2 pour les curieux). Notre version est très légèrement modifiée pour des besoins qui nous sont propres, mais de façon le plus limité possible. Les modifications applicables au projet Jelix sont généralement fournies à Laurent Jouanneau pour intégration.

Petit reproche à Jelix, malgré tout le bien que je pense de ce framework, le moteur de tests unitaires simpletest utilisé ne me plaisait pas plus que ça. PhpUnit nous a semblé plus complet, en particulier grace à la possibilité de générer des rapports de couverture de code, particulièrement précieux pour repérer les parties de code non testées.

Toujours-est il que de faire cohabiter l'environnement Jelix et l'environnement PHPUnit semblait bien compliqué jusqu'à la découverte d'une feinte. Bon tout d'abord on installe PHPunit en suivant la procédure normale d'installation (c'est du PEAR me semble-t-il). L'exécutable /usr/bin/phpunit est en fait un fichier php (je vous fais grâce des commentaires) :

<?php
/* PHPUnit
 *
 * ...
 */

if (strpos('/usr/bin/php', '@php_bin') === 0) {
    set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path());
}

require_once 'PHPUnit/Util/Filter.php';

PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');

require 'PHPUnit/TextUI/Command.php';

define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main');

PHPUnit_TextUI_Command::main();
?>

On constate que PhpUnit ne fait qu'exécuter une méthode statique PHP. Donc, si l'on parvient à exécuter cette même méthode (qui ne fait que produire du texte) dans un environnement Jelix, ça devrait rouler tout seul.

Il suffit donc au final de créer un nouveau type de request Jelix, et de créer un nouveau script phpunit pour remplacer le phpunit classique.

jPhpunitRequest.class.php

On rajoute cette classe dans le répertoire request/ du core de Jelix. C'est le seul ajout qui sera fait au framework. C'est dans cette request, lors de l'initialisation des paramètres, qu'on exécute tout simplement la méthode de Phpunit.

<?php
/**
* @package     jelix
* @subpackage  core_request
* @author      Yannick Le Guédart
* @link        http://www.jelix.org
* @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
*/

require_once (JELIX_LIB_CORE_PATH.'request/jCmdLineRequest.class.php');
require_once ('PHPUnit/Framework/TestCase.php');

class jPhpunitRequest extends jCmdLineRequest
{
    public $type = 'phpunit';

    public $defaultResponseType = 'text';

        protected function _initParams ()
        {
                require 'PHPUnit/TextUI/Command.php';

                define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main');

                PHPUnit_TextUI_Command::main();
        }
}

Un nouveau phpunit

<?php
/**
* @package     jelix
* @subpackage  core_request
* @author      Yannick Le Guédart
* @link        http://www.jelix.org
* @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
*/

require_once (JELIX_LIB_CORE_PATH.'request/jCmdLineRequest.class.php');
require_once ('PHPUnit/Framework/TestCase.php');
class jPhpunitRequest extends jCmdLineRequest
{
    public $type = 'phpunit';

    public $defaultResponseType = 'text';

        protected function _initParams ()
        {
                require 'PHPUnit/TextUI/Command.php';

                define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main');

                PHPUnit_TextUI_Command::main();
        }
}

Ensuite, dans le répertoire scripts/ de notre application, on crée un nouveau exécutable phpunit qui sera exécuté à la place de l'original pour les tests unitaires en environnement Jelix :

<?php
/* PHPUnit
 *
 * ...
 */

ini_set('memory_limit', '512M');

require_once 'PHPUnit/Util/Filter.php';

PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');

require_once ('/usr/local/share/jelix/lib/jelix/init.php');

require_once ('../application.init.php');

require_once (JELIX_LIB_CORE_PATH.'request/jPhpunitRequest.class.php');

$config_file = 'defaultconfig.ini.php';

$jelix = new jCoordinator ($config_file);
$jelix->process (new jPhpunitRequest());
?>

Et c'est tout ! Ca fonctionne parfaitement :

# ../scripts/phpunit _articleTest modules/data_access/classes/_articleTest.php

PHPUnit 3.3.17 by Sebastian Bergmann.

............................................................ 60 / 85
.........................

Time: 16 seconds

OK (85 tests, 643 assertions)

Bon je reste persuadé qu'on peut faire les choses beaucoup plus proprement et moins à l'arrache, mais cette solution permet d'être rapidement opérationnel sur des tests unitaires, et c'était l'effet recherché lors de la mise en place. Les options de phpunit sont naturellement passées à l'objet jPhpunitRequest, et du coup toutes les options de phpunit restent disponibles.

Have fun !
Par Torgan
Ecrire un commentaire - Voir les 1 commentaires
Vendredi 7 août 2009
Toujours dans le cadre des recherches sur la similarité d'articles d'overblog, j'ai expérimenté un logiciel d'extraction de mots-clef : KEA (acronyme pour keyphrase extraction algorythm). Il s'agit d'un algorithme capable d'extraire des mots-clef ou des phrases-clef, de façon libre, on en privilégiant un vocabulaire controllé. il est implémenté en Java, et distribué sous licence GNU.

Cette article décrit la procédure suivie et les premiers résutats sur des articles du présent blog. J'ai fais les tests sur une machine basée sur un système Ubuntu 9.04, mais je pense que les commandes seront les mêmes sur n'importe quel système UNIX. Avant toute chose, il est nécessaire que le paquet Java-SUN version 6 soit présent sur le système.

  • On commence par télécharger l'archive : KEA-5.0_full (22Mo, ZIP) et on extrait le contenu de l'archive dans un répertoire (/home/kea dans notre cas).
  • Après s'être placé dans le répertoire kea, on met à jour l'environnement :

  • # Mise en place des PATH

    export KEAHOME=/home/kea
    export CLASSPATH=$CLASSPATH:$KEAHOME
    export CLASSPATH=$CLASSPATH:$KEAHOME/lib/commons-logging.jar
    export CLASSPATH=$CLASSPATH:$KEAHOME/lib/icu4j_3_4.jar
    export CLASSPATH=$CLASSPATH:$KEAHOME/lib/iri.jar
    export CLASSPATH=$CLASSPATH:$KEAHOME/lib/jena.jar
    export CLASSPATH=$CLASSPATH:$KEAHOME/lib/snowball.jar
    export CLASSPATH=$CLASSPATH:$KEAHOME/lib/weka.jar
    export CLASSPATH=$CLASSPATH:$KEAHOME/lib/xercesImpl.jar
    export CLASSPATH=$CLASSPATH:$KEAHOME/lib/kea-5.0.jar

  • Comme indiqué dans la documentation d'usage, afin d'être sûr que tout va bien, on lance la compilation d'un test inclus dans l'archive :

  • # Mise en place du test

    javac TestKea.java
    java -Xmx526M TestKea
  • Puisque tout va bien, on va créer un modèle d'extraction français que l'on va tester sur des articles overblog. Pour l'apprentissage, dans  un premier temps, j'ai utilisé les textes fournis dans l'arrchive dans le répertoire testdocs/fr/train/. On prépare tout d'abord les fichiers en question :

  • # Mise en place du modèle OB

    mkdir OB
    mkdir OB/train
    mkdir OB/test
    cp testdocs/fr/train/* OB/train/

  • Tout étant prêt, on commence par créer le modèle. C'est la procédure la plus longue, prenant près d'une minute sur un P4. La commande précise les stop-words (mots interdits) et le stemmer français, eux aussi inclus (en plus des version anglaise et espagnoles). Pour notre test, on ne précise pas de vocabulaire particulier, les textes issus des blogs pouvant être multiples.

  • java kea.main.KEAModelBuilder -l OB/train/ -m OBModel -i fr -s StopwordsFrench -t FrenchStemmer -v none

  • Et enfin, on applique le modèle sur le texte de certains articles, cde la manière suivante :

  • java kea.main.KEAKeyphraseExtractor -l OB/test/ -m OBModel -i fr -s StopwordsFrench -v none

Tout ça au final est relativement simple à mettre en oeuvre. Mais quels sont les résultats ? Voici un échantillon lors de ces premiers tests :

Article Mot-clefs
Top des articles les plus vus
  • d'Overblog
  • Blog
  • L'idée
  • s'ouvre la possibilité
  • capable de détecter
La similarité d'articles (plan B1)
  • méthode
  • Cauet
  • résultats
  • Cauet retourne
  • Cauet retourne la Méthode
[Illustration] Vilma 2 + colorisation
  • tutorial
  • dessins
  • colorisation
  • colorisent
  • crayon
[Battlelore] Traversée du Rhône
  • bataille
  • Arnaud
  • Rhône
  • Battlelore
  • Traversée du Rhône

Je dois avouer que j'ai été assez surpris par les résultats qui sont loin d'être rédicules pour un tout premier tests. En particulier, les articles [Illustration] Vilma 2 + colorisation et [Battlelore] Traversée du Rhône donnent vraiment des résultats excellents. Pour le Top des articles les plus vus, c'est clairement moins concluant. Quand à l'article La similarité d'articles (plan B1), je conçois qu'il soit difficile d'extraire quelque chose de cohérent d'un article qui affiche des liens vers un semble d'articles similaires.

Au final, une assez bonne surprise, susceptible de servir de base à une génération automatiques de mots clefs pour renforcer la couverture d'articiles similaires (cf. le Plan B - La similarité d'articles chez OB ).

Par Torgan
Ecrire un commentaire - Voir les 7 commentaires
Jeudi 6 août 2009
Eh non, pas de plan C pour le moment. Pour ceux qui ont un peu suivi l'article précédent (La similarité d'articles chez OB), la méthode explorée dans le cadre de la recherche d'articles similaires à un article données était limitée en portée, car on ne disposait de données que pour à peine 10% des articles d'OB. Par contre, les rares résultats étaient excellents pour les 3% d'articles concernés.

Du coup, plutôt que d'envisager un Plan C basé sur une méthode différente, la première idée était plutot d'enrichir la méthode actuelle. D'emblée, deux axes s'offrent à nous, l'un  réalisable immédiatement, l'autre nécessitant du temps pour collecter les données :

  • La première méthode consiste à trouver des résultats par un autre moyen moins précis lorsque la recherche par similarité ne donne rien.
  • La seconde consiste à enrichir la base de similarité en utilisant par exemple les résultats de chaque recherche effectuée sur le portail overblog, afin de créer des relations de similarités entre tous les articles. Cette méthode a le mérite de renforcer la méthode actuelle avec des données sures. Par contre elle nécessite un déploiement important, aussi en parlerais-je plus en détail si le déploiement en question voit le jour. 
Mais revenons à la première méthode : le plus simple consiste à tenter de découvrir de nouveaux résultats lorsque la recherche par similarité n'a rien donné. Pour celà, utiliser la recherche OB parait le plus rapide. Nous voici donc partis pour de premiers tests, toujours en nous basant sur le Top des articles les plus vus durant la semaine écoulée. On fait une recherche globale sur le titre de l'article étudié, en considérant que ce titre est représentatif de l'article.

Quel verdict ? On passe d'un taux d'articles couverts de 3% à 55%. Dans la plupart des cas, les résultats sont cohérents, comme par exemple :

[Photos] Cécile de Ménibus se met à nu pour "TV Magazine" (1038444021)

 
id Titre
1109386720 [Vidéo] Cauet retourne la Méthode (Jeudi 23 juillet 2009 à 23 heures 35)
1108169208 [Vidéo] Cauet retourne la Méthode (Jeudi 16 juillet 2009 à 23 heures 25)
1106352995 [Vidéo] "Cauet retourne la Méthode" : Interview de Cécile de Ménibus
1106350126 [Vidéo] "Cauet retourne la Méthode" : Interview de Sébastien Cauet et Cécile de Ménibus
1107289333 [Vidéo] Cauet retourne la Méthode (Jeudi 09 juillet 2009 à 23 heures 30)
1106468036 [Vidéo] "Cauet retourne la Méthode" : Interview de Sébastien Cauet
1106349031 [Vidéo] "Cauet retourne la Méthode" : Sylvester Stallone
1106348782 [Vidéo] "Cauet retourne la Méthode" : Céline Dion
1105844716 Cauet retourne la Méthode

Par contre la méthode se trouve en difficulté dans deux cas :
  • Lorsque le titre de l'article contient trop de mots, le moteur de recherche de postgresql (tsearch2) recherche tous les mots dans les articles d'OB et se retrouve bredouille. C'est des là que viennent les 45% d'échec. par exemple, rechercher 'insolite Mordu par une araignée violoniste en France !' ne donne aucun autre résultat que l'article lui même, ce qui reste assez logique.
  • Lorsque les titres sont courts ou comporte uniquement des mots très communs, on a totues les chances d'avoir des résultats qui ne présentent pas la moindre similarité avec l'article étudié. Dans l'exemple suivant, seuls 2 des articles sont pertinents, la présence des autres étant liée à la fréquence du terme 'index' et au sens multiples du mot 'anime' :

Index Animes (1043471690)


id Titre
1102535191 candidature fansub
1110037595 Sondage : l'avis du Dr. Albissaty Saleh Allazam (867 voix, 35%)
1110007614 L'ATTAQUE DU METRO 123 de Tony Scott (USA-2009): D'abord on prend la berline, après on prend Manhattan !
1109244728 Les patronages laïques toujours engagés
1105904929 Suisse (1999-...)
1108831521 Les journalistes, nouveaux acteurs des relations internationales
1090350310 Nouveautés sur bankai-anime

 

En conclusion, je ne suis pas sur qu'il s'agisse de la bonne piste, car contrairement à la recherche par similarité de mots clefs, les résultats sont plus aléatoires. Nous suivrons donc dans un épisode futur l'enrichissement de la base de similarité et les moyen d'y parvenir.

 

Par Torgan
Ecrire un commentaire - Voir les 3 commentaires
Mercredi 5 août 2009
Chez OB, on aime bien aggréger des données. Un blog qui parle tout seul d'un sujet dans son coin est toujours beaucoup moins séduisant qu'un blog qui échange et fait partie d'une communautés de blogs paralant de sujets connexes ou similaires. Pour ça, on retrouve le système de tags, les communautés OB avec leurs forums. Il y eut également les thématiques portail dans la version précédente du portail, ou les magazines et les dossiers dans le portail actuel. Tous ces concepts permettent de mettre en lumière un blog au sein de microcommunautés de la blogosphère.

Pour aller plus loin dans ce sens, nous menons actuellement des recherches afin d'être en mesure de pouvoir fournir, pour un article donné, une liste d'articles connexes, se rapportant au sujet traité.

Etant donné la quantité de données de texte, il est impossible de faire des recherches brutes dans le texte des articles de l'ensemble de la base de données. Alors comme souvent dans ce cas là, il faut tenter d'être plus malin que la machine, il faut sortir le PLAN B.

L'idée directrice de se plan B, c'est de considérer qu'un article est connexe à un autre si une recherche issue d'un moteur de recherche (google donc pour 95% des cas) a mené vers les deux articles. Alors bien sur, c'est très limitatif, mais après tout c'est un plan B. 

Ainsi, en traitant les logs de connexion aux blogs d'OB, on peut avoir chaque jour une liste des recherches ayant mené à un article d'OB. Si pour chaque article, on constitue un tableau des mots-clefs qui y ont conduit les internautes, on a une espèce de signature de l'article. En faisant des recherches de similarité entre les tableaux de mots clefs on devrait pouvoir obtenir les articles qui sont connexe.

Voici donc le plan B. Après avoir collecté les données pendant un peu plus d'un mois, il est donc temps de lancer quelques tests. Et quoi de mieux que le Top des articles les plus vus sur la dernière semaine pour tester la méthode ? On est certains d'avoir des articles souvent visités, et donc vraisemblablement recherchés. Allons-y !

Verdict : la méthode ne permet de découvrir des articles connexes que pour seuls 3 articles du Top 100 de la semaine. Pas vraiment glorieux, et bien en dessous du résultat escompté... Par contre, pour les 3 articles ayant donné des résultats, ces derniers semblent tout à fait pertinents. Par exemple :

Les aventures d'Harry Potter (1110364822)

id Titre
6021435 Critique Ciné : HARRY POTTER ET LA COUPE DE FEU de Mike Newell
1107447859 Evanna et Matthew, ensemble en Europe pour la promo d'Harry Potter 6
1092460414 Harry Potter and the Half-Blood Prince
1078565561 THE LIVING AND THE DEAD
1110519734 Cinéma : HARRY POTTER + fichiers patchwork, et oui...
1101706949 Prison break: The Final Break , le film
1101137616 [MU] [DVDRiP] L'Oeil du mal
1108003697 "Harry Potter" a explosé le box-office français...et américain
172012 Le dernier Harry Potter !
1080489350 Actus Ciné du 29 Janvier 2009

Conclusion : la méthode offre un taux de couverture trop réduit pour être réellement efficace. Et pour cause : en un mois, moins de 10% des articles d'overblog se sont vus attribué un tableau de mots-clef. Du coup avant même de faire un test de similarité, on a 9 chances sur 10 de tomber sur un article qui ne donnera aucun résultat. A l'évidence, les moteurs de recherche ne sont pas ce qui fait venir sur les blogs. Les internautes sont à mon avis plus guidés par les flux RSS des sites auxquels ils sont abonnés, et surtout maintenant, les réseaux sociaux, Facebook et Twitter en tête.

Un plan C s'impose donc ! 
Par Torgan
Ecrire un commentaire - Voir les 1 commentaires
Mardi 4 août 2009
Vous êtes sûrement coutumier du Top Blog d'Overblog, un classement des blogs de notre plateforme allant au delà du Blog Rank. Le Calcul a lieu tous les 15 jours et donne une assez bonne vision de notre blogosphère.

Mais les gens adorent les stats, alors après le classement des blogs, on m'a demandé de plancher sur une manière de calculer un classement des articles les plus lus. L'idée est d'avoir des statistiques fréquentes, sans avoir besoin de conserver l'information longtemps. En basant nos calculs sur une période d'une heure, s'ouvre la possibilité d'être capable de détecter assez rapidement des articles qui buzzent en cas de grandes différences sur le nombre de visites. En conservant les données de visites sur une semaine, on reste capable de suivre les articles ayant une définition plus encyclopédique, dont la durée de vie se prolonge dans le temps.

Les données sont prêtes à peu de choses près. Reste l'intégration sur le portail. A titre d'exemple, les 10 articles les plus visités lors de la dernière heure :

Titre Visiteurs uniques
Index des résumés 298
EN: Lamyaghri et Fegrouch dans la liste finale 239
'Cause I'm just a girl 234
Nick est mort 232
Lebhij: « Je n’ai pas quitté le MCO pour rien » 172
Pascal Angan et Lys Mouithys appelés en selection 166
Femme actuelle 117
Solitude 102
Vous avez un avis sur la fin du monde de 2012, exprimez-vous à la suite de ce message. 97
Mes vacances 1 94


Normalement bientôt sur le portail overblog !

Par Torgan
Ecrire un commentaire - Voir les 1 commentaires
Mercredi 24 janvier 2007
Over-blog sort en v2, bientôt, sous peu, on y est presque.

Reste quelques ajustements mineurs, mais c'est plaisant de voir qu'on touche au but ! Donc en attendant plus de migration sympatoches, attendez le portail qui ne saura tarder
Par Torgan
Ecrire un commentaire - Voir les 3 commentaires
 
Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus