Découpages départementaux à l’UQAC et savoirs en partage

Qu’en dit le traitement automatique des langues ?

Auteurs
Affiliation

Vincent ARNAUD

Luc BARONIAN

Date de publication

08 novembre 2024

Une question

Derrière cet étrange titre se cache une interrogation. Les départements à l’Université du Québec à Chicoutimi, dans leur forme actuelle, constituent-ils des découpages strictement administratifs, permettant de répartir des budgets, ou induisent-ils aussi une synergie, une similarité des savoirs produits en leur sein ? Les dénominations mêmes de nos départements sont éminemment variables. Il s’agit parfois d’un assemblage de disciplines (arts, lettres et langage ; informatique et mathématique), parfois d’une catégorisation des disciplines impliquées (sciences humaines et sociales ; sciences de la santé) ou parfois d’un terme générique qui aurait pu s’appliquer à d’autres champs disciplinaires (sciences fondamentales ; sciences appliquées).

Une méthodologie

Pour explorer cette question, nous avons choisi d’appuyer notre analyse sur la production scientifique étudiante de l’UQAC. Comme explicité dans les sections suivantes, nous utilisons des analyses issues du domaine qu’est le traitement automatique des langues (Natural Language Processing), qui constitue un axe d’enseignement des programmes de linguistique.

Ces analyses, pour lesquelles une partie du code source est fournie dans le présent document1, ont été effectuées à l’aide du logiciel libre R version 4.4.2 (2024-10-31 ucrt) (R Core Team, 2024). Concernant la manipulation et la visualisation des données, l’écosystème tidyverse a été utilisé (Wickham et al., 2019).

Code
# chargement en mémoire des différentes bibliothèques contenant les fonctionnalités nécessaires à cette analyse
library(tidyverse)
library(uwot)
library(text2vec)
library(ggiraph)
library(pals)
library(dbscan)
library(ggforce)
library(patchwork)

Un moissonnage automatique des résumés des thèses et mémoires de maitrise publiés à l’UQAC

Dans un premier temps, nous avons procédé au moissonnage automatique (web scraping) de tous les résumés en langue française des mémoires de maitrise et de thèses disponibles sur le dépôt institutionnel Constellation (en date du 13 septembre 2024, code source non fourni). Nous avons ainsi constitué une base de données de 3079 enregistrements (nous avons exclu 93 documents qui ne présentaient soit aucun résumé, soit un résumé en anglais seulement). Cette base de données inclut notamment le résumé de chaque document, la référence bibliographique complète, la dénomination du diplôme, le département d’attache, l’année de publication, le cycle d’études (PhD ou maitrise), le lien vers la page originale, mais aussi le lien vers le PDF du texte complet. Ce moissonnage automatique s’est vu complété par de nécessaires corrections manuelles et semi-automatiques pour tenter de circonscrire les problèmes d’encodage de caractères (par exemple, dans plusieurs résumés, les ligatures ont été remplacées par des points d’interrogation) et pour détecter et supprimer les documents en double sur le dépôt institutionnel Constellation.

Code
# Ouverture de la base de données 
meta <- read.csv(paste0(wd, "/database2.csv"), header = TRUE)

# Codage de différentes variables sous forme de facteurs
meta <- meta %>%
  filter(abstract != "") %>%
  mutate(
    diplome = as.factor(diplome),
    departement = as.factor(departement),
    theme = as.factor(theme),
    cycle = as.factor(cycle),
    decennie = as.factor(decennie))

# Nettoyage final des résumés
meta <- meta %>%
  mutate(abstract = str_replace_all(abstract, " \\?il", "oeil")) %>%
  mutate(abstract = str_replace_all(abstract, "(c) \\?(ur)", "\\1oe\\2")) %>%
  mutate(abstract = str_replace_all(abstract, " \\?uvre", "oeuvre")) %>%
  mutate(abstract = str_replace_all(abstract, "\\'\\?il", "\\'oeil")) %>%  
  mutate(abstract = str_replace_all(abstract, "\\'\\?uvre", "\\'oeuvre")) %>%    
  mutate(abstract = str_replace_all(abstract, "\\(\\?uvre", "\\(oeuvre")) %>%  
  mutate(abstract = str_replace_all(abstract, "([l|L]) \\?([a|e|i])", "\\1\\'\\2")) %>%
  mutate(abstract = str_replace_all(abstract, "f \\?cium", "faecium")) %>%
  mutate(abstract = str_replace_all(abstract, "([a-z]) \\?([a-z])", "\\1-\\2"))

# Correction d'une erreur résiduelle de codage
meta <- meta %>%
  mutate(departement = fct_recode(departement, "Département des sciences humaines et sociales" = "Département des sciences humaines"))

# Définition des palettes de couleurs utilisées dans les différentes figures
col.dep <- c(trubetskoy(length(levels(meta$departement))))
names(col.dep) <- c(levels(meta$departement))

col.theme <- c(cols25(length(unique(meta$theme))))
names(col.theme) <- c(levels(meta$theme))

Voici un exemple du contenu d’un enregistrement de cette base de données.

Code
# Affichage du 100e enregistrement de la base de données
meta[100,]

Embeddings et similarité sémantique des documents

Dès lors se posait la question d’estimer le degré de similarité que peuvent partager ces quelque 3000 résumés. Pour répondre à cette question, nous avons fait le choix d’utiliser le plongement lexical ou plongement sémantique (embedding, en anglais). Cette méthode d’apprentissage, fréquemment utilisée en apprentissage-machine et en intelligence artificielle, vise à représenter les mots, les phrases ou le texte tout entier d’un document sous la forme de vecteurs. Dans notre cas, les vecteurs visent à encoder la signification des textes sous une forme numérique en n dimensions. Ainsi, les textes ayant un sémantisme proche présenteront des vecteurs proches.

Mais comment est-il possible, mathématiquement, d’estimer la proximité de deux vecteurs de n dimensions ? Il est de pratique commune en traitement automatique des langues d’utiliser le cosinus de l’angle de deux vecteurs projetés dans un espace multidimensionnel pour estimer leur degré de similarité, donc de proximité. Le cosinus a une propriété intéressante d’être égal à 1 pour des vecteurs identiques (colinéaires) et à 0 pour des vecteurs indépendants (orthogonaux).

Restait cependant une question en suspens : qu’en est-il du modèle d’embedding à utiliser ? Dans le cadre de cette exploration, nous avons choisi d’utiliser le modèle text-embedding-3-large de OpenAI (code source non fourni). Il s’agit d’un grand modèle de langage (Large Language Model ou LLM) multilingue pré-entraîné qui associe chaque texte qui lui est soumis à un espace vectoriel de 3072 dimensions.

Les LLM traitent le texte en fragments appelés tokens. Les tokens représentent des séquences de caractères couramment utilisées. Par exemple, la chaine de caractères « je ne comprends pas » sera divisée en cinq tokens : |je| ne| comprend| s| pas|. Il est possible de tester la division d’une chaine de caractères en tokens2 en utilisant un outil en ligne. Chaque LLM accepte un nombre maximal de tokens au-delà duquel le texte proposé est automatiquement tronqué. Dans notre cas, le résumé le plus long de notre base de données comprend 4734 tokens (soit 16358 caractères), ce qui est bien inférieur au nombre maximal de tokens acceptable par le modèle text-embedding-3-large (soit 8191), d’où un premier argument pour sa sélection.

Nous aurions pu utiliser un des LLMs disponibles gratuitement sur le site Hugging Face, par exemple, et non un LLM propriétaire3. Cependant, les modèles de OpenAI présentaient, en juin 2024, d’excellentes performances en français (Ciancone, Kerboua, Schaeffer, & Siblini, 2024),

Code
# Ouverture du fichier contenant les embeddings
abstracts.emb <- readRDS(file="openai.emb.RDS")

À l’issue du traitement des résumés par ce modèle d’embedding, nous avons obtenu une base de données contenant 3079 lignes (autant que de documents) et 3072 colonnes (autant que le nombre de dimensions caractérisant l’embedding de chaque document). À partir de cette base de données, nous avons calculé, dans un premier temps, le degré de similarité qu’entretiennent ces documents, deux à deux, pour constituer une matrice dont la diagonale est 1 (puisqu’un document entretient avec lui-même une similarité maximale, soit 1).

Code
# Transformation du fichier contenant les embeddings en matrice
abstracts.emb.mat <- as.matrix(abstracts.emb)

# Calcul de la similarité
abstracts.sim.emb <- sim2(abstracts.emb.mat, method = "cosine", norm = "l2")

À partir de cette matrice, nous pouvons, par exemple, remarquer que les deux essais doctoraux suivants entretiennent une forte similarité (0,9503004). Par respect pour les deux personnes citées, nous tenons à préciser que ce degré de similarité ne vise en aucun cas à indiquer un quelconque plagiat, mais à souligner la proximité sémantique qu’entretiennent les résumés de ces deux études. Nous vous invitons à en comparer le contenu.

À partir de cette matrice de similarité, nous avons calculé la matrice opposée exprimant le degré de dissimilarité, ou plus trivialement la distance qu’entretiennent, deux à deux, ces 3079 documents. Cette fois-ci, la diagonale de cette matrice est zéro puisqu’un document entretient avec lui-même une dissimilarité minimale.

Code
# Calcul de la matrice de dissimilarité
abstracts.dis.emb <- as.dist(1 - abstracts.sim.emb)

L’UMAP pour réduire la dimensionnalité et représenter les résultats

Cette matrice de dissimilarité constitue un espace à haute dimension difficile à appréhender visuellement. Il est alors possible d’utiliser un algorithme de réduction de dimensionnalité appelé UMAP (Uniform Manifold Approximation and Projection). Les UMAP (McInnes, Healy, & Melville, 2018) permettent de transformer les données d’un espace à haute dimension en un espace à faible dimension tout en conservant les caractéristiques essentielles des données originales. Les UMAP visent donc ainsi à favoriser la production de représentations intuitives facilitant l’exploration de la structure des grands corpus dans de nombreuses disciplines, y compris pour décrire acoustiquement les voyelles et les vocalisations animales (Sainburg, Thielk, & Gentner, 2020).

Code
# Utilisation de la commande set.seed garantissant la reproductibité de l'analyse
set.seed(1)

# Exécution et configuration de l'algorithme UMAP
abstracts.umap_coords <-
  umap(
    abstracts.dis.emb,
    n_neighbors = 10,
    n_components = 2,
    min_dist = 0,
    init = "spectral",
    seed = 1,
    n_epochs = 500,
    # "In umap (and Python UMAP) the default is 200 epochs unless the dataset is small (< 4,096 items). I think it's better to just pick one default value, and with batch = TRUE, you need slightly more epochs"
    init_sdev = "range",
    # "For compatibility with recent versions of the Python UMAP package"
    batch = TRUE # "this means use the Adam optimizer rather than the asynchronous stochastic gradient descent method. I find that in the vast majority of cases you get quite equivalent results, at the cost of needing a slightly larger value of n_epochs, but that you get more consistent results when using multiple threads, so you can ameliorate the cost of the extra epochs by using more threads."
    # Source: https://jlmelville.github.io/uwot/articles/umap2.html
  )

À l’issue de cette étape de réduction de dimensionnalité, nous disposons alors d’une représentation UMAP en deux dimensions rendant compte de l’organisation du savoir étudiant produit à l’UQAC.

Code
# Affichage des résultats sous la forme d'un diagramme en 2D
abstracts.umap_coords %>%
  data.frame() %>%
  ggplot() +
  geom_point(aes(X1, X2),
             size = 0.75,
             alpha = 0.8) +
  labs(x = "Dimension 1", y = "Dimension 2", title = "UMAP de la production scientifique étudiante à l'UQAC") +
  #theme_minimal() +
  theme(aspect.ratio = 1) +
  coord_fixed(ratio = 1) +
  graphs.theme()

Une analyse exploratoire

Sur la figure précédente, chaque point représente un document. De potentiels regroupements de données (clusters) semblent émerger, mais sans une colorisation adaptée, il est difficile d’en savoir plus.

Colorisons…

Essayons alors de coloriser chaque point, donc chaque document, en fonction de son département d’attache.

Code
# Affichage des résultats sous la forme d'un diagramme en 2D
left_join(
  abstracts.umap_coords %>%
    data.frame() %>%
    rownames_to_column(var = "doc_id"),
  meta,
  by = "doc_id"
) %>%
  ggplot() +
  geom_point(aes(X1, X2, color = departement),
             size = 0.75,
             alpha = 0.8) +
  labs(x = "Dimension 1", y = "Dimension 2", title = "UMAP de la production scientifique étudiante à l'UQAC",
       subtitle = "Colorisation par département") +
  scale_color_manual(values = col.dep, name = "", labels = function(x) str_wrap(x, width = 30)) +
  theme(aspect.ratio = 1) +
  coord_fixed(ratio = 1) +
  graphs.theme() +
  guides(color = guide_legend(override.aes = list(size = 3))) +
  theme(legend.key.height=unit(1.5,"line"))

Il est, par exemple, intéressant d’observer que les thèses et mémoires publiés au sein du Département des arts, des lettres et du langage ne constituent pas un regroupement homogène. Il en est de même pour les travaux publiés au sein des départements des sciences humaines et sociales, des sciences appliquées et des sciences fondamentales. La diversité des travaux étudiants dans chacun de ces départements se reflète aisément sur la figure précédente.

Il est aussi possible de visualiser l’intrication :

  • d’une partie des travaux issus du Département de sciences appliquées et des sciences de la santé avec ceux du Département d’informatique et mathématique ;

  • d’une partie des travaux issus du Département des sciences humaines et sociales avec ceux de sciences de la santé.

Serait-il possible d’enrichir cette cartographie en utilisant une autre colorisation ? Nous avons choisi de regrouper les 45 diplômes existants ou ayant existé à l’UQAC en quatorze secteurs tels qu’indiqués dans la figure suivante4.

Code
# Affichage des résultats sous la forme d'un diagramme en 2D
left_join(
  abstracts.umap_coords %>%
    data.frame() %>%
    rownames_to_column(var = "doc_id"),
  meta,
  by = "doc_id"
) %>%
  ggplot() +
  geom_point(aes(X1, X2, color = theme),
             size = 0.75,
             alpha = 0.8) +
  labs(x = "Dimension 1", y = "Dimension 2", title = "UMAP de la production scientifique étudiante à l'UQAC", subtitle = "Colorisation par secteur") +
  scale_color_manual(values = col.theme, name = "", labels = function(x) str_wrap(x, width = 30)) +
  #theme_minimal() +
  theme(aspect.ratio = 1) +
  coord_fixed(ratio = 1) +
  graphs.theme() +
  guides(color = guide_legend(override.aes = list(size = 3))) +
  theme(legend.key.height=unit(1,"line"))

Même si un tel regroupement en secteurs induit nécessairement de potentielles approximations, il s’avère cependant que cette colorisation illustre plus adéquatement les découpages disciplinaires. Prenons à nouveau l’exemple du Département des arts, des lettres et du langage. Il est intéressant d’observer que les travaux en arts et en lettres s’intègrent à un regroupement plus large, alors que les travaux en linguistique constituent un regroupement distinct de données, reflet, s’il en est, des expertises différentes de celles des arts et des lettres.

De même, l’hétérogénéité des travaux issus du Département des sciences humaines et sociales est aussi induite par des différences disciplinaires. Ainsi, les travaux en études régionales et en interventions régionales apparaissent totalement distincts de ceux en travail social. Quant aux contributions associées à la théologie, elles semblent former un microregroupement5.

Sur le plan interdépartemental, il est aussi à noter que les travaux en études régionales et en interventions régionales présentent une faible intrication avec ceux en gestion et en management. Remarquons aussi l’enchevêtrement d’une grande partie des travaux en travail social avec ceux de psychologie et de médecine. Par ailleurs, s’illustre également la superposition de quelques travaux en ingénierie avec ceux d’informatique.

Cependant, ce découpage naïf ne semble pas suffisant pour rendre compte de la diversité des recherches étudiantes effectuées à l’UQAC. Ainsi, les secteurs en ingénierie, en biologie et en ressources renouvelables, et dans une moindre mesure en sciences de la terre apparaissent eux aussi fortement hétérogènes avec l’émergence de plusieurs clusters isolés.

Allons un peu plus loin

Les coordonnées x-y de la représentation UMAP peuvent être utilisées comme données d’entrée d’un algorithme de clustering non supervisé. Un tel algorithme vise à regrouper automatiquement (donc sans étiquetage préalable) les données au sein de clusters. Pour ce faire, nous avons utilisé l’algorithme HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise) (Campello, Moulavi, & Sander, 2013). L’avantage de cet outil est qu’il ne requiert le réglage que d’un seul hyperparamètre, soit le plus petit nombre de points de données nécessaire pour former un cluster (minPts).

Nous proposons deux ensembles de regroupements possibles en fonction de deux valeurs de cet hyperparamètre, soit 33 ou 44 points6. Ces analyses confirment les tendances observées précédemment, mais permettent aussi de préciser le portrait proposé.

Code
hdb.33 <- hdbscan(abstracts.umap_coords, minPts = 33)

hdb.44 <- hdbscan(abstracts.umap_coords, minPts = 44)

Afin de permettre au lectorat d’explorer plus avant ces cartographies du savoir produit par les personnes étudiantes de l’UQAC, nous avons intégré ci-dessous deux figures interactives.

Astuce

En passant la souris sur les deux diagrammes suivants, vous découvrirez l’auteur, le titre, le nom du diplôme et le département d’attache de chacun des travaux. Il est aussi possible, à l’aide des boutons situés en haut à droite de chacune de ces figures, de zoomer et de se déplacer afin d’en découvrir les détails.

Code
# Création d'une repésentation interactive en utilisant les fonctions incluses dans le package ggiraph
x <- left_join(
  abstracts.umap_coords %>%
    data.frame() %>%
    rownames_to_column(var = "doc_id"),
  meta,
  by = "doc_id"
) %>%
    mutate(cluster = hdb.33$cluster) %>%
  ggplot() +
  geom_point_interactive(
    aes(
      X1,
      X2,
      color = theme,
      tooltip = str_wrap(paste0(reference, " - ", diplome, " - ", departement), 40),
      data_id = doc_id
    ),
    size = 0.75,
    hover_nearest = TRUE,
    alpha = 0.8
  ) +
  geom_mark_hull(
    data = . %>% dplyr::filter(cluster > 0),
    aes(X1, X2, group = cluster),
    expand = unit(1.1, "mm"),
    radius = unit(1.1, "mm"),
    linewidth = 0.5
  ) +
  labs(x = "Dimension 1", y = "Dimension 2", title = "UMAP interactif de la production scientifique étudiante à l'UQAC",
       subtitle = "Regroupement (clustering) non supervisé avec HDBSCAN (minPts = 33)") +
  scale_color_manual(values = col.theme, name = "", labels = function(x) str_wrap(x, width = 30)) +
  theme(aspect.ratio = 1) +
  coord_fixed(ratio = 1) +
  graphs.theme() +
  guides(color = guide_legend(override.aes = list(size = 3))) +
  theme(legend.key.height=unit(1,"line"))

girafe(ggobj = x,
       options = list(opts_sizing(width = 1), opts_zoom(max = 8)))

Sur ce premier diagramme, apparait :

  • la césure entre les travaux en linguistique et ceux en arts et lettres ; ces derniers étant réunis dans un cluster unique ;

  • le regroupement d’une majorité des travaux en travail social avec ceux de psychologie et de médecine ;

  • la présence de deux mini-clusters, réunissant d’une part la majorité des études en théologie et d’autre part l’essentiel des études en génétique des populations ;

  • la césure des travaux en ingénierie en deux clusters : l’un plus associé aux travaux consacrés à l’aluminium et l’autre plus associé aux matériaux anti-givre et au domaine de l’électricité ;

  • la césure des travaux en biologie et ressources renouvelables en trois clusters : un premier associé à la chimie et aux activités biologiques des produits d’origine naturelle, un second visant la forêt boréale et enfin un troisième associé aux études aquatiques et à la pêche ;

  • la césure des travaux en sciences de la terre en deux clusters : un premier, nous semble-t-il, plus associé aux eaux souterraines et un second plus associé aux minéraux ;

  • un cluster unique pour les études en informatique, auxquelles sont associées quelques études en ingénierie et en médecine ;

  • la césure entre les études régionales et celles en administration et management ;

  • de façon plus énigmatique (pour notre oeil non expert), l’émergence d’un découpage en trois clusters des études en administration et management.

Code
# Création d'une repésentation interactive en utilisant les fonctions incluses dans le package ggiraph
y <- left_join(
  abstracts.umap_coords %>%
    data.frame() %>%
    rownames_to_column(var = "doc_id"),
  meta,
  by = "doc_id"
) %>%
    mutate(cluster = hdb.44$cluster) %>%
  ggplot() +
  geom_point_interactive(
    aes(
      X1,
      X2,
      color = theme,
      tooltip = str_wrap(paste0(reference, " - ", diplome, " - ", departement), 40),
      data_id = doc_id
    ),
    size = 0.75,
    hover_nearest = TRUE,
    alpha = 0.8
  ) +
  geom_mark_hull(
    data = . %>% dplyr::filter(cluster > 0),
    aes(X1, X2, group = cluster),
    expand = unit(1.1, "mm"),
    radius = unit(1.1, "mm"),
    linewidth = 0.5
  ) +
  labs(x = "Dimension 1", y = "Dimension 2", title = "UMAP interactif de la production scientifique étudiante à l'UQAC",
       subtitle = "Regroupement (clustering) non supervisé avec HDBSCAN (minPts = 44)") +
  scale_color_manual(values = col.theme, name = "", labels = function(x) str_wrap(x, width = 30)) +
  theme(aspect.ratio = 1) +
  coord_fixed(ratio = 1) +
  graphs.theme() +
  guides(color = guide_legend(override.aes = list(size = 3))) +
  theme(legend.key.height=unit(1,"line"))

girafe(ggobj = y,
       options = list(opts_sizing(width = 1), opts_zoom(max = 8)))

Dans ce second diagramme, la presque totalité des clusters repérés précédemment demeure, mettant ainsi en exergue la stabilité de ces derniers. Seules deux distinctions émergent :

  • la vaste majorité des études en administration sont, cette fois-ci, réunies au sein d’un unique cluster, ce qui nous laisse penser que le découpage précédent en trois clusters ne pourrait être qu’un potentiel artefact lié au choix de la valeur de l’hyperparamètre minPts ;

  • les études en théologie n’apparaissent plus au sein d’un cluster, ce qui s’explique aisément. Le plus petit nombre de points de données nécessaires pour former un cluster est ici de 44 et le nombre d’études en théologie est de 46.

En guise de conclusion

Notez que les coordonnées d’un document donné au sein d’une représentation UMAP peuvent considérablement varier en fonction des hyperparamètres choisis7, mais aussi d’une exécution informatique à l’autre avec les mêmes hyperparamètres8. Cela signifie qu’il ne faut pas trop se fier aux valeurs exactes des coordonnées proposées par une représentation UMAP, mais plutôt à l’organisation générale de cette représentation.

Une limitation particulière de l’UMAP est que la distance entre les clusters n’est généralement pas signifiante, pas plus que la densité de ceux-ci (Coenen & Pearce, 2019). Nous avons pris la précaution de ne jamais indiquer dans cette courte contribution si tel ou tel cluster était plus ou moins distant ou proche d’un autre.

Une telle analyse est aussi empreinte de limitations en ce qui concerne la temporalité. Les départements n’ont pas tous été créés à la même époque et il en est de même pour les programmes de doctorat et de maitrise. Les figures précédentes ne tiennent pas compte de cette temporalité. Pour tenter de dépasser cette limitation, nous avons appliqué la méthodologie proposée à deux sous-échantillons9 :

  • les mémoires et les thèses des décennies 1970, 1980 et 1990 (n=841)

  • les mémoires et les thèses des décennies 2000 et 2010 (n=1731)

Code
set.seed(1)

#841
decennies1970.1980.1990 <- meta %>%
filter(decennie == "1970" | decennie == "1980" | decennie == "1990") %>%
  pull(doc_id)

decennies1970.1980.1990.emb <- subset(abstracts.emb, rownames(abstracts.emb) %in% decennies1970.1980.1990) %>%
as.matrix(.) %>%
  sim2(., method = "cosine", norm = "l2") 

decennies1970.1980.1990.dist <- as.dist(1 - decennies1970.1980.1990.emb)

umap_coords.1970.1980.1990 <-
  umap(
    decennies1970.1980.1990.dist,
    n_neighbors = 10,
    n_components = 2,
    min_dist = 0,
    init = "spectral",
    seed = 1,
    n_epochs = 500,
    init_sdev = "range",
    batch = TRUE)

#1731
decennies2000.2010 <- meta %>%
filter(decennie == "2000" | decennie == "2010") %>%
  pull(doc_id)

decennies2000.2010.emb <- subset(abstracts.emb, rownames(abstracts.emb) %in% decennies2000.2010) %>%
as.matrix(.) %>%
  sim2(., method = "cosine", norm = "l2") 

decennies2000.2010.dist <- as.dist(1 - decennies2000.2010.emb)

umap_coords.2000.2010 <-
  umap(
    decennies2000.2010.dist,
    n_neighbors = 10,
    n_components = 2,
    min_dist = 0,
    init = "spectral",
    seed = 1,
    n_epochs = 500,
    init_sdev = "range",
    batch = TRUE)
Code
p1.708090 <- left_join(
  umap_coords.1970.1980.1990 %>%
    data.frame() %>%
    rownames_to_column(var = "doc_id"),
  meta,
  by = "doc_id"
) %>%
  ggplot() +
  geom_point(aes(X1, X2, color = departement),
             size = 0.75,
             alpha = 0.8) +
  labs(x = "Dimension 1", y = "Dimension 2", title = "UMAP de la production scientifique étudiante à l'UQAC",
       subtitle = "Colorisation par département - Décennies 1970, 1980, 1990") +
  scale_color_manual(values = col.dep, name = "", labels = function(x) str_wrap(x, width = 30)) +
  theme(aspect.ratio = 1) +
  coord_fixed(ratio = 1) +
  graphs.theme() +
  guides(color = guide_legend(override.aes = list(size = 3))) +
  theme(legend.key.height=unit(1.5,"line"))

  
 p2.708090 <- left_join(
  umap_coords.1970.1980.1990 %>%
    data.frame() %>%
    rownames_to_column(var = "doc_id"),
  meta,
  by = "doc_id"
) %>%
  ggplot() +
  geom_point(aes(X1, X2, color = theme),
             size = 0.75,
             alpha = 0.8) +
  labs(x = "Dimension 1", y = "Dimension 2", title = "UMAP de la production scientifique étudiante à l'UQAC",
       subtitle = "Colorisation par secteur - Décennies 1970, 1980, 1990") +
  scale_color_manual(values = col.theme, name = "", labels = function(x) str_wrap(x, width = 30)) +
  theme(aspect.ratio = 1) +
  coord_fixed(ratio = 1) +
  graphs.theme() +
  guides(color = guide_legend(override.aes = list(size = 3))) +
  theme(legend.key.height=unit(1,"line"))

p1.708090 / p2.708090

Au cours des décennies 1970, 1980 et 1990, les départements de sciences fondamentales et de sciences appliquées présentaient déjà une hétérogénéité avec l’émergence de deux clusters chacun, avec notamment la distinction entre les travaux en sciences de la terre et ceux en ingénierie. La réalité des autres départements – à cette époque – semblait tout autre, avec une relative homogénéité des travaux produits en leur sein. Cependant, même au sein du Département des arts, des lettres et du langage, une distinction entre la linguistique, les arts et la littérature était déjà apparente10. Même si, officiellement, le Département des sciences de la santé n’existait pas durant ces décennies, nous avons choisi d’y classer les mémoires de maitrise en médecine publiés en extension avec l’Université Laval, comme le propose le dépôt institutionnel Constellation.

Code
p1.0010 <- left_join(
  umap_coords.2000.2010 %>%
    data.frame() %>%
    rownames_to_column(var = "doc_id"),
  meta,
  by = "doc_id"
) %>%
  ggplot() +
  geom_point(aes(X1, X2, color = departement),
             size = 0.75,
             alpha = 0.8) +
  labs(x = "Dimension 1", y = "Dimension 2", title = "UMAP de la production scientifique étudiante à l'UQAC",
       subtitle = "Colorisation par département - Décennies 2000, 2010") +
  scale_color_manual(values = col.dep, name = "", labels = function(x) str_wrap(x, width = 30)) +
  theme(aspect.ratio = 1) +
  coord_fixed(ratio = 1) +
  graphs.theme() +
  guides(color = guide_legend(override.aes = list(size = 2))) +
  theme(legend.key.height=unit(1.5,"line"))

p2.0010 <- left_join(
  umap_coords.2000.2010 %>%
    data.frame() %>%
    rownames_to_column(var = "doc_id"),
  meta,
  by = "doc_id"
) %>%
  ggplot() +
  geom_point(aes(X1, X2, color = theme),
             size = 0.75,
             alpha = 0.8) +
  labs(x = "Dimension 1", y = "Dimension 2", title = "UMAP de la production scientifique étudiante à l'UQAC",
       subtitle = "Colorisation par secteur - Décennies 2000, 2010") +
  scale_color_manual(values = col.theme, name = "", labels = function(x) str_wrap(x, width = 30)) +
  theme(aspect.ratio = 1) +
  coord_fixed(ratio = 1) +
  graphs.theme() +
  guides(color = guide_legend(override.aes = list(size = 2))) +
  theme(legend.key.height=unit(1,"line"))

p1.0010 / p2.0010

La situation, au cours des décennies 2000 et 2010, apparait bien différente. Outre la présence nouvelle de travaux issus du Département d’informatique et de mathématique, on semble assister à un éclatement des clusters départementaux, notamment dans les départements associés aux humanités, mais aussi en sciences de la santé.

Le manuel de gestion de l’UQAC nous donne à lire la définition suivante d’un département « Désigne l’entité académique et administrative qui regroupe les professeurs par affinité de disciplines ou de champs d’études ainsi que les autres personnes supportant les activités d’enseignement, de recherche et d’administration au sein de cette entité. » Et pourtant, on peut légitimement s’interroger pour savoir si la notion de proximité des savoirs est encore respectée dans les départements de l’UQAC. En regard de l’échantillon analysé, les découpages départementaux nous apparaissent comme des découpages administratifs reflétant une organisation du savoir des années 1980-1990, parfois très éloignés des préoccupations de recherche exprimées à travers les travaux étudiants des cycles supérieurs.

L’éclatement de l’homogénéité des travaux associés à chaque département dans les décennies 2000-2010 pose aussi la question de l’émergence de notions telles que l’interdisciplinarité ou l’intersectorialité, notions que les découpages départementaux actuels de l’UQAC semblent peiner à prendre en compte.

Nous espérons que cette courte exploration contribuera à promouvoir une facette concrète et potentiellement structurante de la linguistique, à démystifier partiellement la méthode d’apprentissage qu’est le plongement sémantique, méthode fréquemment utilisée en apprentissage-machine et en intelligence artificielle, mais aussi à ouvrir un débat au sein de la communauté de l’UQAC.

Ainsi, bien que les structures départementales n’empêchent pas, en théorie, des collègues relevant de départements différents d’échanger ou de collaborer, notre opinion est qu’elles peuvent tout de même favoriser certains développements, certaines infrastructures. En effet, il demeure que les budgets sont assignés à des départements qui, surtout en contexte de sous-financement, peuvent hésiter à les partager. Pourquoi une direction départementale allouerait-elle un budget à un projet partagé avec un autre département lorsqu’elle peut l’allouer à un projet entièrement développé en son sein ? Les évaluations professorales sont aussi intradépartementales, ce qui peut favoriser une recherche pouvant être mieux comprise par ses collègues lorsque vient le temps de demander la permanence ou d’obtenir une promotion. Enfin, l’attribution des tâches de cours relève des départements, ce qui peut inciter à l’émergence d’une cohérence disciplinaire entre secteurs d’un même département et ainsi limiter les explorations interdisciplinaires qui sont, elles, interdépartementales.

Dans cette analyse exploratoire, nous observons un décalage entre les structures départementales existantes et l’organisation du savoir suggérée par les travaux étudiants des cycles supérieurs. On pourrait même se demander à quel point les découpages départementaux actuels sont susceptibles d’orienter une recherche qui pourrait être encore plus variée, encore plus innovatrice dans des structures différentes.

Notre université entame sa 56e année d’existence et il nous apparaitrait opportun de se questionner collectivement sur la façon de remodeler, d’actualiser les découpages départementaux que nous connaissons et qui, quoi qu’on en pense, balisent et structurent nos interactions et nos développements de carrière. Entre l’adoption d’un modèle facultaire et le rebrassage des disciplines en de nouveaux départements, les pistes de solutions nous semblent nombreuses et variées. La discussion est ouverte.

Bibliographie

Campello, R. J. G. B., Moulavi, D., & Sander, J. (2013). Density-Based Clustering Based on Hierarchical Density Estimates. In J. Pei, V. S. Tseng, L. Cao, H. Motoda, & G. Xu (Éds.), Advances in Knowledge Discovery and Data Mining (Vol. 7819, p. 160‑172). Springer.
Ciancone, M., Kerboua, I., Schaeffer, M., & Siblini, W. (2024). MTEB-French: Resources for French Sentence Embedding Evaluation and Analysis. arXiv pre-print. doi: 10.48550/arXiv.2405.20468
Coenen, A., & Pearce, A. (2019). Understanding UMAP. Consulté à l'adresse https://pair-code.github.io/understanding-umap/
McInnes, L., Healy, J., & Melville, J. (2018). UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction. arXiv pre-print. doi: 10.48550/arXiv.1802.03426
R Core Team. (2024). R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. Consulté à l'adresse https://www.R-project.org/
Sainburg, T., Thielk, M., & Gentner, T. Q. (2020). Finding, Visualizing, and Quantifying Latent Structure Across Diverse Animal Vocal Repertoires. PLOS Computational Biology, 16(10), e1008228. doi: 10.1371/journal.pcbi.1008228
Wickham, H., Averick, M., Bryan, J., Chang, W., McGowan, L. D., François, R., … Yutani, H. (2019). Welcome to the Tidyverse. Journal of Open Source Software, 4(43), 1686. doi: 10.21105/joss.01686

Environnement

R version 4.4.2 (2024-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64
OS version: Windows 11 x64 (build 22631)

Packages R

stats: The R Stats Package version 4.4.2
graphics: The R Graphics Package version 4.4.2
grDevices: The R Graphics Devices and Support for Colours and Fonts version 4.4.2
utils: The R Utils Package version 4.4.2
datasets: The R Datasets Package version 4.4.2
methods: Formal Methods and Classes version 4.4.2
base: The R Base Package version 4.4.2
patchwork: The Composer of Plots version 1.3.0
ggforce: Accelerating ‘ggplot2’ version 0.4.2
dbscan: Density-Based Spatial Clustering of Applications with Noise (DBSCAN) and Related Algorithms version 1.2-0
pals: Color Palettes, Colormaps, and Tools to Evaluate Them version 1.9
ggiraph: Make ‘ggplot2’ Graphics Interactive version 0.8.10
text2vec: Modern Text Mining Framework for R version 0.6.4
uwot: The Uniform Manifold Approximation and Projection (UMAP) Method for Dimensionality Reduction version 0.2.2
Matrix: Sparse and Dense Matrix Classes and Methods version 1.7-1
lubridate: Make Dealing with Dates a Little Easier version 1.9.3
forcats: Tools for Working with Categorical Variables (Factors) version 1.0.0
stringr: Simple, Consistent Wrappers for Common String Operations version 1.5.1
dplyr: A Grammar of Data Manipulation version 1.1.4
purrr: Functional Programming Tools version 1.0.2
readr: Read Rectangular Text Data version 2.1.5
tidyr: Tidy Messy Data version 1.3.1
tibble: Simple Data Frames version 3.2.1
ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics version 3.5.1
tidyverse: Easily Install and Load the ‘Tidyverse’ version 2.0.0

Notes de bas de page

  1. Pour les personnes qui souhaiteraient reproduire ces analyses, nous tenons à leur disposition l’entiéreté du code informatique utilisé. Qui plus est, en cliquant sur le nom de chacune des fonctions utilisées dans les différents blocs de code informatique intégrés au présent document, il est possible de prendre connaissance de la documentation disponible en ligne expliquant leur fonctionnement.↩︎

  2. Précision technique, le modèle d’embedding text-embedding-3-large utilise l’encodage cl100k_base.↩︎

  3. L’utilisation du modèle d’embedding text-embedding-3-large n’est pas exempte de frais pris en charge à titre personnel par les auteurs de cette contribution. Ajoutons que tous les calculs ont été effectués sur l’ordinateur personnel du premier auteur ; l’ordinateur professionnel à sa disposition ne permettant pas de telles analyses.↩︎

  4. L’étiquetage de ces quatorze secteurs a été effectué en fonction de la dénomination des diplômes. Par exemple, le secteur intitulé Médecine regroupe les travaux rédigés dans le cadre des quatre diplômes suivants : Maîtrise en médecine expérimentale, Maîtrise en médecine expérimentale (volet génétique des populations humaines), Maîtrise en sciences cliniques et biomédicales et Maîtrise en sciences infirmières.↩︎

  5. Les diplômes regroupés sous l’étiquette théologie émanaient jusqu’aux années 2000 du Département de sciences religieuses et d’éthique aujourd’hui intégré au Département des sciences humaines et sociales.↩︎

  6. La sélection de ces deux valeurs pour le paramètre minPts a été effectuée, à la fois, en fonction de la stabilité du nombre de clusters proposés et de la minimisation du nombre de points laissés, par l’algorithme, en dehors de tout cluster (342 dans un cas et 353 dans l’autre, soit entre 11,1 et 11.4 % des 3079 mémoires et thèses incluant un résumé en français).↩︎

  7. Pour les personnes intéressées, la valeur de chacun des hyperparamètres utilisés pour configurer l’UMAP est indiquée dans le code source joint.↩︎

  8. Par défaut, l’UMAP est un algorithme stochastique, ce qui signifie que les sorties générées varient à chaque exécution du code informatique. Il est cependant possible d’utiliser des techniques destinées à garantir une reproductibilité des résultats à chaque itération du code.↩︎

  9. Merci à notre collègue Simon Girard pour cette suggestion. Merci également à Catherine Laprise pour ses commentaires attentifs concernant ce projet ainsi qu’à Vanessa Poirier pour ses suggestions et ses corrections.↩︎

  10. À cette époque cependant, la dénomination de ce département n’incluait que les secteurs des arts et des lettres.↩︎

Citation

BibTeX
@misc{arnaud2024,
  author = {ARNAUD, Vincent and BARONIAN, Luc},
  editor = {CHERBLANC, Jacques},
  title = {Découpages départementaux à l’UQAC et savoirs en partage},
  date = {2024-11-08},
  url = {https://correspondance.info},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
ARNAUD, V., & BARONIAN, L. (2024, November 8). Découpages départementaux à l’UQAC et savoirs en partage (J. CHERBLANC, Ed.). Retrieved from Correspondance : Le journal des profs de l’UQAC website: https://correspondance.info