[Writer] Compter les mots correctement

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur: Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.

[Writer] Compter les mots correctement

Messagepar ThierryM » 21 Jan 2010 05:37

Bonjour à tous,
Sous OOo (et même WORD 2007), le comptage des mots n'est pas très fiable. Voici donc un bout de code qui permet de compter correctement les mots pour la langue française (respect des apostrophes, pas de comptage de la ponctuation double, tirets) :
Code : Tout sélectionner   AgrandirRéduire
Function ComptageMots()
'Macro permettant de calculer le nombre de caractères spéciaux, des signes particuliers, des mots
'par Thierry Munoz, le 20/01/2010, sous License GNU v3

  ' Comptage des caractères spéciaux, des signes particuliers, des mots
' Les signes de ponctuation encadrés par 2 espaces sont comptabilisés comme un mot
' Ce bogue se retrouve sous WORD et sous OOo aussi avec l'outil statistique !!!
' En effet, la méthode de calcul considère qu'un mot est toujours précédé par un espace
' Cette macro fait les corrections pour ces signes de ponctuation doubles (les anglosaxons ne laissent pas d'espace avant), les guillemets,les parenthèses
' Les apostrophes, les tirets sont pris aussi en compte (ce que ne fait pas OOO nativement, idem pour WORD 2007)

texte=thisComponent.Text.String 'récupère le texte du document (sans les cadres de texte)
longueurTexteBrut=len(texte) 'Nombre total de caractères du texte

EspaceAvant=true 'Variable qui permet de compter le nombre de mots séparés par des espaces
For n = 1 to longueurTexteBrut
   caractere = Mid(texte, n, 1)
    Select Case caractere
      Case " "   ' espaces
            nEsp = nEsp + 1
            'compte les espaces successifs qui n'interviennent pas dans le comptage des mots
            If EspaceAvant Then nEspaceDouble=nEspaceDouble+1
            EspaceAvant=true
      Case Chr(9)   ' tabulations
            nTab = nTab + 1
            EspaceAvant=true
        Case Chr(13)   ' retours à la ligne
            nRet = nRet + 1
            EspaceAvant=true
        Case Chr(10)   ' Sauts de ligne qui inclut les chr(13) !!!
            nSautLig= nSautLig+1
            EspaceAvant=true
        Case ":",";","!","?",Chr(34),Chr(171),Chr(187) 'permet de ne pas compter ces signes comme des mots dont les guillemets
           nSignesPonctuationDouble=nSignesPonctuationDouble + 1
            EspaceAvant=true
        Case ".","," 'Cas de la ponctuation simple qui ne devrait pas avoir d'espace devant
           EspaceAvant=true
        Case "(",")" 'Cas des parenthèses au cas où il y aurait un espace derrière elles
               nParentheses=nParentheses+1
        Case "'" 'Compte le nombre d'apostrophes
           nApostrophes=nApostrophes+1
        Case "-" 'Compte le nombre de tirets
           If EspaceAvant=false then nTiretsMot=nTiretsMot+1              
        Case Else 'Permet le calcul du nombre de mots
           If EspaceAvant then nMots= nMots+1
           EspaceAvant=false
   End Select   
Next n
'Réajustement du nombre réel de mots
nMots=nMots+nApostrophes+nTiretsMot
End Function

Pour plus de détail sur l'obtention de statistiques par macro, voir le fil "[Writer] Affichage des statistiques détaillées d'un texte" dans la section "Suprêmes de code".

En espérant que ça aide la communauté,

Thierry
Edit du 21/01/2010 : Rajout d'une portion de code pour tenir compte des guillemets, des parenthèses ...
LibreOffice Version: 6.0.7.3 version ubuntu / Ubuntu Trusty 18.04 / Pourquoi privilégier les formats de fichiers ouverts ?
ThierryM
Membre cOOnverti
Membre cOOnverti
 
Message(s) : 378
Inscrit le : 26 Nov 2006 12:29
Localisation : Les Corbières

Re: [Writer] Compter les mots correctement

Messagepar Tapio » 14 Avr 2010 11:15

J'aime beaucoup les différents commentaires qui aident à comprendre le code :D
OpenOffice 2.4 sous Windows 7
Tapio
Fraîchement OOthentifié
 
Message(s) : 6
Inscrit le : 09 Avr 2010 16:07

Re: [Writer] Compter les mots correctement

Messagepar Celestus » 26 Juil 2014 20:18

En version corrigée, ça donne ça :
(Vous n'avez plus qu'à faire copié-collé pour que ça marche)

Code : Tout sélectionner   AgrandirRéduire
REM  *****  BASIC  *****

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
Dernière édition par Celestus le 30 Juil 2014 16:10, édité 1 fois.
Celestus
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 12
Inscrit le : 29 Août 2009 17:19

Re: [Writer] Compter les mots correctement

Messagepar Alain de La Chaume » 28 Juil 2014 18:04

Bonjour,
Celestus a écrit:En version corrigée, ça donne ça :
(Vous n'avez plus qu'à faire copié-collé pour que ça marche)

A supposer que la version en cours nécessite des corrections, il serait bien de mentionner lesquelles.
De plus, je trouve le commentaire accompagnant la version dite corrigée pour le moins laconique (...).
Quant à copier-coller n'importe quoi sans vérification, je passe mon tour et je déconseille à quiconque.
(API-culteur et pêcheur de macros en mode loisirs occasionnels, mais toujours les pieds dans l'OO)
AOO 4.1.2 sous Linux Xubuntu Voyager 14.04 (x86_64)
Avatar de l’utilisateur
Alain de La Chaume
HédOOniste
HédOOniste
 
Message(s) : 1527
Inscrit le : 28 Sep 2008 13:56
Localisation : ʇsǝnoo,ꞁ ɐ ʇuǝɯǝʇǝꞁdɯoↃ

Re: [Writer] Compter les mots correctement

Messagepar Celestus » 30 Juil 2014 16:13

Alain de La Chaume a écrit:Bonjour,
Celestus a écrit:En version corrigée, ça donne ça :
(Vous n'avez plus qu'à faire copié-collé pour que ça marche)

A supposer que la version en cours nécessite des corrections, il serait bien de mentionner lesquelles.
De plus, je trouve le commentaire accompagnant la version dite corrigée pour le moins laconique (...).
Quant à copier-coller n'importe quoi sans vérification, je passe mon tour et je déconseille à quiconque.


C'est un code très simple et très documenté.
Copiez-le dans un fichier texte et lisez.

Quand je dis "version corrigée", il s'agit d'une marque d'ironie : la version du début de ce forum présente de nombreuses erreurs de comptage de mots.

La mienne compte correctement, en utilisant les standards de comptage des mots établis par l'académie française, et elle prend en compte tous les caractères de l'ANSI CP1252.
Ce n'est pas une version corrigée, c'est une version complètement réécrite.

J'ai programmé de manière lisible et claire en mettant des commentaires partout. Si vous n'êtes pas neurasthénique, contentez-vous de lire et vous comprendrez.
Sinon copiez et collez et vous verrez que ça marchera (un code viral serait bien plus complexe, il n'y a aucun danger avec ça).

Sinon libre à vous de continuer à utiliser la macro précédente.

Cordialement.
Celestus
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 12
Inscrit le : 29 Août 2009 17:19

Re: [Writer] Compter les mots correctement

Messagepar OlivierR » 31 Juil 2014 11:28

' 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.

Vous pouvez faire la distinction entre les mots liés comme «dis-le» avec les mots composés comme «socio-économique» en faisant appel à l’API du correcteur orthographique.
Il ne faut pas faire usage de la fonction isValid, celle-ci renverra True avec «dis-le» comme avec «socio-économique».

En revanche, vous pouvez faire appel à la fonction spell qui peut vous renvoyer une analyse morphologique du mot que vous passez en paramètre.

Le code est en Python, je ne sais pas comment ça s’écrirait en Basic.

Faire appel au correcteur orthographique :
Code : Tout sélectionner   AgrandirRéduire
ctx= uno.getComponentContext()
xSvMgr = ctx.ServiceManager
xSpellchecker = xSvMgr.createInstanceWithContext("com.sun.star.linguistic2.SpellChecker", ctx)


Récupérer l’analyse morphologique d’un mot (ça fait appel à l’API de Hunspell qui est peu documentée) :
Code : Tout sélectionner   AgrandirRéduire
def isKnownWord (xSpellchecker, xLocale, word):
    x = xSpellchecker.spell("<?xml?><query type='analyze'><word>" + word + "</word></query>", xLocale, ())
    if not x:
        return False
    t = x.getAlternatives()
    if not t:
        return False
    if "po:" in t[0]:
        return True
    return False


La variable “xLocale”, c’est celle que vous récupérez avec un curseur sur le caractère courant avec :
Code : Tout sélectionner   AgrandirRéduire
xLocale = xCursor.CharLocale
LibreOffice 6.2Windows 10Orthographe & GrammaireBépo, le clavier du futur
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1017
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: [Writer] Compter les mots correctement

Messagepar ThierryM » 03 Nov 2014 00:07

Bonjour à tous,
Sans vouloir polémiquer ou rentrer dans un débat stérile, je viens de voir le message pour le moins laconique (et frustrant quand on cherche à apprendre de ses erreurs) de Célestus et j'aurais aimé avoir une explication concernant les erreurs supposées du comptage des mots de ma macro. Il est vrai que ma macro considère tous les mots composés comme des mots indépendants mais mis à part ce détail je ne vois pas où seraient les autres erreurs. D'ailleurs la macro proposée par Celestus n'améliore apparemment pas ce point là. Je partage tout à fait l'avis d'Alain... J'aurais préféré moi aussi un apport plus constructif de Célestus qui ne voulait pas, semble-t-il, que corriger ma version :lol: ...

Pour en revenir au débat (chose plus importante), je persiste à dire que le comptage des mots dans LibreOffice (je n'utilise plus Word pour vérifier avec les dernières versions) est inexact et que ma macro est encore d'actualité (je m'en sers régulièrement dans ma classe). Par exemple pour le texte ci-dessous (tiré d'une dictée, désolé pour la source que je ne trouve plus) :
Les châtaignes
Les congés de la Toussaint, je les passais chez mes grands-parents. Ils habitaient non loin d'un bois. On trouvait dans ce bois de nombreux châtaigniers. Nous y restions de longs moments à remplir nos sacs de châtaignes à la bogue épineuse. J'aimais ce moment de fête. À la maison, nous les triions et les essuyions. Ensuite, nous les décortiquions. Grand-père et grand-mère, avec mon aide, se relayaient pour les faire cuire. « Chauds, les marrons chauds ! » criait mon grand-père, car les châtaignes, une fois cuites, prennent le nom de marrons.

Ma macro recense 97 mots et ma version de LibreOffice (4.3.3.2) 94 alors que si l'on compte les mots-composés pour 1 seul on arrive à 93 (il y a 4 mots composés). Donc dans tous les cas, le résultat retourné par LibreOffice est erroné (c'est soit 93 ou 97 mais pas 94 qui est inexplicable). Je préfère mon comptage : je l'utilise à l'école pour évaluer des dictées et des erreurs de recopiage par rapport au nombre total de mots (dans l'écriture de "grands-parents" je considère que l'élève a écrit 2 mots plutôt qu'un).
Cordialement,

Thierry
LibreOffice Version: 6.0.7.3 version ubuntu / Ubuntu Trusty 18.04 / Pourquoi privilégier les formats de fichiers ouverts ?
ThierryM
Membre cOOnverti
Membre cOOnverti
 
Message(s) : 378
Inscrit le : 26 Nov 2006 12:29
Localisation : Les Corbières

Re: [Writer] Compter les mots correctement

Messagepar PierreDeQuébec » 04 Juil 2018 02:37

Bonjour,

Le fil est vieux mais le sujet d'actualité! Ma solution au problème fut dicter par la paresse. J'utilise la fonction WordCounts de Writer pour obtenir un résultat conforme à l'algorithme de LibreOffice. Le code est le suivant.

D'abord, il faut définir une variable oTmp
Code : Tout sélectionner   AgrandirRéduire
Dim oTmp As Object            ' Un document temporaire.


Ensuite, l'appel à la fonction doit-être précédé par la création d'un document temporaire (non visible)

Code : Tout sélectionner   AgrandirRéduire
        ' Créer un document temporaire.
        oVal(0).Name = "Hidden"
   oVal(0).Value = True
   oVal(1).Name = "MacroExecutionMode"
   oVal(1).Value = com.sun.star.document.MacroExecMode.ALWAYS_EXECUTE_NO_WARN
   oTmp = StarDesktop.loadComponentFromURL( "private:factory/swriter", "_blank", 0, oVal() )


Code : Tout sélectionner   AgrandirRéduire
Function CompterMotsParagraphe (ByRef sTexte As string) As Long

' Paramètres:
' sTexte :               Texte ne contenant qu'un seul paragraphe.
'                     Attention, aucun test n'est fait pour vérifier s'il
'                     n'y a qu'un seul paragraphe.
' Retourne
' 0                     Le paragraphe est vide
' Un nombre > 0            Le nombre de mots.

    Dim oText                                                      ' Pointeur vers le texte dans le fichier temporaire.
    Dim oCursor                                                    ' Curseur dans le fichier temporaire.


   ' Effacer le texte du document temporaire.
   ' La variable pointant vers le document temporaire doit porter le nom oTmp
   ' et être de portée globale.
   oCursor = oTmp.Text.createTextCursor
   oCursor.gotoStartOfParagraph(False)
   oCursor.gotoEndOfParagraph(True)
   oCursor.setString("")
   
   ' Algorithme : Coller le texte du paragraphe dans un document temporaire ne contenant
   ' aucun autre texte et faire usage de la méthode WordCount de Writer.
   CompterMotsParagraphe = 0

   ' Coller le texte passé en argument.
   oText = oTmp.getText()
   oCursor = oText.createTextCursor()
   oText.insertString( oCursor, sTexte, False)
   
   ' Compter les mots!
   CompterMotsParagraphe = oTmp.WordCount()
 
End Function   ' CompterMotsParagraphe


L'appel à la fonction sera similaire à ce qui suit:

vText = ThisComponent.Text ' Le text du document.
vCur = vText.CreateTextCursor() ' Un curseur.
vCur.GoToStart(False)
(Sélectionner votre texte ici avec une méthode du genre vCur.gotoNextParagraph(False).
L'API OO sur le curseur pourra vous aider.)
lCompteMotPara = CompterMotsParagraphe (vCur.GetString())
LibreOffice version: 6.0.3.2, Build ID: 1:6.0.3-0ubuntu1 sur Kubuntu 18.04 LTS bionic. Locale: fr_CA
Noyau 4.15.0-23-generic. Système 64 bits
Avatar de l’utilisateur
PierreDeQuébec
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 10
Inscrit le : 27 Mai 2015 10:48


Retour vers Suprême de code

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité