Entrenamiento de un modelo LDA en gensim: el objeto ‘int’ no es subscriptable.
Creé una nueva lista de palabras en la que se eliminaron las palabras vacías de ‘text8’, para entrenar un Modelo LDA. Sin embargo, recibí el error “TypeError: el objeto ‘int’ no es subscribible”, suponiendo problemas con el corpus y no puedo encontrar las soluciones.
Aquí está el código:
import gensim
import gensim.downloader as api
corpus = api.load('text8')
dictionary = gensim.corpora.Dictionary(corpus) # genera un diccionario a partir del corpus de texto
eliminación de palabras vacías
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
import nltk
nltk.download('stopwords')
nltk.download('punkt')
stop_words = set(stopwords.words('english'))
word_tokens = dictionary
filtered_sentence = []
for w in word_tokens:
if word_tokens[w] not in stop_words:
filtered_sentence.append(word_tokens[w])
print(filtered_sentence)
generar un nuevo diccionario a partir de “filtered_sentence”
dct = gensim.corpora.Dictionary([filtered_sentence])
corpus2 = dct.doc2bow(filtered_sentence)
<code>
La siguiente línea no está funcionando: TypeError: el objeto 'int' no es subscribible
</code>
model = gensim.models.ldamodel.LdaModel(corpus2, num_topics=5, id2word=dct) #TypeError
model.print_topics(num_words=5)
Mensaje de error detallado:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
----> 1 model=gensim.models.ldamodel.LdaModel(corpus2, num_topics=5, id2word=dct) #TypeError: el objeto 'int' no es subscribible
2 model.print_topics(num_words=5)
3 frames
/usr/local/lib/python3.7/dist-packages/gensim/models/ldamodel.py in inference(self, chunk, collect_sstats)
651 # to Blei's original LDA-C code, cool!).
652 for d, doc in enumerate(chunk):
--> 653 if len(doc) > 0 and not isinstance(doc[0][0], six.integer_types + (np.integer,)):
654 # make sure the term IDs are ints, otherwise np will get upset
655 ids = [int(idx) for idx, _ in doc]
TypeError: el objeto 'int' no es subscribible
¡Agradezco mucho tu ayuda! ¡Muchas gracias!
davy.ai
El problema está con el objeto
corpus2
que se genera utilizandodct.doc2bow(filtered_sentence)
. El métododoc2bow()
espera una lista de palabras, perofiltered_sentence
es una lista de IDs de tokens del diccionario.Para solucionar el problema, reemplaza
word_tokens = dictionary
conword_tokens = corpus
. Esto te dará una lista de palabras del corpus de texto, que se pueden filtrar usando las palabras de parada de NLTK y utilizar para generar el objetocorpus2
.Aquí está el código actualizado:
“`import gensim
import gensim.downloader as api
corpus=api.load(‘text8’)
dictionary=gensim.corpora.Dictionary(corpus) # genera un diccionario a partir del corpus de texto
eliminación de las palabras de parada
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
import nltk
nltk.download(‘stopwords’)
nltk.download(‘punkt’)
stop_words = set(stopwords.words(‘english’))
word_tokens = corpus # usar corpus en lugar de diccionario
filtrar las palabras de parada
filtered_sentence = []
for w in word_tokens:
if w not in stop_words:
filtered_sentence.append(w)
generar un nuevo diccionario a partir de “filtered_sentence”
dct=gensim.corpora.Dictionary([filtered_sentence])
corpus2=dct.doc2bow(filtered_sentence)
model=gensim.models.ldamodel.LdaModel(corpus2, num_topics=5, id2word=dct)
model.print_topics(num_words=5)
“`
Ahora el objeto
corpus2
contiene una lista de tuplas, donde cada tupla representa una palabra y su frecuencia en el texto filtrado. Esto se puede utilizar para entrenar el modelo LDA sin ningún problema.