2014-05-10 2 views
5

Sto usando il pattern python per ottenere la forma singolare dei nomi inglesi.Un buon modo per aggiungere i termini al pattern python singularize

In [1]: from pattern.en import singularize 
    In [2]: singularize('patterns') 
    Out[2]: 'pattern' 
    In [3]: singularize('gases') 
    Out[3]: 'gase' 

sto risolvendo il problema nel secondo esempio definendo

def my_singularize(strn): 
     ''' 
     Return the singular of a noun. Add special cases to correct pattern generic rules. 
     ''' 
     exceptionDict = {'gases':'gas','spectra':'spectrum','cross':'cross','nuclei':'nucleus'} 
     try: 
      return exceptionDict[strn] 
     except: 
      return singularize(strn) 

C'è un modo migliore per fare questo, per esempio aggiungere alle regole del pattern o rendere lo exceptionDict in qualche modo interno al pattern?

+0

Come puoi aspettarti di prendere tutte le eccezioni nella lingua inglese (parole come nuclei)? Stai usando un numero finito di parole come input e sai tutte loro? Non potrai arrivare da nessuna parte cercando di definire tutte le eccezioni di parole, ti posso garantire. –

+0

Sì, non stavo pensando di cogliere tutte le eccezioni. Tuttavia, il mio corpus è limitato alla letteratura scientifica, che potrebbe renderlo più facile. Immagino che la domanda sia: il pattern ha già un elenco di eccezioni da qualche parte, in modo che io possa aggiungere a questo, invece della mia funzione? – nikosd

+2

perché non usare qualcosa come un lemmatizzatore ?? – shyamupa

risposta

2

Come accennato nei commenti, staresti meglio lemmatizzando le parole. Fa parte di nltk stemming module.

test_words = ['gases', 'spectrum','cross','nuclei'] 
%timeit [wnl.lemmatize(wrd) for wrd in test_words] 

10000 loops, best of 3: 60.5 µs per loop 

rispetto alla funzione

%timeit [my_singularize(wrd) for wrd in test_words] 
1000 loops, best of 3: 162 µs per loop 

NLTK lemmatizing esegue meglio.