2014-07-09 11 views
5

C'è un modo in Python 2.7 utilizzando NLTK per ottenere solo la parola e non la formattazione aggiuntiva che include "synset" e le parentesi e il "n.01" ecc.?Come posso stampare solo la parola stessa in un synset di WordNet usando Python NLTK?

Per esempio se faccio

 wn.synsets('dog') 

I miei risultati assomigliano:

[Synset('dog.n.01'), Synset('frump.n.01'), Synset('dog.n.03'), Synset('cad.n.01'), Synset('frank.n.02'), Synset('pawl.n.01'), Synset('andiron.n.01'), Synset('chase.v.01')] 

Come posso invece ottenere una lista come questa?

dog 
frump 
cad 
frank 
pawl 
andiron 
chase 

C'è un modo per farlo utilizzando NLTK o devo usare regular expressions? Posso usare regular expressions all'interno di uno script python?

+0

Come da regola 'include "synset" e le parentesi e la "n.01"' '' frank' e chase' non dovrebbe essere parte di l'uscita desiderata? – Braj

+0

non correlato alla domanda ma 'frank' è un sinonimo/abbreviazione di' frankfurter' che è un sinonimo di 'hot dog' o' dog'. Allo stesso modo "cane" come verbo significa "inseguire". – aelfric5578

+0

Vedo un lieve errore ironico incontrare sfumature sottilmente ironiche ... – JonathanHayward

risposta

3

Se si desidera eseguire questa operazione senza le espressioni regolari, è possibile utilizzare una comprensione di lista.

[synset.name.split('.')[0] for synset in wn.synsets('dog') ] 

Quello che stai facendo qui sta dicendo che, per ogni synset restituisce la prima parola prima del punto.

+0

Assicurarsi di usare name() invece di name, NLTK ha cambiato leggermente questa funzione. – frogbandit

3

Prova questa:

for synset in wn.synsets('dog'): 
    print synset.lemmas[0].name 

Si vuole iterare su ogni synset per il cane, e poi stampare il lemma del synset. Tenete a mente che più parole potrebbero allegare alla stessa synset, quindi se si desidera ottenere tutte le parole associate con tutte le synsets per il cane, si potrebbe fare:

for synset in wn.synsets('dog'): 
    for lemma in synset.lemmas: 
     print lemma.name 
+0

Purtroppo, il primo oggetto gettato "instancemethod" non è subscriptable e il secondo snippet genera 'TypeError: 'instancemethod' object is not iter' con NLTK 3.0 – duhaime

+2

@duhaime Quali attributi erano diventati metodi in precedenza. Dovete fare 'synset.lemmas() [0] .name()' – rlms

+0

Mille grazie per il seguito! – duhaime

1

Utilizzando nome lemma potrebbe funzionare, ma c'è un variabili canonica per il nome synset per l'oggetto Synset, provare:

>>> from nltk.corpus import wordnet as wn 
>>> wn.synset('dog.n.1') 
Synset('dog.n.01') 
>>> wn.synset('dog.n.1').name 
'dog.n.01' 
>>> wn.synset('dog.n.1').name.partition('.')[0] 
'dog' 
>>> for ss in wn.synsets('dog'): 
...  print ss.name.partition('.')[0] 
... 
dog 
frump 
dog 
cad 
frank 
pawl 
andiron 
chase 
+0

ti capita di sapere se un metodo simile è disponibile in NLTK 3.0? Sto ricevendo un errore durante l'esecuzione della linea di partizione L'oggetto '' function '' non ha attributo 'partition'' – duhaime

+3

@duhaime, usa 'wn.synset (' dog.n.1 '). Name()' perché NLTK ha cambiato le proprietà di Synset per ottenere funzioni invece. vedi https://github.com/alvations/pywsd/issues/6 – alvas

+0

Eccellente! Questo aiuta un bel po '- grazie! – duhaime