2010-09-20 34 views
22

En utilisant NLTK et WordNet, comment convertir un verbe au temps simple en son participe présent, passé ou passé?Utilisation de NLTK et WordNet; comment puis-je convertir un verbe simple en forme de participe présente, passée ou passée?

Par exemple:

Je veux écrire une fonction qui me donnerait verbe forme attendue comme suit.

v = 'go' 
present = present_tense(v) 
print present # prints "going" 

past = past_tense(v) 
print past # prints "went" 
+0

Y at-il personne qui peut répondre à cette question? –

Répondre

17

Je pense que ce que vous cherchez est la bibliothèque NodeBox::Linguistics. Il fait exactement cela:

print en.verb.present("gave") 
>>> give 
+0

Très bien, je pense que je suis à la recherche de celui-ci seulement ... Laissez-moi l'essayer. –

+0

il semble qu'il y a quelques bugs dedans. Par exemple, en.is_verb ("download") renvoie true, mais en.verb.present ("download") signale une erreur – camino

+1

Cette bibliothèque ne fonctionne malheureusement pas pour Python3. – sudo

0

JWI (la bibliothèque WordNet par le MIT) dispose également d'un égrappoir (WordNetStemmer) qui convertit différentes formes morphologiques d'un mot comme (« écrit », « écrit », « écrit ») à leur forme de base. Il semble que cela ne fonctionne que pour les noms (comme les pluriels) et les verbes cependant.

Word Stemming in Java with WordNet and JWNL montre aussi comment faire ce genre de l'aide provenant JWNL, une autre bibliothèque Wordnet basé sur Java:

14

Avec l'aide de NLTK cela peut aussi être fait. Cela peut donner la forme de base du verbe. Mais pas le temps exact, mais ça peut toujours être utile. Essayez le code suivant.

from nltk.stem.wordnet import WordNetLemmatizer 
words = ['gave','went','going','dating'] 
for word in words: 
    print word+"-->"+WordNetLemmatizer().lemmatize(word,'v') 

La sortie est:

gave-->give 
went-->go 
going-->go 
dating-->date 

Jetez un oeil à Stack Overflow question NLTK WordNet Lemmatizer: Shouldn't it lemmatize all inflections of a word?.

+0

Vous devriez être prudent avec les mots dont la deuxième forme est la même que l'infinitif de l'autre verbe. Mon dernier exemple malchanceux est "tombé". WordNetLemmatizer ne le convertit pas en 'chute' car il y a en fait un verbe 'tomber'. Un autre exemple est «ressenti». Et il n'y a aucun moyen de dire au lemmatizer que le verbe est dans sa deuxième forme. – Dany

+0

La réponse à mon commentaire précédent est d'utiliser la méthode "_morphy". Il renvoie la liste des formes de base possibles. Si vous savez que le mot que vous essayez de lemmatiser n'est pas dans sa forme de base, vous pouvez l'exclure de la liste que vous obtenez de '_morphy' et choisir l'un des autres. – Dany

2

pour python3:

git clone https://github.com/clips/pattern 
cd pattern 
git fetch 
git checkout development 
pip install mysqlclient 
python setup.py install 

puis

from pattern.en import conjugate, lemma, lexeme,PRESENT,SG 
print (lemma('gave')) 
print (lexeme('gave')) 
print (conjugate(verb='give',tense=PRESENT,number=SG)) # he/she/it 

cède

give ['give', 'gives', 'giving', 'gave', 'given'] gives

thnks à @Agargara pour pointer & auteurs de Pattern pour leur beau travail, allez les soutenir ;-)