IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

[Algo Lematisation] conseils/aide pour conversion C->Pascal (D7)


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut [Algo Lematisation] conseils/aide pour conversion C->Pascal (D7)
    Bonjour à tous,

    Je cherche depuis quelques temps un algo permettant de faire de la lématisation de mot et voilà qu'aujourd'hui je tombe sur ce site ( http://snowball.tartarus.org/texts/s...soverview.html ) qui propose si j'ai bien compris, un algo par langage pour lematiser automatiquement des mots.

    Mais voilà, je ne suis vraiment pas doué en C et donc impossible pour moi de convertir (où d'utiliser tel quel) le code C en Pascal.

    Est-ce que cela tente quelqu'un de m'aide, me guider, pour en faire une unité pour Delphi ?

    PS : je suis intéressé pour la traduction des algos EN (Porter2), FR en priorité.

    Dans l'attente de vous lire,
    Cordialement,
    Bruno

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Si cela peut aider , voilà l'algo pour le stemming (lématisation) que je chercher à traduire en priorité.

    Merci pour votre aide,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    integers ( p1 p2 )
    booleans ( Y_found )
     
    routines (
        prelude postlude
        mark_regions
        shortv
        R1 R2
        Step_1a Step_1b Step_1c Step_2 Step_3 Step_4 Step_5
        exception1
        exception2
    )
     
    externals ( stem )
     
    groupings ( v v_WXY valid_LI )
     
    stringescapes {}
     
    define v        'aeiouy'
    define v_WXY    v + 'wxY'
     
    define valid_LI 'cdeghkmnrt'
     
    define prelude as (
        unset Y_found
        do ( ['{'}'] delete)
        do ( ['y'] <-'Y' set Y_found)
        do repeat(goto (v ['y']) <-'Y' set Y_found)
    )
     
    define mark_regions as (
        $p1 = limit
        $p2 = limit
        do(
            among (
                'gener'
                'commun'  //  added May 2005
                'arsen'   //  added Nov 2006 (arsenic/arsenal)
                // ... extensions possible here ...
            ) or (gopast v  gopast non-v)
            setmark p1
            gopast v  gopast non-v  setmark p2
        )
    )
     
    backwardmode (
     
        define shortv as (
            ( non-v_WXY v non-v )
            or
            ( non-v v atlimit )
        )
     
        define R1 as $p1 <= cursor
        define R2 as $p2 <= cursor
     
        define Step_1a as (
            try (
                [substring] among (
                    '{'}' '{'}s' '{'}s{'}'
                           (delete)
                )
            )
            [substring] among (
                'sses' (<-'ss')
                'ied' 'ies'
                       ((hop 2 <-'i') or <-'ie')
                's'    (next gopast v delete)
                'us' 'ss'
            )
        )
     
        define Step_1b as (
            [substring] among (
                'eed' 'eedly'
                    (R1 <-'ee')
                'ed' 'edly' 'ing' 'ingly'
                    (
                    test gopast v  delete
                    test substring among(
                        'at' 'bl' 'iz'
                             (<+ 'e')
                        'bb' 'dd' 'ff' 'gg' 'mm' 'nn' 'pp' 'rr' 'tt'
                        // ignoring double c, h, j, k, q, v, w, and x
                             ([next]  delete)
                        ''   (atmark p1  test shortv  <+ 'e')
                    )
                )
            )
        )
     
        define Step_1c as (
            ['y' or 'Y']
            non-v not atlimit
            <-'i'
        )
     
        define Step_2 as (
            [substring] R1 among (
                'tional'  (<-'tion')
                'enci'    (<-'ence')
                'anci'    (<-'ance')
                'abli'    (<-'able')
                'entli'   (<-'ent')
                'izer' 'ization'
                          (<-'ize')
                'ational' 'ation' 'ator'
                          (<-'ate')
                'alism' 'aliti' 'alli'
                          (<-'al')
                'fulness' (<-'ful')
                'ousli' 'ousness'
                          (<-'ous')
                'iveness' 'iviti'
                          (<-'ive')
                'biliti' 'bli'
                          (<-'ble')
                'ogi'     ('l' <-'og')
                'fulli'   (<-'ful')
                'lessli'  (<-'less')
                'li'      (valid_LI delete)
            )
        )
     
        define Step_3 as (
            [substring] R1 among (
                'tional'  (<- 'tion')
                'ational' (<- 'ate')
                'alize'   (<-'al')
                'icate' 'iciti' 'ical'
                          (<-'ic')
                'ful' 'ness'
                          (delete)
                'ative'
                          (R2 delete)  // 'R2' added Dec 2001
            )
        )
     
        define Step_4 as (
            [substring] R2 among (
                'al' 'ance' 'ence' 'er' 'ic' 'able' 'ible' 'ant' 'ement'
                'ment' 'ent' 'ism' 'ate' 'iti' 'ous' 'ive' 'ize'
                          (delete)
                'ion'     ('s' or 't' delete)
            )
        )
     
        define Step_5 as (
            [substring] among (
                'e' (R2 or (R1 not shortv) delete)
                'l' (R2 'l' delete)
            )
        )
     
        define exception2 as (
     
            [substring] atlimit among(
                'inning' 'outing' 'canning' 'herring' 'earring'
                'proceed' 'exceed' 'succeed'
     
                // ... extensions possible here ...
     
            )
        )
    )
     
    define exception1 as (
     
        [substring] atlimit among(
     
            /* special changes: */
     
            'skis'      (<-'ski')
            'skies'     (<-'sky')
            'dying'     (<-'die')
            'lying'     (<-'lie')
            'tying'     (<-'tie')
     
            /* special -LY cases */
     
            'idly'      (<-'idl')
            'gently'    (<-'gentl')
            'ugly'      (<-'ugli')
            'early'     (<-'earli')
            'only'      (<-'onli')
            'singly'    (<-'singl')
     
            // ... extensions possible here ...
     
            /* invariant forms: */
     
            'sky'
            'news'
            'howe'
     
            'atlas' 'cosmos' 'bias' 'andes' // not plural forms
     
            // ... extensions possible here ...
        )
    )
     
    define postlude as (Y_found  repeat(goto (['Y']) <-'y'))
     
    define stem as (
     
        exception1 or
        not hop 3 or (
            do prelude
            do mark_regions
            backwards (
     
                do Step_1a
     
                exception2 or (
     
                    do Step_1b
                    do Step_1c
     
                    do Step_2
                    do Step_3
                    do Step_4
     
                    do Step_5
                )
            )
            do postlude
        )
    )

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    En tout cas bon courage : des variables a, b, z, des GOTO, c'est vraiment pas la panacée du moins pour l'implémentation en C Et le pire dans cette histoire c'est que je trouve l'algo encore plus inbouffable que le code

    Pour ceux que ça intéresse il faut, pour télécharger le projet complet, revenir à l'index du site et aller dans la section download.

    Mais si tu nous en apprenez un peu plus pour commencer sur algo de stemming (lémanisation) à quoi il sert, le principe de fonctionnement, etc...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Bonjour Aka,

    Alors en ce qui concerne la qualité de l'algo, je l'ai choisi pour une raison très simple, parmi les differents algo écrit :
    # Paice/Husk Stemming Algorithm
    # Porter Stemming Algorithm
    # Lovins Stemming Algorithm
    # Dawson Stemming Algorithm
    # Krovetz Stemming Algorithm
    je n'ai trouvé que celui là qui était déjà codé.

    Concernant la qualité de programmation de cet algo, il est vrai que des "Goto" ça fait longtemps que j'en ai pas vu

    Ensuite concernant la lématisation d'un texte, dans mon cas, serait utilisé pour réduire le texte d'un résumé afin de ne garder que les bases des termes et ainsi faire des stats plus concises.

    Par exemple, à l'heure actuelle, je trouve :
    maison => MAISON
    maisonnette => MAISON
    maisonnettes => MAISON
    maisons => MAISON

    ce qui me fait 4 termes pour un concept, et donc 4 frequences à 1, alors que si j'ai la forme lématisée j'aurai une fréquence de 4 pour un terme.
    Ce qui me permet de faire ressortir plus facilement un concept.

    Bref, c'est très théorique tout cela, et j'en suis qu'au début....

    Biensûr si quelqu'un a déjà une unité de stemming à me proposer, je suis preneur

    D'avance merci encore pour vos conseils,
    Amitiés,
    Bruno

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    A la vérité j'ai vu qu'il y avait une version pour Java, je crois qu'il faudrait mieux zieuter celle-là ce serait peut-être moins le bordel parce que rien que pour retranscrire l'élément le plus basique SN_env, ben j'y arrives pas mais bon il y a peut-être des gens plus habitués à la conversion de programme C/C++ vers Delphi.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Je n'ai pas trouvé la version Java dont vous parlez mais j'ai vu qu'une version C# était dispo à l'adresse suivante :

    http://snowball.tartarus.org/otherlangs/english_cpp.txt

    mais il semble que son utilisation sot sous licence, et bon pour l'instant je ne peux me permettre d'acheter quoi que ce soit.

    Le projet d'origine de conversion continue donc pour moi.

    amitiés,
    Bruno

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Pour le Java c'est par ici mais s'il y a une version C# alors c'est encore plus simple pour tenter une migration

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    j'ai envoyé un mail à l'auteur du C#, donc si vous avez une petite minute pour la conversion je suis preneur de votre aide.

    dans l'attente de vous lire,

    Cordialement,
    Bruno

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Oulah, oulah déjà je pense qu'il faudra plus d'une minute pour le faire, ensuite ce soir pour moi c'est vraiment pas possible. Le mieux c'est que vous essayez vous-même de déblayer le terrain en faisant une première passe et après on pourra discuter des points posant problèmes.

    Indice : vous pouvez considérer l'objet StringBuilder comme une chaîne de caractère simple en Delphi

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    ok, bon ben je sais quoi faire cette nuit

  11. #11
    Membre régulier Avatar de user 56gt8
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 92
    Points
    92
    Par défaut
    les lématiseurs , j'en ai entendu parlé à la fac quand je faisais de la linguistique.Appliqué à un language informatique...yeah...Bonne chance bruno...

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Miracle ! La version Delphi existe !!!

    http://tartarus.org/~martin/PorterStemmer/delphi.txt

    Merci Lionel D.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide pour conversion
    Par Clo72 dans le forum C
    Réponses: 1
    Dernier message: 06/03/2011, 22h01
  2. Aide pour conversion de char* en LPCWSTR
    Par maxetx dans le forum Windows
    Réponses: 1
    Dernier message: 23/01/2009, 12h05
  3. aide pour conversion de script
    Par JauB dans le forum Débuter
    Réponses: 0
    Dernier message: 09/04/2008, 13h11
  4. Aide pour conversion php vers Asp
    Par jidébé dans le forum ASP
    Réponses: 2
    Dernier message: 17/10/2007, 22h10
  5. [sqlbaseserver]demande de conseils/aides pour requêtes
    Par GéniuS77 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 18/03/2004, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo