2012-02-10 19 views
16

La quantità prevalente di documentazione NLTK ed esempi è dedicata alla lemmatizzazione e arginare, ma è molto scarsa su tali questioni di normalizzazione come:Esistono classi in NLTK per la normalizzazione e canonizzazione del testo?

  • conversione di tutte le lettere per abbassare o maiuscole
  • rimuovere la punteggiatura
  • la conversione dei numeri in parole
  • rimozione accenti e altri segni diacritici
  • espansione abbreviazioni
  • rimozione di parole non significative o parole "troppo comuni"
  • testo canonica (tumore = tumore, è = è)

Si prega di punto in cui in NLTK scavare me. Qualsiasi equivalente NLTK (JAVA o qualsiasi altro) per gli scopi menzionati sopra è benvenuto. Grazie.

UPD. Ho scritto una libreria python di normalizzazione del testo per gli scopi text-to-speech https://github.com/soshial/text-normalization. Potrebbe andar bene anche a te.

risposta

16

Anche nelle specifiche NLTK vengono risolti molti (sotto) compiti utilizzando puramente python methods.

a) conversione di tutte le lettere di abbassare o maiuscole

text='aiUOd' 
print text.lower() 
>> 'aiuod' 
print text.upper() 
>> 'AIUOD' 

b) rimozione punteggiatura

text='She? Hm, why not!' 
puncts='.?!' 
for sym in puncts: 
    text= text.replace(sym,' ') 
print text 
>> 'She Hm why not ' 

c) convertire i numeri in parole

Qui, non sarebbe quel che dovremmo scrivere a pochiliner, ma ci sono un sacco di soluzioni già esistenti, se lo fai su Google.Code snippets, libraries ecc

d) la rimozione di accenti e altri segni diacritici

guardare in alto punto b), basta creare l'elenco con i segni diacritici come puncts

e) in espansione abbreviazioni

Creare un dizionario con abbreviazioni:

text='USA and GB are ...' 
abbrevs={'USA':'United States','GB':'Great Britain'} 
for abbrev in abbrevs: 
    text= text.replace(abbrev,abbrevs[abbrev]) 
print text 
>> 'United States and Great Britain are ...' 

f) la rimozione di parole non significative o parole "troppo comuni"

Creare un elenco con parole non significative:

text='Mary had a little lamb' 
temp_corpus=text.split(' ') 
stops=['a','the','had'] 
corpus=[token for token in temp_corpus if token not in stops] 
print corpus 
>> ['Mary', 'little', 'lamb'] 

g) canonica di testo (tumore = tumore, è = è)

per tumore - uso tumore regex.

Ultimo, ma non meno importante, si prega di notare che tutti gli esempi sopra di solito hanno bisogno di calibrazione sui testi reali, li ho scritti come la direzione da seguire.

+3

Poiché considero un toolkit NLP, dovrebbe essere in grado di eseguire tutte le operazioni di elaborazione che potrebbero comportare alcuni dati linguistici. Significa che ho pensato e penso ancora che nltk abbia già i dizionari di parole equivalenti, dizionario delle abbreviazioni, canonicalizzazione dict, conversione in numeri di testo, ** date **, temperatura, ** valute ** e così via ... Forse semplicemente non lo sappiamo bene? – soshial

+1

Sono sicuro che non è possibile risolvere la casemapping nel caso generale con solo '.lower()' e '.upper()'. Considera Turco 'I' =' ı', 'İ' =' i'; 'ß' =' SS' tedesco; Greco 'Σ' = sia' ς' che 'σ'. – hippietrail

+0

La risoluzione delle abbreviazioni è rischiosa. Come fai a sapere che "USA" sta per "Stati Uniti"? 'Tu e io: noi!' -> 'Io e te: Stati Uniti!' –

0

Suggerisco di usare stopwords.words() per la rimozione di stopword. Supporta le seguenti lingue: danese, olandese, inglese, francese, tedesco, italiano, norvegese, portoghese, russo, spagnolo, svedese.

0

Potrei essere un po 'in ritardo, ma potrebbe essere utile. Ecco le parole di stop per alcune lingue (inglese, francese, tedesco, finlandese, ungherese, turco, russo, ceco, greco, arabo, cinese, giapponese, coreano, catalano, polacco, ebraico, norvegese, svedese, italiano, portoghese e spagnolo): https://pypi.python.org/pypi/many-stop-words

Problemi correlati