Annotation morphosyntaxiques des donées extraites.
J'utilise 2 parser pour la réalisation de cette étape :
TreeTagger annotant uniquement en POS et en lemme
Et UDpipe, pouvant annoter également en relation de dépendance, et à un niveau morphologique plus fin.
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
UDpipe
#Chargement d'un modèle udpipe via spacy_udpipe
udpipe = spacy_udpipe.load("fr-sequoia")
#Augmentation de la longueur maximale du document en sortie (certaines rubriques pouvant être trop longues)
udpipe.max_length=10000000
#fonction de nettoyage ne prenant que le contenu textuel des fichiers, c'est utile pour l'annotation
def clean_txt(fichier,reg):
with open(fichier,"r",encoding="UTF-8") as f:
doc="".join(f.readlines())
clean=""
for m in re.finditer(reg,doc):
t=m.group(1)
d=m.group(2)
clean+=f'{t}\n{d}\n'
return clean
#fonction de parsing, renvoyant un fichier annoté en un pseudo format conll gardant unique forme, lemme et POS séparés par des tabulations
def analyse_txt(texte):
doc = udpipe(texte)
result = ""
for token in doc:
result += f"{token.text}\t{token.lemma_}\t{token.pos_}\n"
return result
TreeTagger(simili)
#J'ai simplement mis au format xml la sortie de spacy_udpipe
def token2xml(token):
return f'{token.pos_}{token.lemma_}{token.text} \n'
#même fonction de parsing que précédemment renvoyant une sortie xml
def analyse_xml(texte):
doc = udpipe(texte)
result = ""
for token in doc:
result += token2xml(token)
return result
Programme
def bao2(fichier,reg):
texte=clean_txt(fichier,reg)
txt=analyse_txt(texte)
xml=analyse_xml(texte)
with open("analyse_BAO2.txt","w",encoding="UTF-8") as out:
out.write(txt)
with open("analyse_BAO2.xml","w",encoding="UTF-8") as out:
out.write(xml)
return txt,xml
if __name__ == "__main__":
#regex dépendant du fichier en entrée, celle-ci fonctionne avec le fichier xml
regex_item = re.compile("<item>\n<titre>(.*?)</titre>\n<description>(.*?)</description>\n</item>\n")
fichier=sys.argv[1]
bao2(fichier,regex_item)
python3 bao2.py extraction_BAO1.xml
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
TreeTagger
#etiquettage par TreeTagger, utilisant un executable lancé grâce à la fonction system
sub etiquettageTT {
system("./bazar/tree-tagger-linux-3.2.4/bin/tree-tagger -lemma -token -no-unknown -sgml ./bazar/tree-tagger-linux-3.2.4/french-utf8.par pre-corpus-titre-description.xml > corpus-titre-description");
system("perl ./bazar/tree-tagger-linux-3.2.4/treetagger2xml-utf8.pl corpus-titre-description UTF8")
#fonction mettant un mot par ligne. Traitement nécessaire pour l'annotation par TreeTagger
sub segmentation {
my @tok = ();
$/=undef; # par défaut cette variable contient \n
open my $tmp2,">:encoding(UTF-8)","toto2.txt";
close $tmp2;
foreach my $var (@_) {
#ecriture des données textuelles dans un fichier TOTO
#Tokeniser TOTO
#Recuperer TOTO en données textuelles
open my $tmp,">:encoding(UTF-8)","toto.txt";
print $tmp "$var";
close $tmp;
system("./bazar/tokenise-utf8.pl toto.txt toto2.txt > toto2.txt");
open my $tmp2,"<:encoding(UTF-8)","toto2.txt";
my $var_tok=<$tmp2>;
close $tmp2;
push @tok, $var_tok;
}
return @tok;
UDpipe
#etiquettage par UDpipe, utilisant un executable lancé grâce à la fonction system
sub etiquettageUP {
system("./bazar/udpipe-1.2.0-bin/bin-win64/udpipe.exe --tokenize --tag --parse --tokenizer=presegmented ./bazar/udpipe-1.2.0-bin/modeles/french-sequoia-ud-2.5-191206.udpipe pre-corpus-titre-description.txt > corpus-titre-description.udpipe")
perl bao2.pl Arbo Rubrique