1
votes

Pourquoi j'obtiens RuntimeError: Generator a déclenché StopIteration? et comment le résoudre?

Je crée des bigrammes des jetons stockés dans la liste docToken.

StopIteration                             Traceback (most recent call last) 
~\Anaconda3\lib\site-packages\nltk\util.py in ngrams(sequence, n, pad_left, 
  pad_right, left_pad_symbol, right_pad_symbol)
        467     while n > 1:
    --> 468         history.append(next(sequence))
        469         n -= 1

StopIteration: 

The above exception was the direct cause of the following exception:

RuntimeError                              Traceback (most recent call last)
<ipython-input-76-8982951528bd> in <module>()
      1 bigram=[]
      2 for i in range(5000):
----> 3     ls=list(nltk.bigrams(docToken[i]))
      4     for j in ls:
      5         bigram.append(list(j))

~\Anaconda3\lib\site-packages\nltk\util.py in bigrams(sequence, **kwargs)
    489     """
    490 
--> 491     for item in ngrams(sequence, 2, **kwargs):
    492         yield item
    493 

RuntimeError: generator raised StopIteration

Résultat: ['somnolent', 'compte', 'juste', 'homme', 'fatigué', 'twitter', 'cas', 'romney', 'candidat', 'regarde']

bigram=[]
for i in range(5000):
    ls=list(nltk.bigrams(docToken[i]))
    for j in ls:
        bigram.append(list(j))

Résultat: [('sleepy', 'account'), ('account', 'just'), ('just', 'man'), ('homme', 'fatigué'), ('fatigué', 'twitter'), ('twitter', 'cas'), ('cas', 'romney'), ('romney', 'candidat'), ('candidat', 'regarde')]

et lorsque j'utilise nltk.bigrams (docToken [i]) dans une boucle, j'obtiens une erreur de suivi sur la plage> = 1000:

XXX

cela fonctionne très bien lorsque la plage (500) dans la première boucle, mais lorsque la plage est de 1000 ou plus, cela me donne l'erreur suivante:

list(nltk.bigrams(docToken[520]))


2 commentaires

Quelle version de Python utilisez-vous?


J'utilise python 3.7.0


3 Réponses :


2
votes

Je n'ai pas pu résoudre cette erreur. Je ne sais pas pourquoi nltk.bigrams (docToken [i]) génère cela, mais j'ai pu créer des bigrammes en utilisant le code suivant.

bigram={}
for i in range(size):
    ls=[]
    for j in range(len(docToken[i])-1):
        for k in range(j,len(docToken[i])-1):
            ls.append([docToken[i][j],docToken[i][k+1]])

    bigram[i]=ls


0 commentaires

2
votes

J'ai corrigé ce problème en mettant à jour nltk de 3.3 -> 3.4

Faites simple - pip install nltk == 3.4

J'espère que ça marche!


0 commentaires

2
votes

J'ai moi aussi été confronté à la même erreur. Une raison possible peut être que l'un des éléments de docToken est une liste vide.

Par exemple, le code suivant renvoie la même erreur lorsque i = 2 que le le deuxième élément est une liste vide.

[['the_wildlings', 'wildlings_are', 'are_dead'],
 ['do_the',
  'the_dead',
  'dead_frighten',
  'frighten_you',
  'you_ser',
  'ser_waymar']]

Sortie:

docToken= [['the', 'wildlings', 'are', 'dead'], [], ['do', 'the', 'dead', 'frighten', 'you', 'ser', 'waymar']]
docToken = [x for x in docToken if x]
bigram = []
for i in range(len(docToken)):
    bigram.append(["_".join(w) for w in  bigrams(docToken[i])])
bigram

Vous pouvez filtrer les listes vides de docToken puis créez des bigrammes:

0
[('the', 'wildlings'), ('wildlings', 'are'), ('are', 'dead')]
1
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
~\AppData\Local\Continuum\anaconda3\lib\site-packages\nltk\util.py in ngrams(sequence, n, pad_left, pad_right, left_pad_symbol, right_pad_symbol)
    467     while n > 1:
--> 468         history.append(next(sequence))
    469         n -= 1

StopIteration: 

The above exception was the direct cause of the following exception:

RuntimeError                              Traceback (most recent call last)
<ipython-input-58-91f35cae32ed> in <module>
      2 for i in range(3):
      3     print (i)
----> 4     list(nltk.bigrams(docToken[i]))

~\AppData\Local\Continuum\anaconda3\lib\site-packages\nltk\util.py in bigrams(sequence, **kwargs)
    489     """
    490 
--> 491     for item in ngrams(sequence, 2, **kwargs):
    492         yield item
    493 

RuntimeError: generator raised StopIteration

Sortie:

from nltk import bigrams
docToken= [['the', 'wildlings', 'are', 'dead'], [], ['do', 'the', 'dead', 'frighten', 'you', 'ser', 'waymar']]
for i in range(3):
    print (i)
    print (list(nltk.bigrams(docToken[i])))

Une autre raison possible peut être que vous ' re en utilisant nltk 3.3 en python 3.7.

Veuillez utiliser nltk 3.4, c'est la première version avec le support de Python 3.7, votre problème devrait être résolu dans cette version.

Veuillez consulter ici .

p >


0 commentaires