2017-11-12 10 views
-1

nltkから生​​成された単語の配列を関数から戻したいと思います。この関数は1単語しか返しません。返信してコメントを外すと、5単語が返されます。Python関数は1つの値しか返しません。

私はそれらを返却し、他の機能で使用したいと考えています。

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) 

出力は次のようである:

little The print The 
had 
>>> 

または

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

答えて

0

あなたはあまりにも遠くインデントあなたreturn文を持っています。戻るそれアウト1つのレベル:あなたはreturnをコメントアウトし、代わりにprintステートメントを使用する場合

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) 

printfor i in range(num)...で反復ごとに呼び出されます。そのため、5つのプリント出力が得られます。

+0

:「言葉= ARRの[int型((LEN(ARR))*はrandom.Random。私はあなたが1つの単語を選んでいると信じています。その前に印刷されていますので、すべての単語を表示します。 – fernand0

+0

fernand0、引数はありません。 –

+0

行 '#print(word、end = '')'は、変数 'word'にあるものを出力します。直後にarrのランダムな位置を語って'word = arr [int((len(arr))* random.random())]'これを返す。たった一言。だから私の返信はなぜこれがうまくいかないのかを説明する。 – fernand0

0

returnステートメントがforループの範囲内にあるため、1語だけを返します。その最初の反復を行い、wordをランダムに選んですぐに戻します。

これは、私はそれを修正したい方法です - これはまた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

makePairs()関数の条件付き分布を利用しなければなりません。そうでなければ、それは単に句を出力するだけです。 –

関連する問題