juba / rainette

R implementation of the Reinert text clustering method
https://juba.github.io/rainette/
53 stars 7 forks source link

Distinction entre formes actives et formes supplémentaires ou comment récupérer les types fournis par spaCyr #14

Closed gabrielparriaux closed 2 years ago

gabrielparriaux commented 2 years ago

Bonjour,

La lemmatisation effectuée avec spaCyr permet à Quanteda de récupérer les types de chacun des mots du lexique, en plus de leur lemme. Ceci devrait permettre, par exemple, de tirer profit de ces types pour les distinguer dans certaines opérations.

IRaMuTeQ, par exemple, permet de séparer dans l’affichage des clusters entre formes actives (verbes, noms et adjectifs) des formes supplémentaires (autres types), ce qui peut s’avérer pratique.

La fonction de Quanteda qui permet de créer des objets de type tokens en conservant le type est ainsi:

tokens <- as.tokens(
  dfm,
  concatenator = "/",
  include_pos = c("pos"),
  use_lemma = TRUE
)

On obtient alors des tokens sous forme de binômes du type "lemme/POS".

Le problème est que je ne sais pas ensuite comment gérer ces tokens pour séparer à nouveau les binômes et créer une matrice termes-documents avec uniquement les lemmes. Si les types pouvaient être extraits dans une autre colonne, cela permettrait d’effectuer des sélections dans les tokens selon le type.

J’ai posé la question sur stackoverflow (https://stackoverflow.com/questions/72635517/how-can-i-separate-words-in-a-corpus-according-to-their-pos) aussi, au cas où…

Est-ce que vous avez une idée d’une manière de procéder avec ces types?

Merci d’avance pour votre aide,

Gabriel

juba commented 2 years ago

Je ne sais pas si c'est la manière optimale de le faire mais à partir d'un objet tokens contenant les "pos" générés par spaCyr :

library(quanteda)

tok <- as.tokens(
    list(
        c("la/DET", "grande/ADJ", "maison/NOM", "rouge/ADJ"),
        c("le/DET", "petit/ADJ", "chat/NOM", "mignon/ADJ")
    )

Il est possible de ne conserver que certains types de termes et de supprimer le type dans les tokens avec ce code par exemple.

tok |>
    tokens_select(
        c("/ADJ$", "/NOM$"),
        valuetype = "regex"
    ) |>
    tokens_split("/") |>
    tokens_remove(
        c("ADJ", "NOM"),
        valuetype = "fixed",
        case_insensitive = FALSE
    )
gabrielparriaux commented 2 years ago

Excellent, c’est tout à fait ce qu’il me fallait! Merci!