l'objet de type "générateur" n'a pas de len()
J'ai juste commencé à apprendre le langage python.Je veux écrire un programme dans NLTK qui casse un texte dans unigrams, bigrams.
Par exemple, si l'entrée de texte est:
"Je suis sentiment de tristesse et de déception, en raison d'erreurs"
Fonction est de générer un texte comme:
Je suis-->am sentiment-->triste-->triste et-->, et déçu-->disppointed en raison-->-->erreurs
J'ai écrit du code de l'entrée de texte dans le programme. Voici la fonction que j'essaie:
def gen_bigrams(text):
token = nltk.word_tokenize(review)
bigrams = ngrams(token, 2)
#print Counter(bigrams)
bigram_list = ""
for x in range(0, len(bigrams)):
words = bigrams[x]
bigram_list = bigram_list + words[0]+ " " + words[1]+"-->"
return bigram_list
L'erreur que j'obtiens est...
for x in range(0, len(bigrams)):
TypeError: object of type 'generator' has no len()
Comme le ngram fonction renvoie un générateur, j'ai essayé d'utiliser len(list(bigrams))
mais elle renvoie la valeur 0, donc, je reçois le même message d'erreur. J'ai parlé à d'autres questions sur stackexchange, mais je ne suis toujours pas arriver ronde comment faire pour résoudre ce problème. Je suis bloqué à cette erreur. Aucune solution de contournement, suggestion?.
len(list(bigrams))
retourne 0
, alors que c'est sans doute la question... vous avez probablement besoin de comprendre pourquoi ngrams(token, 2)
ne renvoie aucune valeur.... et mise à jour de la question du titre et le texte en conséquence; pour le moment, le titre est trompeur
for x in bigrams
devrait fonctionner. Alors pas besoin de words = bigrams[x]
. Pourquoi? x
sera votre words
"essayé d'appeler une fonction de liste sur elle pour en extraire le contenu et ensuite à l'aide de len(liste(bigrams))" est le (un des) problème(s), si je vous comprends bien. Vous d'abord d'échappement de la génératrice avec
list
et puis essayer d'appeler len(list(gen))
sur elle à nouveau. Comme le générateur est déjà épuisé, il va les entraîner dans une liste vide.Bienvenue. BTW. bigram_list n'est pas une liste, mais la chaîne. Devrait-il être? Pour la chaîne de caractères que vous pouvez utiliser:
bigram_list += words[0]+ " " + words[1]+"-->"
OriginalL'auteur Vishal Kharde | 2016-04-28
Vous devez vous connecter pour publier un commentaire.
La construction des chaînes par concaténation de valeurs séparées par un séparateur, le mieux est de
str.join
:Noter qu'il n'y aura pas de fin "-->", il faut donc ajouter que, si c'est nécessaire. De cette façon, vous n'avez même pas à penser à la longueur de l'objet iterable que vous utilisez. En général en python qui est presque toujours le cas. Si vous souhaitez effectuer une itération sur un objet iterable, utilisez
for x in iterable:
. Si vous avez besoin de l'index, utilisezénumérer
:OriginalL'auteur Ilja Everilä
bigrams est un générateur de fonction et bigrams.next() est ce que vous donne le n-uplet de vos jetons.
Vous pouvez faire len() sur bigrams.next() mais pas sur le générateur de fonction. La suite est plus sophistiqué code pour faire ce que vous essayez d'atteindre.
for w1, w2 in bigrams:
ounext(bigrams)
, si manuellement l'extraction de valeurs à partir d'un itérateur (pour obtenir une sentinelle de la valeur plutôt que, par exemple).except StopIteration:
est presque toujours un signe que quelque chose ne va pas.OriginalL'auteur MohitC