es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema está con el objeto corpus2 que se genera utilizando dct.doc2bow(filtered_sentence). El método doc2bow() espera una lista de palabras, pero filtered_sentence es una lista de IDs de tokens del diccionario.

    Para solucionar el problema, reemplaza word_tokens = dictionary con word_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 objeto corpus2.

    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.

Comments are closed.