Compter les mots comme défini par l'Académie Française

Bonjour,

Savez-vous si il est possible ( réglage, téléchargement d’extension, personnalisation … ) de faire en sorte que Libreoffice compte les mots selon les règles définies par l’Académie Française. Par exemple, “:” ne compte pas pour un mot ( tandis que Libre Office en compte 1 ); ou encore “l’animal” compte pour 2 mots ( alors qu’il n’en compte qu’1 ).

C’est pour un concours que je passe à l’ordinateur, où les mots sont systématiquement recomptés à la main par le correcteur.

En vous remerciant par avance pour toute aide :))

Bonjour,

Dans l’extension grammalecte, le compteur de mots a l’air plus conforme que le compteur d’origine.

Merci de confirmer que la réponse convient en cliquant le bouton gris à gauche de la réponse pour le passer au vert . Sinon, merci d’éditer la question (les réponses sont réservées aux solutions).

J’ai essayé, mais malheureusement son code ne fonctionne pas ^^’
Tant pis j’abandonne ce serait trop compliqué de toutes manières, je passerai autant de temps à compter à la main
Merci quand même pour ton aide, j’ai tout de même appris des choses grâce à toi !
Bonne soirée,
Gilles

Sub Main
' Macro permettant de calculer un nombre de mots pour un texte en la langue française (France) (lang code = fr-FR).
' Elle prend en charge tous les caractères de la norme "ANSI Europe de l'ouest" (= "Windows-1252" = "CP1252") (qui englobe la norme "ASCII").

' Si vous sélectionnez du texte, la fonction ne considèrera que le texte sélectionné.
' Si vous ne sélectionnez pas de texte, la fonction considèrera tout le document.

' Par convention :
' - On compte un mot comme étant un groupe de caractères séparé des autres groupes par un espace (isolables typographiquement).
' - Tous les caractères qui ne sont pas des chiffres ou des lettres comptent pour rien.

' Ce qui signifie :
' - Les chiffres ou nombres isolés comptent pour 1 mot.
'   (Exemple : "Cette phrase contient 5 mots.")
' - Les mots courts comme "le", "la", "de", "à", "a", "où", "y", etc. comptent pour 1 mot.
' - Les mots élidés comme "c'", "d'", "j'", "l'", "m'", "n'", "s'", "t'" comptent pour un mot.
'   (Exemple : "C'est ainsi." = 3 mots)
' - Les mots composés comptent pour plusieurs mots si chaque terme est un mot indépendant.
'   (Exemple : "grand-mère" = 2 mots, "c'est-à-dire" = 4 mots, "tout-à-l'égout" = 4 mots)
' - Les mots composés contenant des mots qui n'existent pas de manière indépendante ne comptent pas.
'   (Exemple : "socio-économique = 1 mot, car "socio" est l'abrégé de "social" et ne s'emploi pas seul)
'   (Exemple : "sociologico-économique = 1 mot, car "sociologico" est l'abrégé de "sociologique" et ne s'emploi pas seul)
'   (Exemple : "sociologique-économique = 2 mots)
' - Le "t" présent dans "a-t-il" ou "prend-t-il" est une notation purement euphonique, il ne compte pas.
' - Les caractères abrégés comme l'esperluette (& = et) ou les caractères de monnaie (€, ¢, $, £, ¤, ¥, etc.) comptent pour 1 mot.
' - Les autres caractères (type # (dièse), _ (underscore), % (pourcent), etc.) ne comptent pas.

' Dans les algorithmes habituel de comptage des mots, on considère forcément qu'un mot est précédé d'un espace.
' Les espaces insécables ne sont pas pris en compte.
' Cette méthode de calcul fonctionne pour les anglo-saxons qui ne séparent pas leur ponctuation,
' mais pas pour les français qui séparent les caractères de type deux-points, point-virgule, point d'exclamation, etc.
' Cette macro propose un nouvel algorithme qui corrige ces erreurs.

' ATTENTION :
' Cette macro compte forcément les mots composés (séparés par un ou des tirets) comme plusieurs mots.
' Elle n'est pas capable de reconnaître les mots qui composent un mot-composé comme étant indépendants ou non.
' Vous devrez donc réajuster le résultat en fonction. Le nombre de mots composés est affiché dans le résultat.

objet_texte                 = ThisComponent.CurrentController.getViewCursor
if (objet_texte.IsCollapsed = TRUE) then
    string_texte            = ThisComponent.Text.String                              ' On récupère le texte de tout le document (sans les cadres).
else
    string_texte            = objet_texte.String                                     ' On récupère le texte sélectionné (sans les cadres).
end if

i_longueur_texte            = len(string_texte)                                      ' On calcule le nombre total de caractères.

i                           = 0                                                      ' On initialise une variable d'itération de boucle.
i_nombre_mot                = 0                                                      ' On initialise une variable pour compter le nombre de mots.
i_nombre_mot_compose        = 0                                                      ' On initialise une variable pour compter le nombre de mots composés.
i_nombre_mot_coupe          = 0                                                      ' On initialise une variable pour compter le nombre de mots coupés par un retour à la ligne.

b_premier_mot               = TRUE                                                   ' On initialise une variable pour compter le premier mot.
b_compter_le_mot_apres      = FALSE                                                  ' On initialise une variable pour savoir s'il faut ou non compter un mot qui est après.
c_caractere                 = ""                                                     ' On initialise une variable pour travailler sur un caractère.

i_nombre_retour_chariot     = 0                                                      ' On initialise une variable pour compter le nombre de retours chariot (= CR = Carriage return = 0D).
i_nombre_saut_de_ligne      = 0                                                      ' On initialise une variable pour compter le nombre de sauts de ligne  (= LF = Line feed       = 0A).
i_nombre_retour_a_la_ligne  = 0                                                      ' On initialise une variable pour compter le nombre de retours à la ligne.
                                                                                     ' Remarque sur le retour à la ligne :
                                                                                     ' - Sous Windows = 0D 0A = CR LF = chr(13) chr(10)     (Norme standard)
                                                                                     ' - Sous Linux   = 0D    = CR    = chr(13)
                                                                                     ' - Sous MacOSX  = 0A    = LF    = chr(10)

for i = 1 to i_longueur_texte step 1                                                 ' Boucle allant du premier au dernier caractère du texte récupéré.
    c_caractere = mid(string_texte, i, 1)                                            ' On récupère un caractère.

    select case c_caractere

        case " ", chr(160)                                                           ' Si ce caractère est un espace ou un espace insécable...
            b_compter_le_mot_apres = TRUE

        case chr(9)                                                                  ' Si ce caractère est une tabulation...
            b_compter_le_mot_apres = TRUE

        case chr(13)                                                                 ' Si ce caractère est un retour chariot...
            i_nombre_retour_chariot = i_nombre_retour_chariot + 1
            b_compter_le_mot_apres  = TRUE

            if (i >= 2) then
                if (mid(string_texte, i - 1, 1) = "-") then                          ' Pour ne pas compter en double les mots coupés par un tiret à la suite d'un retour à la ligne.
                    b_compter_le_mot_apres = FALSE
                end if
            end if

        case chr(10)                                                                 ' Si ce caractère est un saut de ligne...
            i_nombre_saut_de_ligne = i_nombre_saut_de_ligne + 1
            b_compter_le_mot_apres = TRUE

            if (i >= 3) then
                if (mid(string_texte, i - 2, 2) = "-" & chr(13)) then                ' Pour ne pas compter en double les mots coupés par un tiret à la suite d'un retour à la ligne.
                    b_compter_le_mot_apres = FALSE
                else
                    if (mid(string_texte, i - 1, 1) = "-") then
                        b_compter_le_mot_apres = FALSE
                    end if
                end if
            end if

        case ":", ";", "!", "¡", "?", "¿", chr(34), chr(171), chr(187)               ' Si ce caractère est un signe de ponctuation double... (qui nécessite un espace avant)
            b_compter_le_mot_apres = TRUE                                            ' (34 = ") (171 = «) (187 = »)

        case ".", ","                                                                ' Si ce caractère est un signe de ponctuation simple... (qui ne nécessite pas un espace avant)
            b_compter_le_mot_apres = TRUE

            if (i >= 2) then                                                         ' Pour ne pas compter comme plusieurs mots les chiffres séparés par des points ou des virgules.
                if (isnumeric(mid(string_texte, i - 1, 1)) = TRUE) then
                    if (i <=  i_longueur_texte - 1) then
                        if (isnumeric(mid(string_texte, i + 1, 1)) = TRUE) then
                            b_compter_le_mot_apres = FALSE
                        end if
                    end if
                end if
            end if

        case chr(39), chr(146)                                                       ' Pour ne pas compter les apostrophes, qu'ils soient ou non séparés du mot.
            b_compter_le_mot_apres = TRUE                                            ' (39 = ', 146 = ’)

        case "-"
            i_nombre_mot_compose   = i_nombre_mot_compose + 1
            b_compter_le_mot_apres = TRUE

            if (i <=  i_longueur_texte - 2) then
                if (mid(string_texte, i, 3) = "-t-") then                            ' Pour ne pas compter le "t" d'un "-t-".
                    i_nombre_mot_compose   = i_nombre_mot_compose - 1
                    b_compter_le_mot_apres = FALSE
                end  if
            end if

            if (i <=  i_longueur_texte - 1) then
                c_caractere = mid(string_texte, i + 1, 1)
                if (c_caractere = chr(13)) OR (c_caractere = chr(10)) then           ' Pour ne pas compter en double les mots coupés par un tiret à la suite d'un retour à la ligne.
                    i_nombre_mot_compose   = i_nombre_mot_compose - 1
                    i_nombre_mot_coupe     = i_nombre_mot_coupe   + 1
                    b_compter_le_mot_apres = FALSE
                end if
            end if

        case "(", ")", "[", "]", "{", "}"                                            ' Pour ne pas compter les parenthèses, qu'elles soient ou non séparées du mot.
            b_compter_le_mot_apres = TRUE

        case "+", "×", "/", "\", "%", "‰", "=", "<", ">"                             ' Pour ne pas compter ces signes comme un mot s'ils sont isolés.
            b_compter_le_mot_apres = TRUE

        case "_", "–", "—", "¬", "¯", "•", "#", "*", "`", "´", "~", "˜ ", "|", "¦"
            b_compter_le_mot_apres = TRUE

        case "@", "‚", "ƒ", "„", "…", "†","‡", "^", "¨", "Š", "‹", "›", "º", "ª"
            b_compter_le_mot_apres = TRUE

        case "‘", "“", "”", "§", "©", "®", "™", "ª", "°", "§", "µ", "¶", "·", "¸"
            b_compter_le_mot_apres = TRUE

        case "±", "¹", "²", "³"
            b_compter_le_mot_apres = TRUE

        case else
            if (b_compter_le_mot_apres = TRUE) then
                i_nombre_mot = i_nombre_mot + 1
            else
                if (b_premier_mot = TRUE) then
                    i_nombre_mot  = i_nombre_mot + 1
                    b_premier_mot = FALSE
                end if
            end if

            b_compter_le_mot_apres = FALSE
   end select
next i

if (i_nombre_retour_chariot = i_nombre_saut_de_ligne) then
    i_nombre_retour_a_la_ligne = i_nombre_retour_chariot
else
    if (i_nombre_retour_chariot > i_nombre_saut_de_ligne) then
        i_nombre_retour_a_la_ligne = i_nombre_retour_chariot
    else
        i_nombre_retour_a_la_ligne = i_nombre_saut_de_ligne
    end if
end if

msgbox "Statistiques :"                                                                                                                                                     & chr(13) & _
                                                                                                                                                                              chr(13) & _
       "- "  & "Nombre de mots = "               & i_nombre_mot               & " ("                     & i_nombre_mot - i_nombre_mot_compose & " à " & i_nombre_mot & ")" & chr(13) & _
                                                                                                                                                                              chr(13) & _
       "   " & "(Incertitude de "                & i_nombre_mot_compose       & " mot(s) car il y a "    & i_nombre_mot_compose                & " mot(s) composé(s)."      & chr(13) & _
       "   " & " Dans un mot composé, on compte seulement les"                                                                                                              & chr(13) & _
       "   " & " mots qui peuvent exister de manière indépendante :"                                                                                                        & chr(13) & _
       "   " & " - grand-mère                                  = 2 mots"                                                                                                    & chr(13) & _
       "   " & " - c'est-à-dire                                   = 4 mots"                                                                                                 & chr(13) & _
       "   " & " - tout-à-l'égout                              = 4 mots"                                                                                                    & chr(13) & _
       "   " & " - socio-économique                      = 1 mot  (économique)"                                                                                             & chr(13) & _
       "   " & " - anti-inflammatoire                      = 1 mot  (inflammatoire)"                                                                                        & chr(13) & _
       "   " & " - delta-4-epi-androstène-di-one = 3 mots (delta, 4, androstène)"                                                                                           & chr(13) & _
       "   " & " Cette macro n'est pas capable de faire cette différence,"                                                                                                  & chr(13) & _
       "   " & " elle compte tous les mots composés comme plusieurs mots)"                                                                                                  & chr(13) & _
                                                                                                                                                                              chr(13) & _
       "   " & "(Pour connaître le nombre exacte de mots,"                                                                                                                  & chr(13) & _
       "   " & " il vous faut lancer une recherche sur le caractère tiret (""-""),"                                                                                         & chr(13) & _
       "   " & " et compter les mots composés un par un)"                                                                                                                   & chr(13) & _
                                                                                                                                                                              chr(13) & _
       "- "  & "Nombre de mots coupés = "        & i_nombre_mot_coupe                                                                                                       & chr(13) & _
       "   " & "(Mots coupés par un tiret puis un retour à la ligne)"                                                                                                       & chr(13) & _
                                                                                                                                                                              chr(13) & _
       "- "  & "Nombre de retours à la ligne = " & i_nombre_retour_a_la_ligne                                                                                               & chr(13) & _     
       "   " & "(Dont "                          & i_nombre_retour_chariot    & " retour(s) chariot et " & i_nombre_saut_de_ligne              & " saut(s) de ligne)"       & chr(13) & _
                                                                                                                                                                              chr(13) & _
       "- "  & "Nombre de caractères = "         & i_longueur_texte

End Sub

Vous pouvez essayer. Si vous voulez prévenir tout risque, faites une copie de votre profil utilisateur LO. Mais peu de risques à mon avis.

Ensuite, aller dans Outils > Macros > Gérer les macros > Basic et coller le code dans le Module1 de la librairie Standard.

Puis sélectionner le texte si nécessaire et lancer la macro avec le menu Outils > Macros > Exécuter la macro et sélectionner la macro qui a été ajoutée (Main).

Je viens d’essayer la macro et elle fonctionne. En revanche, la macro formatée dans la réponse n’était pas complète, il faut sélectionner tout le contenu et le coller dans une librairie de macro.

Pas assez de place dans le commentaire donc je l’ai ajouté dans la réponse.