2017-07-28 4 views
0

Ich versuche, Synsets von Strings innerhalb einer Liste zu finden. hier ist mein Code:Wie bekomme ich einen Synsets für nur einen String in einer String-Liste?

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 

und hier ist das Ergebnis:

[[[(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')]]] 

aber was, wenn ich will nur ein Synsets einer Zeichenfolge bekommen?

für Beispiele, wenn ich ein Synsets für 'orange' bekommen, werde ich nur und Druck erhalten:

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

wenn ich ein Synsets für 'man' bekommen, werde ich nur bekommen und Druck:

[(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')] 

und so für 'bench'

Ich habe versucht print getSynonyms(word1[0]), aber das Ergebnis ist wirklich seltsam.

Jeder kann helfen? Danke

Antwort

2

Diese Funktion will ein Array, weshalb Sie seltsame Ergebnisse erhalten, die eine einzelne Zeichenfolge übergeben. Wenn Sie ein einzelnes Wort übergeben, sucht es nach Synsets für jeden Buchstaben des Wortes. Sie können jedoch ein Array mit einem Wert übergeben:

print getSynonyms([word1[0]]) 

Sie können auch die Funktion neu schreiben die Out-Schleife zu entfernen, so dass Sie wie einzelne Wörter mit etwas passieren:

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 Dank, Herr, Es klappt. Wo ist die Out-Schleife in meiner Funktion, die ich entfernen muss? – sang

+0

Überprüfen Sie die Bearbeitung - es entfernt im Grunde genommen 'für Daten1 in Wort1:' und korrigiert die Einzüge. Dann sollten Sie in der Lage sein, eine einzige Zeichenfolge zu übergeben 'getSynonyms (" orange ")' –

+0

danke Sir für die zusätzlichen Informationen. aber mein Programm ist es, eine Synsets für eine Liste von Strings zu finden, die zuerst in Token umgewandelt wurden. und als nächstes wird es sein, jeden Strings von 'word1' und' word2' jeweils wie 'i1 -> i2',' i1 -> j2', 'i2 -> j1' und' i2 -> j2' zu vergleichen, um zu finden, ob Es gibt ähnliche Synsets, dann gibt es 'True' zurück. aber noch einmal, vielen Dank, mein Herr – sang

Verwandte Themen