Caputo's blog

Informatica, tecnologia, programmazione, fai da te, papercraft e papertoy

Porter Stemming per l’italiano in .NET

maggio 3rd, 2010 by Giovanni Caputo

Lo stemming è una fase di preprocessing per i documenti testuali che trasforma le parole alla forma radice. Uno degli algoritmi più utilizzati per questo scopo è l’algoritmo di Porter. Questo algoritmo è dipendente dalla lingua, questo vuol dire che necessita di differenti implementazioni a secondo della lingua, infatti, tale algoritmo lavora in modo iterativo attraverso la rimozione di suffissi e prefissi che sono dipendenti dalla lingua. Vediamo un esempio per l’inglese:
“computer”, “computational”, “computation” –> “comput”
Gli aspetti negativi di questo algoritmo che non utilizza un dizionario, sono soprattutto i seguenti due. Il primo in cui parole differenti possono essere unificate alla stessa radice, per esempio le parole matto e mattone. Per fortuna questo tipo di casi non è molto frequente. Il secondo invece è che non riesce a riconoscere deviazioni morfologiche della stessa parole, per esempio vado e andiamo.
Vediamo in dettaglio l’algorimo di Porter per l’italiano.

Di seguito riportiamo e regole di sostituzioni per l’italiano:

L’italiano può avere le seguenti vocali accentate: á   é   í   ó   ú   à   è   ì   ò   ù

Per prima cosa, bisogna sostituire tutto gli accenti acuti con quelli gravi, inoltre trasformare in maiuscolo le u dopo la q, e  le u e le i che si trovano tra vocali.

Esempio:

inquietudine à inqUietudine

annoiato à annoIato

A eusto punto le vocali saranno: a   e   i   o   u   à   è   ì   ò   ù

Definiamo R1, R2 e RV di una parola.

R1 è la regione dopo la prima non-vocale seguita da una vocale, oppure è uguale a una regione nulla alla fine della parola, se non ci sono non-vocali.

R2 è la regione dopo la prima non-vocale seguita da una vocale in R1, oppure è uguale alla regione nulla alla fine della parola se non ci sono consonanti.

(la definizione di vocale cambia da lingua a lingua. In francese, è, è una vocale, in italiano, la i tra vocali non è una vocale, da questo si comprende la sostituzione precedente).

Vediamo un esempio di R1 e R2, per una parola inglese:

b   e   a   u   t   i   f   u   l

|<————->|    R1

|<—–>|    R2

La lettera t è la prima non vocale che segue una vocale, quindi R1 è iful. In iful, la prima lettere che segue la vocale è f, quindi, R2 è ul.

RV è definita come segue: se la seconda lettere è una consonante, RV è la regione dopo la coale successiva, o se le prime due lettere sono vocali, RV è la regione dopo la successiva consonante, altrimenti RV è la regione dopo la terza lettera. Se non è possibile trovare queste posizoni allora RV è la fine della parola. Alcuni esempi:

m a c h o     o l i v a     t r a b a j o     á u r e o

|…|         |…|               |…….|             |…|

Continuiamo con le regole di sostituzione:

Effettuare sempre lo step 0 e lo step 1.

Step 0: pronomi

Cercare nella parola il più lungo dei seguenti suffissi:

ci   gli   la   le   li   lo   mi   ne   si   ti   vi   sene   gliela   gliele   glieli   glielo   gliene   mela   mele   meli   melo   mene   tela   tele   teli   telo   tene   cela   cele   celi   celo   cene   vela   vele   veli   velo   vene

che seguono uno tra

(a) and  endo
(b) ar   er   ir

in RV. Nel caso di (a) il suffisso è eliminato, nel caso di (b) e sostituito da e. (guardandogli à guardando, accomodarci à accomodare)

Step 1: Rimozione dei suffissi standard:

Cercare il più lungo suffisso tra quelli seguenti ed effettuare le azioni indicate:

anza   anze   ico   ici   ica   ice   iche   ichi   ismo   ismi   abile   abili   ibile   ibili   ista   iste   isti   istà   istè   istì   oso   osi   osa   ose   mente   atrice   atrici   ante   anti

eliminarle se in R2

azione   azioni   atore   atori rimuoverle se in R2

Se precedetute da ic, rimuoverle se in  R2

logia   logie

sostituire con log se in R2

uzione   uzioni   usione   usioni

sostituire con u se in R2

enza   enze

sostituire con ente se in R2

amento   amenti   imento   imenti

eliminarle se in RV

amente

rimuoverle se in R1

se precedute da iv, rimuoverle se in R2 (and ancora,preceduto da at, rimuoverlo se in R2), altrimenti,

se preceduto da os, ic or abil, rimuoverle se in R2

ità

rimuoverle se in R2

se preceduti da abil, ic or iv, rimuoverli se in R2

ivo   ivi   iva   ive

rimuoverli se in R2

se preceduti da at, rimuoverli se in  R2 (e se ancora preceduti da ic, rimuoverli se in  R2)

Effettuare lo step 2  se nessun suffisso è stato rimosso dallo step 1.

Step 2: Suffissi di verbi

Cercare il più lungo suffisso tra quelli seguenti in RV e se trovato eliminarlo.

ammo   ando   ano   are   arono   asse   assero   assi   assimo   ata   ate   ati   ato   ava   avamo   avano   avate   avi   avo   emmo   enda   ende   endi   endo   erà   erai   eranno   ere   erebbe   erebbero   erei   eremmo   eremo   ereste   eresti   erete   erò   erono   essero   ete   eva   evamo   evano   evate   evi   evo   Yamo   iamo   immo   irà   irai   iranno   ire   irebbe   irebbero   irei   iremmo   iremo   ireste   iresti   irete   irò   irono   isca   iscano   isce   isci   isco   iscono   issero   ita   ite   iti   ito   iva   ivamo   ivano   ivate   ivi   ivo   ono   uta   ute   uti   uto   ar   ir

Effettuare sempre lo step 3 a e 3b.

Step 3a

Rimuovere le finali  a, e, i, o, à, è, ì or ò se non sono in RV, e la precedente i se non è in  RV (crocchi -> crocch, crocchio -> crocch)

Step 3b

Sostistuire le ch (or gh) con c (or g) se in  RV (crocch -> crocc)

Infine,

ripristinare le  I e le U in minuscolo.

In un mio progetto, realizzato in C# e quindi in .NET,  ho dovuto utilizzare un algoritmo che effettuasse questa funzione. Ho inizialmente utilizzato la libreria, presente anche in Lucene.net, dal nome SnowBall. Purtroppo, però, questa libreria non sembra funzionare benissimo.

Dopo varie ricerche ho trovato, quindi, la seguente libreria: Oleander Stemming Library, scritta in C++ e rilasciata con licenza BSD.  In questo caso è stato difficile però utilizzarlo nel mio progetto C#. Ho quindi creato una soluzione per poter configurarla al meglio. Vi rilascio il codice della soluzione e della .dll già compilata per effettuare lo stemming delle stringhe.

Di seguito i link:

Progetto

DLL

Questo post è stato postato lunedì, maggio 3rd, 2010 at 22:13 nella categoria Programmazione. Tags:, , , , .
Puoi seguire tutti i commenti di questo articolo attraverso RSS 2.0 feed. Puoi lasciare un commento, o trackback dal nostro sito.

1 response about “Porter Stemming per l’italiano in .NET”

  1. Diego said:

    ben fatto! bravo caputo!

Lascia un commento

You must be loggati to post a comment.