2017-11-12 4 views
-1

ich möchte von der Funktion ein Array von Wörtern aus nltk.Why zurückgegeben diese Funktion nur ein Wort zurückgibt, und wenn ich die Rückkehr kommentieren und kommentieren der Druck gibt die 5 Wörter zurück.Python-Funktion gibt nur einen Wert zurück

Ich möchte sie zurückgeben und sie in einer anderen Funktion verwenden.

file = open('Text/Walden.txt', 'r',encoding="utf8") 
walden = file.read() 
walden = walden.split() 





def makePairs(arr): 
    pairs = [] 
    for i in range(len(arr)): 
     if i < len(arr)-1: 
      temp = (arr[i], arr[i+1]) 
      pairs.append(temp) 
    return pairs 

def generate(cfd, word = 'the', num = 5): 
    for i in range(num): 
     arr = []          # make an array with the words shown by proper count 
     for j in cfd[word]: 
      for k in range(cfd[word][j]): 
       arr.append(j) 

     word = arr[int((len(arr))*random.random())] # choose the word randomly from the conditional distribution 
    print(word, end=' ') 
    return(word) 
      #return random.choices(arr, k=num) 


pairs = makePairs(walden) 
cfd = nltk.ConditionalFreqDist(pairs) 
generate(cfd) 

Der Ausgang ist nun wie folgt aus:

little The print The 
had 
>>> 

oder

But girl?"— print girl?"— 
cases 
>>> 

Antwort

0

Sie haben Ihre return Aussage zu weit eingerückt. Sichern Sie es aus einer Ebene:

def generate(cfd, word = 'the', num = 5): 
    for i in range(num): 
     arr = []          # make an array with the words shown by proper count 
     for j in cfd[word]: 
      for k in range(cfd[word][j]): 
       arr.append(j) 
     #print(word, end=' ') 
     word = arr[int((len(arr))*random.random())] # choose the word randomly from the conditional distribution 

    return(word) 

Wenn Sie Kommentar aus return und verwenden Sie die print Anweisung stattdessen wird print für jede Iteration in for i in range(num)... aufgerufen werden. Deshalb erhalten Sie 5 Druckausgaben.

+0

In dieser Zeile: ‚Wort = arr [int ((len (arr)) * random.random. "Ich glaube, dass Sie ein Wort auswählen. Der Druck ist vor ihm, also zeigen Sie alle Wörter – fernand0

+0

fernand0, keine Argumente dort. Schien wie OP war hauptsächlich damit beschäftigt, warum" Rückkehr "nicht wie erwartet funktioniert - ich denke, die 'print'-Anweisung war hauptsächlich zum Debuggen. –

+0

die Zeile' #print (word, end = '') 'würde was auch immer in der Variablen' word' ausgeben. Gleich danach würde man eine zufällige Position von arr in Worte fassen 'word = arr [int ((len (arr)) * random.random())]' und später gibst du das zurück, das heißt, wenn ich correc bin t nur ein Wort. Also meine Antwort erklären, warum das nicht funktionierte. – fernand0

0

Es gibt nur ein Wort zurück, da sich Ihre return-Anweisung innerhalb der for-Schleife befindet. Es wird durch die erste Iteration gehen, eine word zufällig auswählen und es sofort zurückgeben. Diese

ist, wie ich das Problem beheben würde - das ist auch ein schönes Hotel für random.choices:

def generate(cfd, word = 'the', num = 5): 
    arr = []     
    for j in cfd[word]: # assuming your code to parse cfd is correct 
     for k in range(cfd[word][j]): 
      arr.append(j) 
    return random.choices(arr, k=num) 
+0

es muss die bedingte Verteilung der makePairs() Funktionen verwenden, sonst druckt es nur worw, es ist nicht wie eine Phrase. –

Verwandte Themen