author | tags |
---|---|
emchateau |
julia, nlp |
La plupart des applications de l’analyse de texte reposent sur un nombre limité de concepts ou de procédures clefs telles que la concordance, la fréquence des mots, l’annotation ou l’étiquetage, la collocation, la classification de texte, l’analyse des sentiments ou l’extraction d’entité, ou encore les modèles thématiques. Ce tutoriel introduit l’analyse de texte en examinant chancune de ces méthodes dans le contexte des sciences historiques.
Ce tutoriel est basé sur le langage de programmation Julia. Le langage est relativement nouveau par rapport à ses concurrents comme Python ou R. Toutefois, il nous semble qu’il présente plusieurs avantages pour le domaine des humanités nuémriques. Si vous êtes nouvelle ou nouveau dans ce langage ou ne l’avez pas déjà installé, vous pouvez trouver des introductions aux liens suivants.
- Guides pour débuter avec Julia @todo
- Bibliographie de base sur l’analyse de texte @todo
Les paquets nécessaires pour travailler seront indiqués au fur et à mesure de ce tutoriel.
Chaîne de traitements de traitement automatique de la langue possible
- tokenisation (tokenizer)
- étiquetage POS (tagger)
- analyse syntaxique (parser)
- détection d’entités nommées (ner)
- lemmatisation
- (catégorisation de texte word embedding)
- Usage de modèles statistiques (méthodes neuronales)
- Intégration possible de modèles tiers (PyTorch ou TensorFlow)
Voir le manuel de Julia pour les chaînes de charactères (Strings) https://docs.julialang.org/en/v1/manual/strings/
Exemple : travail avec le jeu de données de Spam
df = CSV.read("spam_dataset.csv", DataFrames.DataFrame)
first(df, 10) |> pretty
TextAnalysis.jl offre de nombreuses fonctions destinées à travailler avec des chaînes de caractères dans le cadre de l’analyse de textes (voir la documentation). Afin de pouvoir travailler avec cette librairie, il est nécessaire de convertir une chaîne de caractère dans l’un des types suivants :
StringDocument
FileDocument
TokenDocument
NGramDocument
Afin de convertir les données du tableau, on peut utiliser la fonction transform()
de DataFrames.
df = @chain df begin
DataFrames.transform(:Message => ByRow(x -> StringDocument(x)) => :Message2)
end
Une fois que les données ont été converties vers un type utilisable par la librairie TextAnalysis.jl il est désormais possible de leur appliquer des fonctions de cette librairie destinées à normaliser des chaînes de caractères :
remove_case!(...)
— pour normaliser une chaîne de caractères en supprimant les majusculesprepare!(..., strip_numbers)
— pour supprimer les chiffres d’une chaîne de caractèresprepare!(..., strip_punctuation)
— pour supprimer la ponctuation d’une chaîne de caractèresprepare!(..., strip_html_tags)
— pour supprimer le balisage HTML d’une chaîne de caractères
Créer une matrice Tf-idf
Afin de pouvoir créer une matrice Tf-idf, il est nécessaire de créer un corpus afin de représenter la collection de documents
crps = Corpus(df[:, :Message2])
Il est ensuite nécessaire de créer un vocabulaire des données
update_lexicon!(crps)
Pour créer une matrice tf-idf, besoin de wrapper le corpus dans DocumentTermMatrix(...)
pour appliquer la fonction tf_idf()
m = DocumentTermMatrix(crps)
tfidf_mat = tf_idf(m)
En analyse de texte, la concordance désigne l’extraction des mots de textes donnés. Celle-ci permet d’examiner la fréquence des mots ou des exemples. C’est une étape fondamentale pour des analyses linguistiques plus avancées.
La fonction lexicon()
permet de lister les mots d’un corpus avec leur fréquence.
lexicon(crps)
Les concordances sont habituellement présentées sous la forme de mot-clef en contexte (Key Word in Context KWIC). Cet index permet de montrer les mots dans leur contexte environnant (contexte droit et gauche). C’est un outil qui aide à comprendre comment un terme est employé au sein d’un corpus.
L’étiquettage des rôles grammaticaux est une tâche de pré-traitement récurrente dans le domaine du traitement automatique des langues (TAL). Les corpus étiquettés servent ensuite de supports à des tâches plus complexes ou de plus haut niveau linguistique comme l’extraction terminologique, la recherche d’infromation, de patrons grammaticaux et sémantiques, la détection d’opinions ou la catégorisation des textes, ou de dérivations. L’efficacité de cette tâche est donc déterminante.
NLTK étiquettage seulement pour l’anglais (2012)
https://github.com/JuliaText
JuliaLang Organisation for Natual Language Processing, (textual) Information Retrieval, and Computational Linguistics
https://github.com/JuliaText/TextAnalysis.jl
Julia package for text analysis
TextAnalysis.jl is a comprehensive package for text processing and analysis, offering functionalities like tokenization, stemming, sentiment analysis, and topic modeling. Unlike LLMTextAnalysis.jl, TextAnalysis.jl provides a broader range of traditional NLP tools suitable for various text analysis tasks.
High performance tokenizers for natural language processing and other related tasks
https://github.com/JuliaText/WordTokenizers.jl
https://github.com/JuliaText/Embeddings.jl
Functions and data dependencies for loading various word embeddings (Word2Vec, FastText, GLoVE)
https://github.com/JuliaText/Languages.jl
A package for working with human languages
https://github.com/JuliaText/Word2Vec.jl
Word2Vec takes a text corpus as input and produces the word vectors as output. Training is done using the original C code, other functionalities are pure Julia. See demo for more details.
https://github.com/JuliaText/Embeddings.jl
https://github.com/JuliaText/WordNet.jl
A Julia package for Princeton's WordNet®.
cf. https://discourse.julialang.org/t/postagger-on-other-languages-than-english/53385/2
https://github.com/JuliaText/TextModels.jl/blob/master/docs/src/tagging.md?plain=1
Spacy state of the art
https://chengchingwen.github.io/Transformers.jl/dev/
Julia implementation of Transformers models
Transformers.jl provides access to the HuggingFace Transformers library, which offers a wide range of pre-trained state-of-the-art models for NLP tasks. It also allows users to build transformer-based models from scratch on top Flux.jl.
ALBERT(A Lite BERT for Self-Supervised Learning of Language Representations) implementation in Julia
https://github.com/tejasvaidhyadev/ALBERT.jl
TextModels.jl enhances the TextAnalysis package with practical natural language models, typically based on neural networks (in Flux.jl)
StringAnalysis.jl is a fork of TextAnalytics.jl, which offers a similar set of functionalities as TextAnalysis.jl, but with a slightly different API. It extends the original package with additional features like dimensionality reduction, semantic analysis, and more.
https://github.com/oxinabox/DataDeps.jl
https://github.com/tejasvaidhyadev AU MILA
http://tejasvaidhyadev.github.io
Avik Sengupta. Natural Language Processing workshop using Julia, JuliaCon 2018. https://youtu.be/f7RNuOLDyM8
Aussi travail Lindoln sur la collection de corpus langagiers.
0-20’ scraping
22-XX
JuliaCon 2018 | DataDeps.jl and other foundational tools for data driven research | Lyndon White https://youtu.be/kSlQpzccRaI
https://github.com/oxinabox/DataDeps.jl
https://github.com/JuliaText/CorpusLoaders.jl
https://github.com/JuliaText/WordNet.jl
JuliaCon 2018 | Julia as a platform for language development | Jamie Brandon https://youtu.be/BBUrQId0HhQ
https://scattered-thoughts.net
Enhanced String handling in Julia | Scott James. JuliaCon 2018 https://youtu.be/kWqFRGLdqc4
JuliaString.org
https://github.com/JuliaML/MLDatasets.jl/
Glob pour requête un disque dur
using Glob
files = Glob.glob('data/corpus/pdfs/*.pdf')
Plusieurs packages, Taro peut lire n’importe quel format
using Taro
Taro.init()
meta, txtdata = "Taro.extract(files[1])";
meta
information stockée comme un Dict
txtdata
données textuelles
txtdata = replace(txtdata, '\n', ' ')
suppression des espaces, car pas pertinents
using TextAnalysis
using Languages
getTitle(t) = TextAnalysis.sentence_tokenize(Languages.English(), t)[1];
getTitle(txtdata)
Extraire première ligne car le titre
docs = Any[ ]
for i in 1:1000
try
meta.txt = Taro.extract(files[i])
txt = replace(txt, '\n', ' ')
title = getTitle(txt)
dm = TextAnalysis.DocumentMetadata(Languages.English(), title, "", meta["Creation-Date"])
doc = StringDocument(txt, dm)
push!(docs, doc)
catch e
@show e
end
end
crps = Corpus(docs)
typeof(crps)
https://juliapackages.com/p/textgraphs
- Semantic embeddings
- Graph embeddings
RQA
TidierText.jl is a 100% Julia implementation of the R tidytext package. The purpose of the package is to make it easy analyze text data using DataFrames.
https://docs.juliahub.com/General/TidierText/stable/
https://github.com/guo-yong-zhi/WordCloud.jl
https://github.com/domluna/Glove.jl