Commit a8896d89 authored by Bertrand Goupil's avatar Bertrand Goupil

Merge branch 'dev' into 'master'

Wapiti memory leak fix

See merge request !6
parents d863ccd8 63f0e1b5
......@@ -25,6 +25,7 @@
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path=".apt_generated">
......@@ -32,5 +33,11 @@
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path=".apt_generated_tests">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>
......@@ -30,6 +30,11 @@
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.springframework.ide.eclipse.boot.validation.springbootbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
......
......@@ -10,4 +10,5 @@ org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.processAnnotations=enabled
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.8
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="limsiSourceExtractor">
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/.apt_generated"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/.apt_generated_tests"/>
<property name="java-output-path" value="/Limsi-SourceExtractor/target/classes"/>
<property name="context-root" value="limsiSourceExtractor"/>
</wb-module>
</project-modules>
boot.validation.initialized=true
eclipse.preferences.version=1
FROM frolvlad/alpine-java:jdk8-slim
MAINTAINER Duc Cao (tien-duc.cao@inria.fr)
RUN apk add maven
RUN apk add --no-cache gcc musl-dev
RUN apk add make
RUN mkdir /default
WORKDIR /default
COPY pom.xml pom.xml
COPY lib lib
RUN mvn dependency:go-offline -B
RUN mkdir data
COPY src src
COPY run.sh run.sh
COPY resources resources
COPY wapiti-1.5.0 wapiti-1.5.0
RUN mvn clean install
RUN cd /default/wapiti-1.5.0 && make wapiti && cp wapiti /default/lib
ENTRYPOINT ["/bin/sh", "run.sh"]
This tool was originally created in summer 2016 by Gabriel Bellard and Xavier Tannier, at LIMSI-CNRS, Orsay, France.
Code contributors:
- Gabriel Bellard (main contributor)
- Xavier Tannier (contact)
Thanks to the annotators:
- Dominique Ferrandini
- Samuel Laurent
- Daniel Oudet
- Denis Teyssou
Thanks to Christophe Boumenot that helped us with the Windows Wapiti library.
Auteur : Gabriel BELLARD, Stagiaire, LIMSI MAI/JUILLET 2016
INTRODUCTION
------------------------------
Ce document est un guide complet pour la bonne utilisation et compréhension de l'application.
L'application SourceExtractor permet de prendre un fichier texte en entrée qui sera converti en une sortie JSON ou BRAT
incluant toutes les sources (primaires et secondaires) de ce texte avec une gestion des coréférences en guise d'annotation.
Il y a deux versions du programme, une pour linux et une pour windows.
La version de Linux contient toutes les options alors que la version de Windows ne contient que la dernière fonction (voir ci dessous).
INSTALLATION
------------------------------
Télécharger l'archive
Décompresser l'archive
Se déplacer dans SourceExtractorLinux/ ou SourceExtractorWindows/
Se déplacer dans app/
Lancer l'application avec les commandes java -jar SourceExtractorLINUX.jar ou java -jar SourcesExtractorWindows.jar
Configurer les dossiers
Enjoy
COMMENT UTILISER LE PROGRAMME
------------------------------
Le programme est simple à utiliser en ligne de commande :
PREMIERE UTILISATION :
java -jar SourcesExtractor(OS).jar -c => Demande de dossier DATA puis demande de dossier TOOLS
Dans mon archive DATA = Corpus/ et TOOLS = Outils/
DEJA PARAMETRE
java -jar SourcesExtractor(OS).jar -l | -u io | bio | ann [-t brat] [-m]
java -jar SourcesExtractor(OS).jar -f <file> [-t brat] [-m]
Les librairies se trouvent dans un dossier à côté du .jar.
Les différentes options sont les suivantes :
-c : Permet de changer les dossiers de DATA pour placer les données et TOOLS pour les librairies et modèles.
Soit on lance pour la première fois l'application et on est obligé de rentrer un dossier, soit on le modifie avec cette option.
-l <encoding ou ann> [-t brat] [-m] : Permet de lancer la phase d'apprentissage et la phase de test sur des fichiers déjà annotés.
Nous utilisons cette option pour vérifier que notre système fonctionne correctement.
Il prend en entrée un nombre n de fichiers annotés, les divise en 3 catégories (train, dev, test)
à hauteur de 75%, 15%, 10% respectivement en les transformant dans l'encoding utilisé en argument
de l'option, lance la phase d'entrainement puis la phase de test, transforme les nouveaux fichiers
en JSON ou BRAT.
S'ensuit une annotation automatique des sources par rapport aux sujets présents dans le texte.
ATTENTION LE MODELE EST MODIFIE A CHAQUE LANCER (IL SERA IDENTIQUE SI LES LES FICHIERS ET COLONNES (B)IO SONT IDENTIQUES)
-l io => si on veut un encoding en io,
-l bio => si on veut un encoding en bio,
-l ann => si on veut seulement annoter les sujets et coréférences des sources obtenues (on doit préalablement
avoir fait une option au-dessus pour avoir les fichiers de sorties adéquats)
-t brat => change la sortie JSON par défaut en sortie BRAT.
Un script fourni en annexe lance BratEval et compare les résultats obtenus pour les sources trouvées
par rapport aux fichiers de référence puis écrit les scores obtenus en rappel et précision dans un
fichier de sortie selon l'encoding utilisé.
-u <encoding ou ann> [-t brat] [-m] : Permet de lancer la phase d'apprentissage sur des fichiers annotés et lancer la phase de test sur des fichiers non annotés.
Nous utilisons cette option pour vérifier que notre système fonctionne et reste cohérent avec des fichiers non annotés.
Le programme prend en entrée un nombre n1 de fichiers non annotés et un nombre n de fichiers annotés.
Il divise n en 2 catégories (train, dev) à hauteur de 90%, 10% respectivement en les transformant dans l'encoding utilisé en argument
de l'option et prend tous les fichiers non annotés pour la phase de test en les transformant, eux-aussi, selon l'encoding utilisé en argument.
La phase d'entrainement est lancée puis la phase de test et finalement transforme les nouveaux fichiers non annotés en JSON ou en BRAT.
S'ensuit une annotation automatique des sources par rapport aux sujets présents dans le texte.
ATTENTION LE MODELE EST MODIFIE A CHAQUE LANCER (IL SERA IDENTIQUE SI LES LES FICHIERS ET COLONNES (B)IO SONT IDENTIQUES)
-u io => si on veut un encoding en io,
-u bio => si on veut un encoding en bio,
-u ann => si on veut seulement annoter les sujets et coréférences des sources obtenues (on doit préalablement
avoir fait une option au-dessus pour avoir les fichiers de sorties adéquats)
-f <file> [-bio] [-t brat] [-m] : Permet de lancer uniquement une phase de test sur un fichier .txt mis en argument.
Le fichier sera transformé en format (B)IO selon l'encoding de l'argument de l'option et ne contiendra que des O sur les dernières colonnes (aucune source annotée).
Nous chargeons un modèle sauvegardé correspondant à l'encoding et lançons la phase de test sur ce fichier.
S'ensuit une annotation automatique des sources par rapport aux sujets présents dans le texte.
-f filename.txt => charge le modèle io et annote le fichier filename.txt,
-bio => charge le modèle bio et annote le fichier filename.txt,
-t brat : Change la sortie JSON par défaut en sortie BRAT.
-m : Permet de désactiver la recherche de médias dans les textes. Temps de chargement en moins et surtout permet de faire fonctionner la version windows !
(du moins sur ma machine peut-être que j'ai un problème de buffer car le programme s'arrête sans aucune erreur... Il ne va pas jusqu'au bout)
ATTENTION LA VERSION WINDOWS NE PEUT QUE FAIRE LA FONCTION FINALE -f !! PAS DE GENERATION DE MODELE SOUS WINDOWS !! DLL EN 64 BITS !!
SPECIFICITE
------------------------------
- COMMENT AJOUTER UNE COLONNE AU CRF :
* Tout d'abord il faut changer le nombre de colonnes.
Deux variables à modifier :
- private static final int numberFieldsPrim = 10;
- private static final int numberFieldsSec = 11;
* Ensuite il faut ajouter dans parseText la colonne correspondant à ce que l'on veut faire.
- Modifier seulement le if (!onlyOffset) { sentenceResult.append(A MODIFIER) }
* Dans la fonction tagFromMaltParserAndParseText, il faut modifier l'accès aux colonnes dans le String[] parsed = parsedTextLine.split("\\s+");
* Modifier dans FeatureSet :
- Le constructeur,
- Le toString(),
- La construction myText = new FeatureSet() dans tagFromMaltParserAndParseText
- COMMENT EST GEREE L'ANNOTATION POUR LES SOURCES PRIMAIRES ET POUR LES SOURCES SECONDAIRES :
Lorsque nous transformons les fichiers en format (B)IO, nous gardons 2 colonnes à la fin pour annoter les SOURCE-SEC sur la dernière colonne et les SOURCE-PRIM sur l'avant-dernière colonne.
Pour l'entrainement des SOURCE-PRIM, nous supprimons la dernière colonne qui contient les SOURCE-SEC et nous lançons l'apprentissage.
Pour l'entrainement des SOURCE-SEC nous ajoutons au pattern du CRF la colonne des SOURCE-PRIM car une SOURCE-SEC n'est jamais présente sans SOURCE-PRIM.
- QUELS PATTERNS UTILISONS-NOUS :
Nous utilisons deux patterns différents selon si souhaite entrainer les sources primaires ou les sources secondaires.
Pour les sources primaires :
- Colonne UNIGRAM : word, PoS, lemma, isTrigger, isProf, QM, isMedia, mix_col
- Colonne TRIGRAM : word, PoS, lemma, isTrigger, mix_col, isSuj, isSujTrigger
Pour les sources secondaires :
- Colonne UNIGRAM : PoS, isTrigger, isProf, isMedia, SOURCE-PRIM
- Colonne TRIGRAM : PoS, isTrigger, isMedia, mix_col, isSuj, isSujTrigger, SOURCE-PRIM
Plusieurs tests ont été faits (et il va falloir en faire encore), les résultats ont montré qu'ajouter un BIGRAM donnait de moins bons résultats en général.
- QUE SONT LES MERGED FILES :
Les "merged files" sont utilisés pour la phase d'entrainement (les fichiers de tests assemblés "ne servent à rien"). Nous regroupons tous les fichiers de train et de dev
ensemble pour que Wapiti entraine un modèle sur un long corpus.
- ALGORITHME DES COREFERENCES :
Faire pour les 3 TreeMap SubjectOffsets, profAndTriggerSecondaryOffsets et pronounsOffsets :
Enregistrer tous les mots de la source
(1)Si tous les mots de la source sont un nom de profession et que ce nom a déjà annoté en tant que source
Alors annoter à cette source le même sujet qu'à ce nom déjà annoté
Sinon
Si le premier mot d'une source n'est pas article indéterminé
| Alors int bestSubjectIndex = -1
| Parcourir tous les offsets des sujets potentiels de la map en cours
| Si l'offset du sujet potentiel < l'offset de la source en cours (un annote un sujet à une souce seulement si le sujet arrive avant la source)
| | Alors enregistrer tous les mots du sujet
| | Boolean contain = true
| | int countNumberOfSharedWords = 0
| | Parcourir tous les mots de la source en omettant les PERSON_ABBR et les stopwords
| | Si le sujet potentiel ne contient pas le mot en cours
| | Alors contain = false
| | Sinon
| | countNumberOfSharedWords++
| | Parcourir tous les mots du sujet potentiel
| | Si le tokenSubject en cours n'est pas un stopword
| | | Alors Parcourir tous les mots de la source
| | | Si le tokenSource en cours n'est pas un stopword
| | | Alors Si tokenSubject = tokenSource et tokenSubject n'est pas un PERSON_ABBR
| | | | Si tokenSource est un NPP et que le sujet potentiel contient lui aussi un NPP
| | | | | Alors Si contain
| | | | | bestSubjectIndex = le sujet potentiel
| | | | Sinon Si tokenSource est un mot de profession
| | | | | Alors Si contain et countNumberOfSharedWords > 1
| | | | | Alors Si l'offset du sujet potentiel != l'offset de la source
| | | | | | bestSubjectIndex = le sujet potentiel
| | | | | | Sinon Si l'offset du sujet potentiel = l'offset de la source et que la source contient un NPP
| | | | | | Alors bestSubjectIndex = le sujet potentiel = la source elle-même car NPP
| | | | | | Sinon
| | | | | | bestSubjectIndex = le dernier sujet rencontré avant cette source s'il existe
| | | | | Sinon Si contain et countNumberOfSharedWords = 1
| | | | | Alors Si un sujet précédent cette source existe
| | | | | Alors Si le sujet est dans la liste des sujets
| | | | | | Alors si le sujet précédent n'est pas la source elle-même
| | | | | | Alors bestSubjectIndex = le sujet précédent
| | | | | | Sinon Si un dernier sujet de cette ma rencontré avant cette source existe
| | | | | | Alors bestSubjectIndex = le dernier sujet rencontré
| | | | | | On annote ce sujet en tant que nom de profession, il sert à (1)
| | | | | Sinon Si le sujet est dans la liste des professions trouvées
| | | | | Alors si le sujet précédent n'est pas la source elle-même
| | | | | Alors bestSubjectIndex = le sujet précédent
| | | | | Sinon Si un dernier sujet de cette ma rencontré avant cette source existe
| | | | | Alors bestSubjectIndex = le dernier sujet rencontré
| | | | Sinon Si tokenSource est un pronom
| | | | | Alors Si un dernier sujet existe et que c'est un nom de profession
| | | | | Alors bestSubjectIndex = le dernier sujet rencontré
| | | | | Sinon
| | | | | On cherche le dernier sujet avant la source
| | | | Sinon Si tokenSource est un nom de personne (homme, femme, enfant...)
| | | | Alors si le sujet précédent n'est pas la source elle-même
| | | | Alors bestSubjectIndex = le sujet précédent
| | | | Sinon Si un dernier sujet de cette ma rencontré avant cette source existe
| | | | Alors bestSubjectIndex = le dernier sujet rencontré
| | | Sinon Si tokenSource contient un pronom
| | | Alors Si un dernier sujet existe
| | | Alors bestSubjectIndex = le dernier sujet rencontré
| | | Sinon On cherche dans la liste des professions
| | Si on est dans la liste des sujets
| | on enregistre le dernier sujet rencontré
| Si un meilleur sujet pour cette source existe
| Alors si ce sujet a déjà été utilisé pour une autre source
| Alors on annote la source avec le sujet de l'autre source
| Sinon
| on annote le sujet pour cette source
Sinon Si la source commence par un article indéterminé
Alors c'est une source anonyme
CONTENU & LIBRAIRIES
------------------------------
- LIBRAIRIES :
Nous utilisons diverses librairies que nous allons détailler ici. Elles se trouvent dans le dossier CitationExtractor_lib.
Ces librairies contiennent aussi des ressources utiles à la bonne utilisation du logiciel.
* Stanford :
JAR : stanford-corenlp-3.6.0.jar, stanford-french-corenlp-2016-01-14-models.jar, hfst-ol.jar, slf4j-api.jar, slf4j-simple.jar
RESSOURCES : lemmatizer-ressources/ (contenant plusieurs listes utiles Stanford/lemmatizer-ressources/dictionaries/fr) et ressources/
* commons-collections4-4.1 :
JAR : commons-cli-1.3.1.jar et commons-collections4-4.1.jar
* GROBID :
JAR : grobid-core-0.4.1-SNAPSHOT.jar
* JSON :
JAR : java-json.jar
* MaltParser :
JAR : maltparser-1.9.0.jar
RESSOURCES : MaltParser/model/ contient un modèle fremalt-1.7.mco de la langue française pour l'analyse syntaxique
* wapiti_java :
JAR : wapiti_java/Wapiti-master/src/swig/wapiti-1.5.0.jar
RESSOURCES : wapiti_java/Wapiti-master/build avec la librairie compilée pour linux libwapiti.so et celles pour windows libwapiti.dll et libwapiti_swig.dll.
- DOSSIERS PRESENTS :
Dans cette partie je vais énoncer quel dossier correspond à quelle étape de l'application. Surtout utile pour se retrouver dans la phase d'apprentissage pour pouvoir suivre
la transformation des fichiers au fil de l'avancée.
LINUX :
root = data_dir
LABELED = root/labeled
=> On trouve dans LABELED les dossiers suivants :
. input_labeled : comme son nom l'indique, on rentre tous les fichiers annotés dans celui-ci.
. input_labeled_converted : ce dossier contiendra les fichiers .ann transformés pour n'avoir que les SOURCE-PRIM et SOURCE-SEC.
. input_labeled_mp : ce dossier contiendra les fichiers .conll transformés après l'analyse syntaxique de MaltParser.
OUTPUT_LABELED = LABELED/output_labeled
=> On trouve dans le dossier OUTPUT_LABELED les dossiers suivants :
. train_prim, train_sec, dev_prim, dev_sec, test_prim, test_sec : Fichier (B)IO transformés par rapport aux sources et offsets.
RESULT_LABELED = LABELED/result_labeled
=> On trouve dans le dossier RESULT_LABELED les dossiers suivants :
. bioWapiti_prim : les fichiers de sorties de wapiti .wapiti pour les sources primaires.
. bioWapiti_sec : les fichiers de sorties de wapiti .wapiti pour les sources secondaires.
. brat_autoWapiti : les fichiers de transformation des fichiers .wapiti en format BRAT .ann ET JSON .json_temp
. brat_ref : les fichiers de références de sources pour les comparer avec les résultats .ann.
. brat_ref_ajout_annotator : les fichiers transformés en .json et .ann avec l'ajout des annotations de coréférences.
. merged_files : tous les fichiers de sortie (B)IO assemblés pour pouvoir faire l'entrainement et le test pour wapiti.
. models : les modèles (pour prim et sec) qui s'écrivent après l'entrainement et utilisés pour la phase de test.
. result : les résultats de l'évaluation de BratEval
. /pattern_prim.txt : le template de pattern pour l'apprentissage des sources primaires.
. /pattern_sec.txt : le template de pattern pour l'apprentissage des sources secondaires.
UNLABELED = root/unlabeled
=> On trouve les mêmes dossiers que LABELED
FINAL = root/final
=> On trouve dans FINAL les dossiers suivants :
. input : les fichiers que je veux convertir.
. models : IMPORTANT contient les meilleurs modèles obtenus ! NE PAS LES EFFACER.
. output : les fichiers de sortie (le fichier de sortie est configuré pour être dans root/final/output/ alors que l'input est n'importe quel fichier).
RESULTATS A RETROUVER
------------------------------
AFP SEULEMENT
510 files
test (39):
afp.com-20150201T122209Z-TX-PAR-TVD26
afp.com-20151206T112542Z-TX-PAR-GEY94
afp.com-20151213T145323Z-TX-PAR-GUL86
afp.com-20151228T164632Z-TX-PAR-HSV30
afp.com-20151228T210444Z-TX-PAR-HTE47
afp.com-20160101T051525Z-TX-PAR-HXH85
afp.com-20160102T151732Z-TX-PAR-HYK74
afp.com-20160102T235505Z-TX-PAR-HYV91
afp.com-20160103T153701Z-TX-PAR-HZK62 BIO AFP FALSE :
afp.com-20160107T095336Z-TX-PAR-IGM12 Summary
afp.com-20160301T124801Z-TX-PAR-MNH54 TP FP FN Precision Recall F1
afp.com-20160301T193359Z-TX-PAR-MOF25 SOURCE-PRIM 157 16 43 0,9075 0,7850 0,8418
afp.com-20160302T181029Z-TX-PAR-MQK36 SOURCE-SEC 16 4 10 0,8000 0,6154 0,6957
afp.com-20160303T152730Z-TX-PAR-MSK37 Overall 173 20 53 0,8964 0,7655 0,8258
afp.com-20160305T081657Z-TX-PAR-MVW94
afp.com-20160305T145220Z-TX-PAR-MWI65
afp.com-20160307T221243Z-TX-PAR-NAO79
afp.com-20160308T081459Z-TX-PAR-NBB10 IO AFP FALSE :
afp.com-20160308T083306Z-TX-PAR-NBB66 Summary
afp.com-20160404T074249Z-TX-PAR-PBH62 TP FP FN Precision Recall F1
afp.com-20160408T143218Z-TX-PAR-PKP36 SOURCE-PRIM 158 22 43 0,8778 0,7861 0,8294
afp.com-20160408T203030Z-TX-PAR-PLK63 SOURCE-SEC 18 4 8 0,8182 0,6923 0,7500
afp.com-20160409T151212Z-TX-PAR-PMH31 Overall 176 26 51 0,8713 0,7753 0,8205
afp.com-20160405T191011Z-TX-PAR-PEW28
afp.com-20160302T201335Z-TX-PAR-MQS38
afp.com-20160405T192315Z-TX-PAR-PEW80
afp.com-20160406T142824Z-TX-PAR-PGI09
afp.com-20160407T005304Z-TX-PAR-PHI82
afp.com-20160407T185241Z-TX-PAR-PJC09
afp.com-20160408T124247Z-TX-PAR-PKI77
afp.com-20160303T114511Z-TX-PAR-MRW54
afp.com-20160308T083630Z-TX-PAR-NBB75
afp.com-20160308T104556Z-TX-PAR-NBH76
afp.com-20160309T081343Z-TX-PAR-NDH33
afp.com-20160309T125102Z-TX-PAR-NDU84
afp.com-20160310T010019Z-TX-PAR-NFB49
afp.com-20160310T111810Z-TX-PAR-NFS24
afp.com-20160401T101654Z-TX-PAR-OWS80
afp.com-20160402T061303Z-TX-PAR-OYI44
AFP + WEB
698 files
test (55):
20160106_02f4e570b3472de17bd65b7e11d39d1f.tag
20160202_058366bc34749ff88c69e2aa9cb98426.tag
afp.com-20151206T112542Z-TX-PAR-GEY94.tag
afp.com-20160303T114511Z-TX-PAR-MRW54.tag
afp.com-20160310T111810Z-TX-PAR-NFS24.tag
20160106_f356ae9c5a46a918d80a4c22768bbab0.tag
20160202_80be3bcbdeb1d92b729317390fbdbefe.tag IO AFP + WEB FALSE :
afp.com-20151213T145323Z-TX-PAR-GUL86.tag Summary
afp.com-20160303T152730Z-TX-PAR-MSK37.tag TP FP FN Precision Recall F1
afp.com-20160401T101654Z-TX-PAR-OWS80.tag SOURCE-PRIM 203 26 74 0,8865 0,7329 0,8024
20160108_5d371d359dc75ecc539151798ac6e214.tag SOURCE-SEC 11 7 22 0,6111 0,3333 0,4314
20160202_92892bda024e1d3d373bbf8b85a0f5a0.tag Overall 214 33 96 0,8664 0,6903 0,7684
afp.com-20151228T164632Z-TX-PAR-HSV30.tag
afp.com-20160305T081657Z-TX-PAR-MVW94.tag
afp.com-20160402T061303Z-TX-PAR-OYI44.tag
20160112_4d7fd6746c2d713a6e3f610d0ee76ba2.tag
20160202_d2c59e8f1d37268664a405f98227228e.tag
afp.com-20151228T210444Z-TX-PAR-HTE47.tag
afp.com-20160305T145220Z-TX-PAR-MWI65.tag
afp.com-20160404T074249Z-TX-PAR-PBH62.tag
20160112_529c39d4d93b067f17e420e4905447d9.tag
20160203_844e8bdd633c7a84b7f048cbd1f892fc.tag
afp.com-20160101T051525Z-TX-PAR-HXH85.tag
afp.com-20160308T081459Z-TX-PAR-NBB10.tag
afp.com-20160405T191011Z-TX-PAR-PEW28.tag BIO AFP + WEB FALSE :
20160115_318c2de3ba442701fc427bc59526329f.tag Summary
20160203_a9555cf46661505709846ecd5997b652.tag TP FP FN Precision Recall F1
afp.com-20160102T151732Z-TX-PAR-HYK74.tag SOURCE-PRIM 209 21 69 0,9087 0,7518 0,8228
afp.com-20160308T083306Z-TX-PAR-NBB66.tag SOURCE-SEC 7 0 26 1,0000 0,2121 0,3500
afp.com-20160405T192315Z-TX-PAR-PEW80.tag Overall 216 21 95 0,9114 0,6945 0,7883
20160115_dc89ecc80d3b722d7675714517d346d8.tag
20160203_d7f472ee3c703f652c476088f17c705e.tag
afp.com-20160103T153701Z-TX-PAR-HZK62.tag
afp.com-20160308T083630Z-TX-PAR-NBB75.tag
afp.com-20160406T142824Z-TX-PAR-PGI09.tag
20160127_3577bf63e3c4efebfc135a2176ea7f3b.tag
20160204_893f2f857f52f8126c369b3c73aa51c0.tag
afp.com-20160107T095336Z-TX-PAR-IGM12.tag
afp.com-20160308T104556Z-TX-PAR-NBH76.tag
afp.com-20160407T005304Z-TX-PAR-PHI82.tag
20160127_9e8bacbcb17e10afa275ed0676fca292.tag
20160204_eba5c36feccb3ca4d8d8a2eb3801bf86.tag
afp.com-20160301T193359Z-TX-PAR-MOF25.tag
afp.com-20160309T081343Z-TX-PAR-NDH33.tag
afp.com-20160407T185241Z-TX-PAR-PJC09.tag
20160127_b0cb9bc083ec9283d04931d2f248eaf7.tag
20160327_a166436d01a33e64ab157b37bd442874.tag
afp.com-20160302T181029Z-TX-PAR-MQK36.tag
afp.com-20160309T125102Z-TX-PAR-NDU84.tag
afp.com-20160408T124247Z-TX-PAR-PKI77.tag
20160128_3e69b65d217949814f9a9be66f637bec.tag
20160327_dad1e8e0bc0705190f9d5216e2c1cf16.tag
afp.com-20160302T201335Z-TX-PAR-MQS38.tag
afp.com-20160310T010019Z-TX-PAR-NFB49.tag
afp.com-20160409T151212Z-TX-PAR-PMH31.tag
FUTUR
------------------------------
- EVALUATION CORREFERENCES :
Nous n'avons pas eu le temps d'évaluer les coréférences obtenues.
Dans SourceExtractor/SourcesExtractorLinux/dir/Outils/normalizeBratRef, il y a un script perl normalizeBratReferenceRelations.pl qui permet de corriger l'annotation manuelle
des coréférences sur Brat.
- DBPEDIA et ENTITY LINKING :
Nous avons essayé de mettre DBPEDIA pour faire de l'entity linking mais les résultats n'étaient pas excellents, ou du moins cela ne menait à rien d'interressant lors de notre
implémentation.
Dans le dossier ANNEXES/DBPEDIA se trouvent tous les fichiers utiles pour réintégrer Dbpedia dans le code (SaxParser). Il y a une ancienne version du code
qui l'intègre à peu près réutilisable.
- PATTERN POUR WAPITI :
Les pattern utilisés sont peut-être à modifier pour avoir de meilleurs résultats (ou de moins bons...). Cela prend du temps !
- SOURCES SECONDAIRE :
Il faudrait essayer d'enlever toutes les phrases qui ne contiennent pas de sources primaire pour l'entrainement des sources secondaire.
- MEDIAS :
Trouver une solution efficace pour charger la liste des médias pour ne pas perdre 2 min à chaque début de script.
- APPLICATION SUR DOSSIER :
Il faudrait permettre de lancer l'application sur des dossiers contenant des fichiers .txt. Attention beaucoup de code à modifier, ce n'est pas "simple".
Le code prend en compte cette future modification car les fonctions qui lisent un fichier regardent d'abord si c'est isFile() ou isDirectory().
- CODE :
Evidemment on pourrait simplifier le code et le rendre orienté objet (sortie BRAT, JSON, ...).
Améliorer et réduction de l'algorithme pour les coréférences. Cela marche pas mal mais il y a surement des réductions à faire.
- WINDOWS ET LINUX :
Réussir à faire une seule application.
J'ai été bloqué car je me suis retrouver avec deux .jar qui contenaient les mêmes packages (fr.limsi.wapiti) mais pas les mêmes classes / méthodes à l'intérieur de chacun.
J'ai essayé d'utiliser un ClassLoader mais je me retrouvais toujours avec les méthodes du .jar déjà intégrées.
J'ai essayé d'utiliser deux ClassLoader mais j'ai une classe qui extends une classe se trouvant dans un .jar et je n'ai pas trouvé / eu le temps de
chercher comment faire pour étendre une classe issue d'un ClassLoader.
J'ai essayé jarjar qui permet de modifier les noms de packages à l'intérieur d'un .jar compilé (il modifie les package dans les .class) mais on se retrouvait
avec un UnsatisfiedLinkedError d'une fonction native.
Pour tous problèmes ou questions, je reste entièrement joignable par mail : gabriel.bellard@gmail.com
\ No newline at end of file
license to be defined
Software created by Gabriel Bellard and Xavier Tannier at LIMSI.
Please do not reuse or fork without permision (until we have defined the distribution license).
# Source Extractor (in French only)
**SourceExtractor** is a [CRF](https://en.wikipedia.org/wiki/Conditional_random_field)-based tool for extracting primary and secondary sources from news articles in French.
It detects primary sources, secondary sources, performs coreference resolution on sources, and detects anonymous sources. It can produce Brat format for visualization or JSON format for a machine-readable output.
## Requirements
* **java 8+**
* On Windows, give java at least 1 Gb memory: *java -Xmx1g*
* Extensively tested on **Linux**, tested on **Windows**, untested on **Mac** (but the necessary Wapiti native library is loaded).
If you need to recompile Max and Windows libraries, see https://github.com/kermitt2/Wapiti
## Installation
The archive contains the following files and directories:
- `sourceextractor.jar`
- `config.properties`: edit this file with links to the `lib` and `resources` directory on your computer (see below)
- `lib`: contains external librairies and saved models.
Install this directory wherever you want and
edit the `LIB_DIR` property in the configuration file
- `resources`: contains the language-dependent resources for the system
Install this directory wherever you want and
edit the `RESOURCES_DIR` property in the configuration file
- `code`: the source code
- `LICENSE.txt`: the license file
- `README.md`: this file
- `RESULTS.txt`: the results obtained on an annotated test set by the different models
- `AUTHORS.txt`
## Example usage:
The command is similar on Windows or Linux/MAC, except that a different Wapiti jar must be loaded. Wapiti jars are located in directory `lib/wapiti`. [Wapiti](https://wapiti.limsi.fr/) is the tool used for learning and running the CRF model.
**Linux/MAC**
`java -Xmx1g -cp lib/jar/*:lib/jar/wapiti/wapiti-1.5.0-lin.jar:source-extractor-0.1.jar fr.limsi.sourceExtractor.SourceExtractor -d <INPUT DIR> -o <OUTPUT DIR> -c <CONFIGURATION FILE> -j <THREAD NUMBER>`
**Windows**
`java -Xrs -Xmx1g -cp lib\jar\*;lib\jar\wapiti\wapiti-1.5.0-win.jar;source-extractor-0.1.jar fr.limsi.sourceExtractor.SourceExtractor -d <INPUT DIR> -o <OUTPUT DIR> -c <CONFIGURATION FILE> -j <THREAD NUMBER>`
### Input:
* can be a file (`-f`) or a directory (`-d`) containing documents (for convience notation only, we can actually feed a file or a directory with both -f and -d).
* Default input is textual documents. Use option `-newsml` for NewsML files. (Actually the option -newsml accepts any XML document which content is in <p> elements)
### Output:
* `-o <DIR>` specifies the output directory
* default output format is JSON. Use option `-b` or `--brat` for a [Brat](http://brat.nlplab.org/) output
* See a description of the JSON output below
### Configuration file:
`config.properties` must be edited with the following information:
* `LIB_DIR` = <path to the directory 'lib' downloaded with the distribution
* `RESOURCES_DIR` = <path to the directory 'resources' downloaded with the distribution
* `DATA_DIR` is only necessary for training purpose, there is no need to set it properly in production mode.
## Want a faster process?
* Multi-threading:
Default is single threading. Use `-j N` for using N threads.
* No secondary sources.
Use option `-p` to cancel the extraction of secondary sources. Both loading phase and process will be (much) faster. Loading phase will skip the huge list of media names and process phase will skip the Wapiti extraction of secondary sources.
## License & Co
### License
See the file `LICENSE.txt`
### Third-party librairies and licenses
See the file `THIRD-PARTY.txt`
## Technical details
### JSON output format
Here is what a JSON output looks like
```javascript
{"source_sentences":[
{"text":"Il a affirmé mardi devant les juges de la CPI n'être responsable d'\"aucune goutte de sang\" versée lors des violences ayant déchiré la Côte d'Ivoire en 2010-2011.",
"sources":[
{"start":635, // start offset of the source in the entire document
"end":637, // end offset of the source in the entire document
"type":"SOURCE-PRIM", // type (SOURCE-PRIM or SOURCE-SEC)
"text":"Il", // text
"value":"Charles Blé Goudé, le ministre de la Jeunesse de l'ancien président ivoirien Laurent Gbagbo", // normalized value (after coreference resolution)
"indexed_value":"Charles Blé Goudé" // normalized value for indexing (a shorter version of the normalized value, where ambiguity on several names inis removed when it exists). Indexing for further research should be done on this field.
}
...
]
}
...
]}
```
### Training set
Want to compare or reproduce our results? Ask us for our training set, that can be shared under conditions.
### Adapting to other languages
You'll need:
* To annotate a training set (about 300 documents -- 2000 sources -- seems to be a good number)
* To build a few resources (citation verbs, profession list, etc.)
* To have a dependency parser in your language, and ideally a lemmatizer
Contact us if you are interested!
AFP documents only (total 255 documents, 75% train, 10% dev, 15% test)
- BIO, with media list and secondary sources
Summary
TP FP FN Precision Recall F1
SOURCE-PRIM 167 15 68 0,9176 0,7106 0,8010
SOURCE-SEC 16 2 17 0,8889 0,4848 0,6275
Overall 183 17 85 0,9150 0,6828 0,7821
- BIO without media list and secondary sources
Summary
TP FP FN Precision Recall F1
SOURCE-PRIM 167 14 67 0,9227 0,7137 0,8048
SOURCE-SEC 0 0 33 0,0000 0,0000 0,0000
Overall 167 14 100 0,9227 0,6255 0,7455
- IO, with media list and secondary sources
Summary
TP FP FN Precision Recall F1
SOURCE-PRIM 174 16 60 0,9158 0,7436 0,8208
SOURCE-SEC 13 0 20 1,0000 0,3939 0,5652
Overall 187 16 80 0,9212 0,7004 0,7957
- IO, without media list and secondary sources
Summary
TP FP FN Precision Recall F1
SOURCE-PRIM 172 16 62 0,9149 0,7350 0,8152
SOURCE-SEC 0 0 33 0,0000 0,0000 0,0000
Overall 172 16 95 0,9149 0,6442 0,7560
AFP+Web documents (total 363 documents, 75% train, 10% dev, 15% test)
- BIO, with media list and secondary sources
Summary
TP FP FN Precision Recall F1
SOURCE-PRIM 256 28 68 0,9014 0,7901 0,8421
SOURCE-SEC 28 2 22 0,9333 0,5600 0,7000
Overall 284 30 90 0,9045 0,7594 0,8256
- BIO, without media list and secondary sources
Summary
TP FP FN Precision Recall F1
SOURCE-PRIM 256 28 68 0,9014 0,7901 0,8421
SOURCE-SEC 0 0 50 0,0000 0,0000 0,0000
Overall 256 28 118 0,9014 0,6845 0,7781