Chamawix / scrapping_vdm

Petit programme de scrapping du site vdm
0 stars 0 forks source link

VDM Auto processing #3

Closed everron closed 6 years ago

everron commented 6 years ago

Bonjour, Merci pour ta réactivité, le code de collecte et de requétage semble fonctionner. Maintenant, pour aller plus loin dans le test, serait-il possible d'ajouter une analyse automatique des VDM portant sur le contenu de la VDM ? Libre à toi de choisir ce qui te semble pertinent. N’hésites pas à poser des questions dans cette issue afin que l’exercice soit le plus interactif possible.

Chamawix commented 6 years ago

Bonsoir, Concernant l'ajout de fonctionnalités au test/exercice, en ce qui concerne l'analyse automatique, c'est des informations de mon choix à extraire c'est ça? Par exemple un thème d'article (ça parle politique, vie quotidienne, autres, etc...), ou bien des catégories liées a la forme de l'article (article type "partage d'expérience", "best-of", "actualité").

Concernant l'évaluation de l'exercice et la suite du process, comment ca va se dérouler?

Le 3 octobre 2017 à 11:48, everron notifications@github.com a écrit :

Bonjour, Merci pour ta réactivité, le code de collecte et de requétage semble fonctionner. Maintenant, pour aller plus loin dans le test, serait-il possible d'ajouter une analyse automatique des VDM portant sur le contenu de la VDM ? Libre à toi de choisir ce qui te semble pertinent. N’hésites pas à poser des questions dans cette issue afin que l’exercice soit le plus interactif possible.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/Chamawix/scrapping_vdm/issues/3, or mute the thread https://github.com/notifications/unsubscribe-auth/AHaEh0sKLpXvjmgEilJwDqTAYp79mf4Fks5sogLpgaJpZM4Pr2i1 .

everron commented 6 years ago

Bonjour,

Concernant l'ajout de fonctionnalités au test/exercice, en ce qui concerne l'analyse automatique, c'est des informations de mon choix à extraire c'est ça? Par exemple un thème d'article (ça parle politique, vie quotidienne, autres, etc...), ou bien des catégories liées a la forme de l'article (article type "partage d'expérience", "best-of", "actualité").

C'est exactement ça, l'idée est d'enrichir le contenu des VDM avec ce qui te semble le plus porteur de valeur.

Concernant l'évaluation de l'exercice et la suite du process, comment ca va se dérouler?

La première partie de l'exercice évaluait tes capacités de programmation, cette deuxième partie se concentre sur l'évaluation de tes connaissances en data science/ machine learning. Si tu peux, en plus de tes scripts, fournir un document où tu expliques ta démarche, tes choix et l'impact business que ton analyse auto pourrait apporter au site VDM, ça nous permettrait d'avoir une vision plus globale de ton travail.

Chamawix commented 6 years ago

Bonsoir,

Je viens de créer une nouvelle branche du projet, dans laquelle se trouve le document de réflexion en ce qui concerne l'apprentissage automatique lié au site VDM, et son intérêt business.

Je suis en phase de recherche des variables actuellement, à extraire des articles de VDM, pour permettre l'aboutissement de la classification automatique d'articles plus génériques issus de réseaux sociaux. Donc, pas de dockerisation, et rien de probant en terme de résultats actuellement, mais les idées se posent. Je voulais vous montrer ma façon de construire un process de projet d'apprentissage.

Ici, vu la disponibilité de la data tagué, j'ai choisi de partir sur un apprentissage supervisé. Une difficulté / longueur de l'exercice va être de trouver le jeu de donnée test "réel" sur les réseaux sociaux, mais comme expliqué dans le doc d'analyse, je compte compléter ce jeu de donnée pour les premiers tests/résultats avec des VDMs extraites du site, on exploité dans la phase d'apprentissage, évidemment.

Par contre, je ne vais pas pouvoir avancer ni demain, ni ce weekend, puisqu'en finalisation de déménagement, pour (enfin!) arriver dans votre belle ville.

En vous souhaitant un bon vendredi et un bon weekend et dans l'attente de votre retour.

everron commented 6 years ago

Bonjour,

Merci pour le point sur tes avancées. J'ai lu ton document et j'ai testé ta branche, il y a juste une petite coquille dans ton classification.py :

web git:(vdm&process_auto) ✗ python classification.py
Traceback (most recent call last):
  File "classification.py", line 144, in <module>
    main()
  File "classification.py", line 126, in main
    file = codecs.open("vdm_unitaire.txt", "r", "utf-8")
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py", line 896, in open
    file = __builtin__.open(filename, mode, buffering)
IOError: [Errno 2] No such file or directory: 'vdm_unitaire.txt'

En changeant le chemin d'accès, ça fonctionne. Peux tu également ajouter les fichiers *.pyc dans ton .gitignore ?

Si j'ai bien compris, en l'état, ton programme renvoie le nombre de phrases et le nombre de mots de la dernière proposition de chaque VDM unitaire c'est bien ça ?

Chamawix commented 6 years ago

Bonjour,oui c'est bien ça, je regroupe les variables pour les associer ensuite dans un classifieur. c'est encore très work in progress cependant, et je dois regrouper les autres variables et lancer la batterie de test. Je mettrais à jour quand ça aura bien avancé ! -------- Message original --------Objet : Re: [Chamawix/scrapping_vdm] VDM Auto processing (#3)De : everron À : Chamawix/scrapping_vdm Cc : Chamawix ,Comment Bonjour, Merci pour le point sur tes avancées. J'ai lu ton document et j'ai testé ta branche, il y a juste une petite coquille dans ton classification.py : web git:(vdm&process_auto) ✗ python classification.py Traceback (most recent call last): File "classification.py", line 144, in main() File "classification.py", line 126, in main file = codecs.open("vdm_unitaire.txt", "r", "utf-8") File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py", line 896, in open file = builtin.open(filename, mode, buffering) IOError: [Errno 2] No such file or directory: 'vdm_unitaire.txt'

En changeant le chemin d'accès, ça fonctionne. Peux tu également ajouter les fichiers *.pyc dans ton .gitignore ? Si j'ai bien compris, en l'état, ton programme renvoie le nombre de phrases et le nombre de mots de la dernière proposition de chaque VDM unitaire c'est bien ça ?

—You are receiving this because you commented.Reply to this email directly, view it on GitHub, or mute the thread.

{"api_version":"1.0","publisher":{"api_key":"05dde50f1d1a384dd78767c55493e4bb","name":"GitHub"},"entity":{"external_key":"github/Chamawix/scrapping_vdm","title":"Chamawix/scrapping_vdm","subtitle":"GitHub repository","main_image_url":"https://cloud.githubusercontent.com/assets/143418/17495839/a5054eac-5d88-11e6-95fc-7290892c7bb5.png","avatar_image_url":"https://cloud.githubusercontent.com/assets/143418/15842166/7c72db34-2c0b-11e6-9aed-b52498112777.png","action":{"name":"Open in GitHub","url":"https://github.com/Chamawix/scrapping_vdm"}},"updates":{"snippets":[{"icon":"PERSON","message":"@everron in #3: Bonjour, \r\n\r\nMerci pour le point sur tes avancées. J'ai lu ton document et j'ai testé ta branche, il y a juste une petite coquille dans ton classification.py : \r\n\r\nweb git:(vdm\u0026process_auto) ✗ python classification.py\r\nTraceback (most recent call last):\r\n File \"classification.py\", line 144, in \u003cmodule\u003e\r\n main()\r\n File \"classification.py\", line 126, in main\r\n file = codecs.open(\"vdm_unitaire.txt\", \"r\", \"utf-8\")\r\n File \"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py\", line 896, in open\r\n file = __builtin__.open(filename, mode, buffering)\r\nIOError: [Errno 2] No such file or directory: 'vdm_unitaire.txt'\r\n\r\nEn changeant le chemin d'accès, ça fonctionne. Peux tu également ajouter les fichiers *.pyc dans ton .gitignore ?\r\n\r\nSi j'ai bien compris, en l'état, ton programme renvoie le nombre de phrases et le nombre de mots de la dernière proposition de chaque VDM unitaire c'est bien ça ?"}],"action":{"name":"View Issue","url":"https://github.com/Chamawix/scrapping_vdm/issues/3#issuecomment-335146201"}}}

Chamawix commented 6 years ago

Voila, j'ai pu mettre à jour la classification, actuellement, du fait de l'utilisation de treetagger, j'ai pas encore pu installer ce logiciel sous docker, du coup, j'ai mis en place une batterie training/testing pour que vous puissiez l'utiliser sans, juste en installant les requirements.txt.

J'ai utilisé les variables évaluées dans analyse_vdm: 1) Une identification de chute ou conclusion 2) Identification des thèmes majeurs liés à vdm (via une dico de synonyme adapté maison) 3) ratios lié aux phrases et aux nombres de propositions 4) étude de la sentimentalité des phrases (grâce à la base de donnée FEEL)

Pour le classifier, j'ai choisi un classifieur bayésien, de fait de la forme de donnée, de la classification assez rapide possible et de la possibilités d'extraire des données "négatives/non_vdm" rapidement, à partir de bases de données twitter politiques.

Les points d'améliorations possibles : J'ai étudié les monogrammes dans cet algo, on pourrait se pencher sur les bi-gram & plus pour mieux détecter la sentimentalité, et les thèmes.

Si vous avez des questions, n'hésitez pas à venir vers moi.

everron commented 6 years ago

Bonjour Maximilien et merci pour la mise à jour.

J'arrive à faire tourner sans problèmes le script classification.py avec le preprocessing précalculé. Étant sur macOs, je n'arrive pas à utiliser le TreeTagger (ou alors en passant par ce wrapper python http://treetaggerwrapper.readthedocs.io/en/latest/# ? )mais ça ne m'a pas empêcher de parcourir ton code.

Concernant le choix et les performances de l'algorithme quels étaient les scores de précision et de rappel que tu as obtenus via ce process ?

Chamawix commented 6 years ago

Bonjour,

Concernant treetagger : Comme vous l'avez vu, j'utilise un wrapper que j'ai inclus dans le code. Treetaggerwrapper ne fonctionnait pas sur mon ordinateur non plus alors que la commande treetagger fonctionnait, et il nécessite aussi une installation de treetagger. J'ai modifié un peu, d'ailleurs, le code du wrapper pour le faire fonctionner chez moi (il utilise la commande "tag-french").

Concernant le choix de l'algo : j'avais effectué l'évaluation des différents classifieur rapidement dans testing_classifier, et j'ai sélectionné le classifieur le plus approprié avec ces petits test rapides. La plupart de mes test se sont soldés par le même résultat : les classifieurs avaient tendance à tout classifier en classe 1 (non intéressant). Ce qui est assez normal, vu que la classe 0 est plus petite que la classe 1. J'ai fais aussi évolué les variables en fonctions des tests, pour en extraire le plus d'information possible. Le premier classifieur évalué était un simple arbre de décision que j'ai ensuite changé en random forest. Je suis ensuite passé au réseau de neurone, mais malheureusement, la quantité d'information n'est pas suffisante pour avoir des résultats intéressant avec ce classifieur. Le temps de preprocess long, a cause du pos_tagging de treetagger, est une contrainte que je n'avais pas vu au départ. J'ai finalement décidé de partir sur un classifieur bayésien au vu de la quantité d'exemple disponible et de son efficacité dans mes premieres evaluations.

Voici l'évaluation du classifieur sur le jeu de donnée test fourni :

Evaluation

naive bayesian : matrice de confusion : [[ 6 4] [ 7 19]] Precision/Rappel/F0.5 score/F1Score : [0.82608695652173914, 0.73076923076923073, array([ 0.48387097, 0.80508475]), array([ 0.52173913, 0.7755102 ])]

Analyse du résultat :

On a un recall de presque 50% pour une précision de 60% pour la classe 0 (classé comme intéressant) ce qui nous amène à la première et simple analyse : il y a encore une marge de progression :D Maintenant, pour aller plus dans le détail, on voit qu'il y a plusieurs difficultés quand on regarde les tweets retournés comme positifs (True Pos & False Pos) et les tweets retournés négatifs et étant positifs (False Nag).

Certains long tweet d'information contiennent en fait plusieurs tweets unitaires, que je n'ai pas traité en pré-process, dans les FP, on voit que la plupart contiennent effectivement une information de nature négative :
Corbiere et Raquel Garrido n’ont pas quitte leur HLM et s'en justifient vertu, poil au cul. Fiona : la defense quitte l'audience au stade d'Amiens : des "anomalies" constatees dans la fixation des barrieres #AFP cause d’un bug, l’enceinte #Google Home Mini enregistrait tout en permanence #IoT en Californie: «Des cendres et des os» relire notre article sur l'interdiction des vehicules les plus polluants 3 ans, #Paris a realise 6000 chantiers dans ses #ecoles pour des conditions d'apprentissage et d'enseignement op… Macron en interview dimanche soir sur TF1 appelle-t-on la phobie du #vendredi13 ?Le quiz des @decodeurs @Figaro_Etudiant: Une soiree #DSK organisee par des etudiants en kine fait scandale @vmonfort: Rdv demain a partir de 9h pour les rencontres de l orientation du @Figaro_Etudiant avec @cadremploi @Keljob et @Viadeo https:…RT @AFPphoto: PICTURES OF THE WEEK (07-13 October) #AFP que LoL est down je vous balance une video d'une game solide contre un champion chiant.

La scission de ces informations en parcelles unitaires pourraient améliorer les résultats du classifieur. Si on retire ces long tweet, la taille pourrait devenir un facteur plus discriminant, et être une règle de pre-processing, pour que le classifieur s'attarde uniquement à l'analyse de tweet "court"/type unitaire.

Certains tweet & VDM unitaires ne cible pas l'auteur et sont des descriptions de situations négatives. Voila un exemple Faux Negatif : Avant 30 ans, tu sors du jeudi au samedi et t'es en forme le lundi. Après 30 ans, tu sors juste le samedi et t'es mort jusqu'au jeudi. L'auteur utilise ici un tu général, que je n'ai pas détecté comme un pronom ciblant un groupe incluant l'auteur (je, nous, oui, mais pas tu). L'inclure risque de fausser des résultats pour d'autres tweets qui utilisent le "tu" comme une façon de désigner une autre personne.

Ensuite, l'augmentation du volume d'entrainement en prenant plus de temps de pre-process pourrait permettre à d'autres algorithmes (Neural network) de fonctionner. L'idée est de trouver un classifieur proposant peut être une précision similaire, mais avec un recall plus bas : moins aura de Faux positif, plus le résultat sera fin et intéressant. Rater des vdm est moins important que de proposer des suggestions intéressantes ici.

Enfin, on peut aller plus loin dans les variables : l'analyse des bi-gram et + pourrait aussi apporter une information supplémentaire & plus précise pour chaque tweet.

Bien sur, il y aura toujours des erreurs dans l'état actuel des choses, notamment lié à l'imprécision des informations rajoutées lors du pré-process : le dico de synonyme n'est pas à 100% précis, pareil pour le treetagger, et la base de donnée FEEL. On pourra, a plus long terme, améliorer la classification/tagging des ces outils pour minimiser les erreurs dans notre classifieur par la suite.

J'aimerai savoir, concernant la suite du process de discussion/évaluation, pourrions nous organiser un rendez-vous pour discuter de tout ça? Je suis maintenant sur Nantes, et je suis disponible jusqu'a vendredi (exclus).

everron commented 6 years ago

Bonjour, merci de ta réponse complète.

Il y a beaucoup de choses intéressantes dans ton approche et ta réflexion. Pour la suite de l'évaluation tu as pris les devants mais nous allions effectivement te proposer de nous rencontrer dans les prochains jours :). Une personne de notre équipe RH va bientôt t'envoyer un mail pour arrêter la date qui te conviendra le mieux.

Ce sera l'occasion de reparler entre autre du test et de tes motivations.

Bonne journée

EDIT : Pour info, mon adresse : emmanuel.verron@iadvize.com

Chamawix commented 6 years ago

Merci pour les retours et réponses rapides :)Très bien pour le débrief, c'est parfait pour moi. Bonne journée à vous aussi et à très vite. -------- Message original --------Objet : Re: [Chamawix/scrapping_vdm] VDM Auto processing (#3)De : everron À : Chamawix/scrapping_vdm Cc : Chamawix ,Comment Bonjour, merci de ta réponse complète. Il y a beaucoup de choses intéressantes dans ton approche et ta réflexion. Pour la suite de l'évaluation tu as pris les devants mais nous allions effectivement te proposer de nous rencontrer dans les prochains jours :). Une personne de notre équipe RH va bientôt t'envoyer un mail pour arrêter la date qui te conviendra le mieux. Ce sera l'occasion de reparler entre autre du test et de tes motivations. Bonne journée

—You are receiving this because you commented.Reply to this email directly, view it on GitHub, or mute the thread.

{"api_version":"1.0","publisher":{"api_key":"05dde50f1d1a384dd78767c55493e4bb","name":"GitHub"},"entity":{"external_key":"github/Chamawix/scrapping_vdm","title":"Chamawix/scrapping_vdm","subtitle":"GitHub repository","main_image_url":"https://cloud.githubusercontent.com/assets/143418/17495839/a5054eac-5d88-11e6-95fc-7290892c7bb5.png","avatar_image_url":"https://cloud.githubusercontent.com/assets/143418/15842166/7c72db34-2c0b-11e6-9aed-b52498112777.png","action":{"name":"Open in GitHub","url":"https://github.com/Chamawix/scrapping_vdm"}},"updates":{"snippets":[{"icon":"PERSON","message":"@everron in #3: Bonjour, merci de ta réponse complète. \r\n\r\nIl y a beaucoup de choses intéressantes dans ton approche et ta réflexion. Pour la suite de l'évaluation tu as pris les devants mais nous allions effectivement te proposer de nous rencontrer dans les prochains jours :). Une personne de notre équipe RH va bientôt t'envoyer un mail pour arrêter la date qui te conviendra le mieux. \r\n\r\nCe sera l'occasion de reparler entre autre du test et de tes motivations.\r\n\r\nBonne journée"}],"action":{"name":"View Issue","url":"https://github.com/Chamawix/scrapping_vdm/issues/3#issuecomment-337173235"}}}