2017-07-28 2 views
0

J'essaie de trouver des synsets de chaînes dans une liste. voici mon code:comment obtenir un synsets pour une seule chaîne dans une liste de chaînes?

from nltk.corpus import wordnet as wn 
from nltk import pos_tag 

word1 = ['orange','man','bench'] 

def getSynonyms(word1): 
    synonymList1 = [] 
    for data1 in word1: 
     wordnetSynset1 = wn.synsets(data1) 
     tempList1=[] 
     for synset1 in wordnetSynset1: 
      synLemmas = synset1.lemma_names() 
      for i in xrange(len(synLemmas)): 
       word = synLemmas[i].replace('_',' ') 
       if pos_tag(word.split()) not in tempList1: 
        tempList1.append(pos_tag(word.split())) 
     synonymList1.append(tempList1) 
    return synonymList1 

print getSynonyms(word1) 
print 

et voici le résultat:

[[[(u'orange', 'NN')], [(u'orangeness', 'NN')], [(u'orange', 'NN'), 
(u'tree', 'NN')], [(u'Orange', 'NN')], [(u'Orange', 'NNP'), (u'River', 
'NNP')], [(u'orangish', 'JJ')]], [[(u'man', 'NN')], [(u'adult', 'NN'), 
(u'male', 'NN')], [(u'serviceman', 'NN')], [(u'military', 'JJ'), (u'man', 
'NN')], [(u'military', 'JJ'), (u'personnel', 'NNS')], [(u'homo', 'NN')], 
[(u'human', 'JJ'), (u'being', 'VBG')], [(u'human', 'NN')], [(u'valet', 
'NN')], [(u'valet', 'NN'), (u'de', 'IN'), (u'chambre', 'NN')], 
[(u'gentleman', 'NN')], [(u"gentleman's", 'NN'), (u'gentleman', 'NN')], 
[(u'Man', 'NN')], [(u'Isle', 'NNP'), (u'of', 'IN'), (u'Man', 'NNP')], 
[(u'piece', 'NN')], [(u'world', 'NN')], [(u'human', 'JJ'), (u'race', 'NN')], 
[(u'humanity', 'NN')], [(u'humankind', 'NN')], [(u'human', 'JJ'), 
(u'beings', 'NNS')], [(u'humans', 'NNS')], [(u'mankind', 'NN')]], 
[[(u'bench', 'NN')], [(u'terrace', 'NN')], [(u'judiciary', 'NN')], 
[(u'workbench', 'NN')], [(u'work', 'NN'), (u'bench', 'NN')], [(u'Bench', 
'NN')]]] 

mais si je veux juste obtenir un synsets d'une chaîne?

pour des exemples, si je reçois un synsets pour 'orange', je n'obtenir et imprimer:

[(u'orange', 'NN')], [(u'orangeness', 'NN')], [(u'orange', 'NN'), 
(u'tree', 'NN')], [(u'Orange', 'NN')], [(u'Orange', 'NNP'), (u'River', 
'NNP')], [(u'orangish', 'JJ')] 

si je reçois un synsets pour 'man', je vais seulement obtenir et imprimer:

[(u'man', 'NN')], [(u'adult', 'NN'), 
(u'male', 'NN')], [(u'serviceman', 'NN')], [(u'military', 'JJ'), (u'man', 
'NN')], [(u'military', 'JJ'), (u'personnel', 'NNS')], [(u'homo', 'NN')], 
[(u'human', 'JJ'), (u'being', 'VBG')], [(u'human', 'NN')], [(u'valet', 
'NN')], [(u'valet', 'NN'), (u'de', 'IN'), (u'chambre', 'NN')], 
[(u'gentleman', 'NN')], [(u"gentleman's", 'NN'), (u'gentleman', 'NN')], 
[(u'Man', 'NN')], [(u'Isle', 'NNP'), (u'of', 'IN'), (u'Man', 'NNP')], 
[(u'piece', 'NN')], [(u'world', 'NN')], [(u'human', 'JJ'), (u'race', 'NN')], 
[(u'humanity', 'NN')], [(u'humankind', 'NN')], [(u'human', 'JJ'), 
(u'beings', 'NNS')], [(u'humans', 'NNS')], [(u'mankind', 'NN')] 

et il en est de même pour 'bench'

J'ai essayé print getSynonyms(word1[0]) mais le résultat est vraiment bizarre.

Quelqu'un peut-il aider? merci

Répondre

2

Cette fonction nécessite un tableau, c'est pourquoi vous obtenez des résultats bizarres en passant une seule chaîne. Si vous lui passez un seul mot, il recherchera des synsets pour chaque lettre du mot. Vous pouvez passer un tableau avec une valeur bien:

print getSynonyms([word1[0]]) 

Vous pouvez également réécrire la fonction pour supprimer la boucle en vous permettant de passer des mots simples avec quelque chose comme:

def getSynonyms(word): 
    synonymList1 = [] 
    wordnetSynset1 = wn.synsets(word) 
    tempList1=[] 
    for synset1 in wordnetSynset1: 
     synLemmas = synset1.lemma_names() 
     for i in xrange(len(synLemmas)): 
      word = synLemmas[i].replace('_',' ') 
      if pos_tag(word.split()) not in tempList1: 
       tempList1.append(pos_tag(word.split())) 
    synonymList1.append(tempList1) 
    return synonymList1 
+0

wow merci, monsieur, Ça marche. où est la boucle de sortie dans ma fonction que je dois supprimer? – sang

+0

Checkout l'édition - il supprime fondamentalement 'pour data1 dans word1:' et la correction des retraits. Ensuite, vous devriez être en mesure de passer une seule chaîne 'getSynonyms (" orange ")' –

+0

merci monsieur pour les informations supplémentaires. mais mon programme est de trouver un synsets pour une liste de chaînes qui a été marquée au début. et ensuite il sera de comparer chaque chaîne de 'word1' et' word2' respectivement comme 'i1 -> i2',' i1 -> j2', 'i2 -> j1', et' i2 -> j2' pour trouver si il y a un synsets similaire alors il retournera 'True'. mais encore une fois, merci beaucoup, monsieur – sang