/PySTKE

Python Slides and Transcriptions Keywords Extractor

Primary LanguagePython

PySTKE

Python Slides and Transcriptions Keywords Extractor. Outil d'extraction de mots clés dans des diaporamas et des transcriptions de la parole. Formats supportés pour les diaporamas et transcriptions :

  • .pptx
  • .tex
  • .odp
  • .stm
  • .txt

Table des matières

Contenu du projet

  • Le répertoire 'corpus' contient tous les fichiers que PySTKE produit lors de son exécution. C'est dans ce répertoire que vous retrouverez le détail des mots clés annotés automatiquement.
  • Le répertoire 'PASTEL' contient tous les fichiers d'exemple. (Supports de cours et transcriptions de la parole) C'est aussi dans ce répertoire que vous trouverez mes annotations manuelles de ces supports de cours et transcriptions de la parole.
  • Le répertoire 'Doc' contient mon rapport de stage et mon support de présentation qui vous apporteront des informations complémentaires.

Pour commencer

Ces instructions vont vous permettre d'obtenir une copie du projet et de le lancer sur votre machine locale. PySTKE nécessite Python2.7 ET Python3 d'installé sur votre machine pour fonctionner.

Installation

Vous pouvez télécharger les sources du projet via GitHub (https://github.com/MGoulley/PySTKE) et l'installer ou bon vous semble sur votre machine.

Dependances

Ce projet requiert les dépendances suivantes :

openpyxl 2.5.3 https://openpyxl.readthedocs.io/en/stable/
PyPDF2 1.26.0 https://pythonhosted.org/PyPDF2/
pke https://github.com/boudinfl/pke
nltk https://www.nltk.org/install.html
numpy https://www.nltk.org/install.html
exide https://github.com/Codophile1/exide
pyrata https://github.com/nicolashernandez/PyRATA
scipy https://www.scipy.org/install.html
networkx https://networkx.github.io/documentation/stable/install.html
sklearn http://scikit-learn.org/stable/install.html
unidecode https://pypi.org/project/Unidecode/
future http://python-future.org/quickstart.html

Que vous pouvez installer avec :

sudo pip install openpyxl PyPDF2 nltk numpy pyrata scipy networkx sklearn unidecode future
sudo pip3 install openpyxl PyPDF2 nltk numpy pyrata scipy networkx sklearn unidecode future

Si vous avez un soucis d'installation avec pip, vous pouvez installer les dépendances avec :

sudo apt-get install python-openpyxl
sudo apt-get install python3-openpyxl
sudo apt-get install python-numpy
sudo apt-get install python-pypdf2
...

Installer PKE

Il vous faudra installer PKE via la commande:

sudo pip install git+https://github.com/boudinfl/pke.git

Installer Exide

Il faudra aussi installer Exide :

sudo pip install git+https://github.com/Codophile1/exide

Les options de lancement

Voici la liste des arguments disponibles au lancement de PySTKE.

usage: main.py [-h] [-d DOC] [-t [TOOL]] [-r [REF]] [--unique [UNIQUE]] [--count [COUNT]]

Extracteur automatique de mots clés

optional arguments:
  -h, --help            show this help message and exit
  -d DOC, --doc DOC     Chemin vers le document à annoter automatiquement
  -t [TOOL], --tool [TOOL] Outil à utiliser pour extraire les mots clés: pke, pyrata, mixt, wikifier (defaut pyrata)
  -r [REF], --ref [REF] Chemin vers le document d'annotation manuelle à comparer avec l'extraction automatique
  --unique [UNIQUE]     Compare par mots clés uniques dans le document. (Par diapositive par default)
  --count [COUNT]       Ajoute des détails sur les expressions annotées manuellement

Le document '-d' doit être au format:

  • .pptx, .tex ou .odp pour un diaporama
  • .txt ou .stm pour une transcription de la parole Le document '-r' doit être au format .xlsx.

Les méthodes d'extractions

  • PKE[pke] : Fonctionne avec la fréquence des mots dans le texte.
  • PyRATA[pyrata] : Utilise des patrons syntaxique pour extraire des mots clés.
  • Mixt[mixt] : Combine PKE et PyRATA.
  • Wikifier[wikifier] : Utilise l'outil Wikifier (http://wikifier.org/) pour extraire des mots clés.

Effectuer les tests

La commande suivante permet d'extraire les mots clés contenus dans un diaporama:

~/PySTKE$ python3 main.py -d PASTEL/supports/2014_Bourdon_Introduction_informatique.pdf

Par defaut, PySTKE utilise PyRATA pour extraire des mots clés. Si vous souhaitez utiliser un autre outil, il faut utiliser l'option '-t' ou '--tool' :

#Extraction à l'aide de PKE :
~/PySTKE$ python3 main.py -d PASTEL/supports/2014_Bourdon_Introduction_informatique.pdf -t pke
#Extraction à l'aide de PyRATA :
~/PySTKE$ python3 main.py -d PASTEL/supports/2014_Bourdon_Introduction_informatique.pdf -t pyrata
#Extraction à l'aide de Mixt :
~/PySTKE$ python3 main.py -d PASTEL/supports/2014_Bourdon_Introduction_informatique.pdf -t mixt
#Extraction à l'aide de Wikifier :
~/PySTKE$ python3 main.py -d PASTEL/supports/2014_Bourdon_Introduction_informatique.pdf -t wikifier

Si l'on souhaite comparer une annotation automatique avec une annotation manuelle, il faut ajouter l'option '-r' ou '--ref' suivi du chemin vers le document contenant les mots clés relevés automatiquement (format .xlsx). Cela nous produit alors un affichage de ce type :

~/PySTKE$ python3 main.py -d PASTEL/supports/2014_Bourdon_Introduction_informatique.pdf -r PASTEL/annotation_manuelle/2014_Bourdon_Introduction_informatique.xlsx
Nombre d'éléments annotés manuellement : 83
Nombre d'éléments annotés automatiquement : 287
Il y a 23 matchs, 280 erreurs, 23 approximations.
Méthode de résolution & Précision & Rappel & F-Score //
Avec Approximation & 0.160 & 0.554 & 0.249 //
Sans Approximation & 0.080 & 0.277 & 0.124 //

Vous pouvez remarquer que, ici, nous n'avons pas spécifier l'option '-t', nous avons donc extrait des mots clés avec l'outil PyRATA. Si je souhaite avoir plus de détail sur mon annotation manuelle, je peux utiliser '--count'

~/PySTKE$ python3 main.py -d PASTEL/supports/2014_Bourdon_Introduction_informatique.pdf -r PASTEL/annotation_manuelle/2014_Bourdon_Introduction_informatique.xlsx --count
Nombre d'éléments annotés manuellement : 83
Nombre d'éléments annotés automatiquement : 287
Il y a 23 matchs, 280 erreurs, 23 approximations.
Méthode de résolution & Précision & Rappel & F-Score //
Avec Approximation & 0.160 & 0.554 & 0.249 //
Sans Approximation & 0.080 & 0.277 & 0.124 //
Il y a dans ce document 3201 mots.
Vous avez annoté manuellement 164 mots.
Cela représente 5.123%% de mots annotés.

Par defaut, PySTKE compare le fichier d'annotation automatique et le fichier d'annotation manuelle par mots clés par diapositive. Si on veut les comparer par l'ensemble des mots clés unique dans les deux fichiers, il faut utiliser l'option '--unique'.

~/PySTKE$ python3 main.py -d PASTEL/supports/2014_Bourdon_Introduction_informatique.pdf -r PASTEL/annotation_manuelle/2014_Bourdon_Introduction_informatique.xlsx --unique
Nombre d'éléments annotés manuellement : 57
Nombre d'éléments annotés automatiquement : 81
Il y a 13 matchs, 82 erreurs, 20 approximations.
Méthode de résolution & Précision & Rappel & F-Score //
Avec Approximation & 0.407 & 0.579 & 0.478 //
Sans Approximation & 0.160 & 0.228 & 0.188 //

Pour les transcriptions, on peut utiliser les mêmes options que précédemment. Par exemple, pour extraire les mots clés d'une transcription avec l'outil 'mixt', on utilise la commande :

python3 main.py -d PASTEL/supports/2014_Bourdon_Introduction_algorithmique.stm -t mixt

Pour les transcriptions, il n'est pour l'instant pas possible de les comparer par diapositive, on est alors obligé d'utiliser le mot clé '--unique' pour comparer une annotation automatique d'une transcription avec l'annotation manuelle.

python3 main.py -d PASTEL/supports/2014_Bourdon_Introduction_algorithmique.stm -r PASTEL/annotation_manuelle/2014_Bourdon_Introduction_algorithmique_transcription.xlsx -t pke --unique
Nombre d'éléments annotés manuellement : 26
Nombre d'éléments annotés automatiquement : 70
Il y a 2 matchs, 80 erreurs, 7 approximations.
Méthode de résolution & Précision & Rappel & F-Score //
Avec Approximation & 0.129 & 0.346 & 0.187 //
Sans Approximation & 0.029 & 0.077 & 0.042 //

Exécution indépendante

Si vous vous sentez bricoleur dans l'âme, PySTKE permet d'exécuter toutes les taches indépendamment les unes des autres.

Extraction de texte

  • Pour transformer un diaporama (PDF) en texte brute :
python extract_pdf.py path_to_pdf_file.pdf path_to_result_folder

(Pour un utilisateur non avertis, il faut laisser "path_to_result_folder"="/corpus/")

  • Pour transformer un diaporama (Source) en texte brute :
python extract_src.py path_to_pdf_file.pptx path_to_result_folder
  • Pour transformer une transcription en texte brute :
python extract_transcription.py path_to_pdf_file.stm path_to_result_folder

Par exemple, je veux extraire le texte de mon fichier '2013_Daille_Langage_naturel.pptx' dans mon dossier de travail '/corpus/', j'utilise alors la commande :

python extract_src.py PASTEL/supports/2013_Daille_Langage_naturel.pptx /corpus/

Vous obtiendrez alors un fichier "/corpus/2013_Daille_Langage_naturel.txt" qui contiendra le texte extrait de votre diaporama.

Extraction de mots clés

On suppose dans cette partie que vous possédez déja un fichier texte (sinon cf: Extraction de texte).

  • Pour extraire des mots clés d'un document text avec PKE, il faut utiliser la commande :
python3 txt_to_kw_pke.py path_to_raw_text.txt
  • Pour extraire des mots clés d'un document text avec PyRATA, il faut utiliser la commande :
python3 txt_to_kw_pyrata.py path_to_raw_text.txt
  • Pour extraire des mots clés d'un document text avec Mixt, il faut utiliser la commande :
python3 txt_to_kw_mixt.py path_to_raw_text.txt
  • Pour extraire des mots clés d'un document text avec Wikifier, il faut utiliser la commande :
python3 txt_to_kw_wikifier.py path_to_raw_text.txt

Par exemple, je souhaite extraire les mots clés de mon texte "2013_Daille_Langage_naturel.txt" avec l'outil PyRATA. J'utilise alors la commande :

python3 txt_to_kw_pyrata.py /corpus/2013_Daille_Langage_naturel.txt

Cela me produira alors un fichier nommé "2013_Daille_Langage_naturel_kw.txt" dans mon répertoire "/corpus/". Ce fichier contient tous les mots clés uniques extrait par PyRATA.

Alignement de mots clés par diapositive

On suppose dans cette partie que vous possédez un fichier texte contenant des mots clés (sinon cf: Extraction de mots clés).

  • Je possède une liste de mots clés extrait de mon diaporama PDF, j'utilise la commande suivante :
python3 pdf_kw_export_excel.py path_to_keywords_file_kw.txt path_to_pdf_file.pdf
  • Je possède une liste de mots clés extrait de mon diaporama source, j'utilise la commande suivante :
python3 src_kw_export_excel.py path_to_keywords_file_kw.txt path_to_src_file.pptx
  • Je possède une liste de mots clés extrait de ma transcription, j'utilise la commande suivante :
python3 transcription_kw_export_excel.py path_to_keywords_file_kw.txt path_to_transcription_file.stm

(Pour le moment, les mots clés extraits d'une transcription se retrouvent tous sur la diapositive numéro 1. C'est ce fichier qu'il faudra modifier pour prendre en compte les timer des diapositive)

Par exemple, je possède mon fichier de mots clés extrait de mon diaporama source "2013_Daille_Langage_naturel_kw.txt" et mon diaporama source "2013_Daille_Langage_naturel.pptx", j'utilise la commande :

python3 src_kw_export_excel.py /corpus/2013_Daille_Langage_naturel_kw.txt PASTEL/supports/2013_Daille_Langage_naturel.pptx

Récupérer les mots clés uniques

On suppose ici qu'on dispose d'un fichier (tableur) d'annotation par diapositive (automatique ou manuelle) et on souhaite en extraire les mots clés uniques. Pour cela il suffit d'utiliser la commande:

python excel_to_unique_keywords.py path_to_table_file.xslx mon_extension

Cela va alors créer un fichier qui va contenir tous les mots clés uniques contenus dans le tableur qui portera l'extension que vous lui avez donné en paramètre.

Par exemple, avec la commande :

python excel_to_unique_keywords.py /PASTEL/annotation_manuelle/2013_Daille_Langage_naturel.xlsx _unique_ref.xlsx

On récupère le résultat dans un fichier "/corpus/2013_Daille_Langage_naturel_unique_ref.xlsx".

Comparaison d'annotation

Pour cette étape on suppose que l'on possède deux fichiers d'annotation. Il est possible de comparer :

  • Annotation manuelle vs Annotation manuelle
  • Annotation automatique vs Annotation automatique
  • Annotation manuelle vs Annotation automatique
  • Annotation automatique vs Annotation manuelle

Deux méthodes pour comparer des annotation :

  • Par Diapositive
  • Par mots clés uniques

Pour comparer par diapositive, il faut utiliser la commande :

python excel_comp.py path_to_first_file.xlsx path_to_second_file.xlsx

Cela produira alors un fichier de résultat .xlsx dans le répertoire "/corpus/".

Pour comparer par mots clés uniques, il faut dans un premier temps retirer tous les doublons. Pour cela, il faut exécuter les deux commandes suivante :

python excel_to_unique_keywords.py path_to_first_file.xlsx _unique_ref.xlsx
python excel_to_unique_keywords.py path_to_second_file.xlsx _unique_comp.xlsx

On créer ici deux nouveaux fichiers qui contient nos mots clés uniques. Il seront enregistrer dans le répertoire "/corpus/". Pour finir, on compare ces deux fichiers avec la commande :

python excel_comp.py /corpus/first_file_unique_ref.xlsx /corpus/second_file_unique_comp.xlsx

Créer son extracteur de mots clés

Vous pouvez créer votre propre extracteur de mots clés utilisable avec cet outil. Il suffit de créer un fichier Python dans le dossier comportant le programme principal, avec ce nom :

txt_to_kw_XXX.py

Ou XXX est le nom de votre outil d'extraction de mots clés. Vous pouvez ensuite l'utiliser avec la commande :

python3 main.py -d directory/file.pdf -t XXX

Voici un template de ce fichier :

import os
import sys

def save_keywords_to_file(keywords_table):
    # Write keywords line by line in txt file
    base = os.path.basename(path_to_raw_text_file)
    filename = os.path.splitext(base)[0]
    work_dir = os.getcwd() + "/corpus/"
    keywords_file_path = work_dir + filename + "_kw.txt"

    file = open(keywords_file_path,"wb")
    try:
        for keyword in keywords_table:
            file.write(keyword.encode('utf-8') + b"\n")
    except NameError:
        pass
    file.close()

# The first arg is a path to the extracted raw text file from the source or the PDF
path_to_raw_text_file = sys.argv[1]

# some stuff
# which extract
# keywords ...

# store all the extacted keywords by passing a table wich contain all extracted keywords
save_keywords_to_file(keywords_table)

Vous récupérez en premier argument (sys.argv[1]) le chemin vers le fichier texte à étudier pour extraire les mots clés. Vous pouvez ensuite appliquer nimporte quelle méthode pour extraire les mots clés. Pour finir, la fonction 'save_keywords_to_file()' permet d'enregistrer un fichier résultat contenant vos mots clés extraits avec par votre méthode à partir d'un tableau de mots clés donné en paramètre.

Annotation manuelle

Un fichier d'annotation manuelle se présente toujours sous la forme d'un tableur composé de deux colonnes. La première contient le numéro de la diapositive et la seconde contient le mot clé relevé par l'annotateur sur la diapositive.

Numéro Diapositive Mot clé
1 Informatique
1 Algorithme
2 Variable
3 Algorithme

Vous pouvez trouver des exemples de ces fichiers dans le répertoire '~/PySTKE/PASTEL/annotation_manuelle/'.

Problèmes observables

Voici des pistes d'amélioration pour l'outil PySTKE.

Extraction de texte

J'ai manuellement réorganisé le fichier texte extrait du cours "2013_Eveillard_Boite_noire_genomique". Avec PyRATA on extrait les mots clés avec les commandes suivantes :

# Avec
python3 txt_to_kw_pyrata.py corpus/2013_Eveillard_Boite_noire_genomique.txt
python3 txt_to_kw_pyrata.py PASTEL/non_classable/2013_Eveillard_Boite_noire_genomique_clean.txt

Si on compare ces deux annotation automatiques, on obtient :

python3 transcription_kw_export_excel.py corpus/2013_Eveillard_Boite_noire_genomique_clean_kw.txt /home/matthias/PySTKE/PASTEL/non_classable/2013_Eveillard_Boite_noire_genomique_clean.txt
python3 transcription_kw_export_excel.py corpus/2013_Eveillard_Boite_noire_genomique_kw.txt corpus/2013_Eveillard_Boite_noire_genomique.txt

(On utilise "transcription_kw_export_excel.py" car cela nous permet de ne pas prendre en compte les diapositives pour l'alignement des mots clés)

Si on compare maintenant nos deux annotations automatiques avec notre annotation manuelle nous obtenons :

# Avec extraction manuelle
python excel_comp.py PASTEL/annotation_manuelle/2013_Eveillard_Boite_noire_genomique.xlsx corpus/2013_Eveillard_Boite_noire_genomique_clean.xlsx
Nombre d'éléments annotés manuellement : 47
Nombre d'éléments annotés automatiquement : 46
Il y a 1 matchs, 91 erreurs, 0 approximations.
Méthode de résolution & Précision & Rappel & F-Score //
Avec Approximation & 0.022 & 0.021 & 0.022 //
Sans Approximation & 0.022 & 0.021 & 0.022 //

# Avec extraction automatique
python excel_comp.py PASTEL/annotation_manuelle/2013_Eveillard_Boite_noire_genomique.xlsx corpus/2013_Eveillard_Boite_noire_genomique.xlsx
Nombre d'éléments annotés manuellement : 47
Nombre d'éléments annotés automatiquement : 50
Il y a 1 matchs, 95 erreurs, 0 approximations.
Méthode de résolution & Précision & Rappel & F-Score //
Avec Approximation & 0.020 & 0.021 & 0.021 //
Sans Approximation & 0.020 & 0.021 & 0.021 //

Le rappel reste le même mais la précision augmente. Aucun terme n'est ajouté mais certain sont retirés. Cela est donc du au POS TAGGING. On peut donc en conclure qu'une meilleure extraction du texte peut permettre d'augmenter la qualité des résultats.

POS TAGGING

Avec notre outil, il est difficile d'évaluer l'influence du POS TAGGING sur nos résultats. Cependant, le POS TAGGING est présent dans tous nos outil d'extraction de mots clés et représente un point important pour extraire des mots clés. Il est certain qu'un POS TAGGING parfait améliorerait aussi nos résultats.

Calcul de la saillance (Not Working Well Yet)

Il est possible d'injecter des mots clés et de calculer leurs saillance dans un document. Pour réaliser ce calcul, il faut disposer de la fréquence des expressions dans un document (cf https://github.com/boudinfl/pke#document-frequency-counts). Voici une commande qui permet de faire cela :

python compute_document_frequency.py corpus/ corpus/2014_Bourdon_Introduction_informatique_frequency.gz

On suppose que l'on a déjà extrait le fichier "2014_Bourdon_Introduction_informatique.txt" dans le dossier corpus. (Il est possible d'extraire plusieurs fichier ".txt" en même temps) On passe donc en premier paramètre l'adresse du fichier qui contient tous les documents que l'on veut étudier. Le second paramètre correspond au nom du fichier, et à sa location, qui sera produit par le processus. Voici un exemple de ce fichier que vous allez obtenir : (cf https://github.com/boudinfl/pke#document-frequency-counts)

--NB_DOC--  100
greedi alloc  1
sinc trial structur 1
complex question  1
[...]

Une fois ce fichier obtenu, nous allons pouvoir calculer la saillance de ces expressions.

python candidates_to_saliency.py corpus/2014_Bourdon_Introduction_informatique.txt corpus/2014_Bourdon_Introduction_informatique_frequency.gz

On obtient alors :

puissance  364.0
puissance vaut  108.0
les  69.0
résultat  27.0
restituer  25.0
restituer le  25.0
restituer le résultat  25.0
le résultat  25.0
algorithmes  24.0

Auteur

  • Matthias Goulley - Contact : mattgoulley@gmail.com Pour obtenir des informations complémentaires, vous pouvez consulter mon rapport de stage et mon support de présentation situés dans le répertoire '/doc'.

References

Je remercie ces outils qui m'ont aidés pour ce projet.

Exide

https://github.com/Codophile1/exide

Python Keyphrase Extractor

https://github.com/boudinfl/pke (Florian Boudin)

Python Rule-based feAture sTructure Analysis

https://github.com/nicolashernandez/PyRATA (Nicolas Hernandez)