Почему я получаю «ValueError: невозможно вычислить LDA для пустой коллекции (без терминов)» в Python? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь сгенерировать модель скрытого распределения Дирихле, используя 4999 различных текстовых сообщений. Одна часть моего кода выглядит следующим образом:

txtsPath = "/.../txt"

docs = []

for filename in os.listdir(txtsPath):
    file = os.path.join(txtsPath,filename)
    body = open(file, encoding="utf8").read()
    docs.append(body)

#print(docs)

import nltk.data
from nltk.stem.wordnet import WordNetLemmatizer
from nltk.tokenize import RegexpTokenizer

def docs_preprocessor(docs):
    tokenizer = RegexpTokenizer(r'\w+')
    #tokenizer = nltk.data.load('tokenizers/punkt/spanish.pickle')
    for idx in range(len(docs)):
        docs[idx] = str(docs[idx]).lower()  # Convert to lowercase.
        docs[idx] = tokenizer.tokenize(docs[idx])  # Split into words.

    # Remove numbers, but not words that contain numbers.
    docs = [[token for token in doc if not token.isdigit()] for doc in docs]

    # Remove words that are only one character.
    docs = [[token for token in doc if len(token) > 3] for doc in docs]

    # Lemmatize all words in documents.
    lemmatizer = WordNetLemmatizer()
    docs = [[lemmatizer.lemmatize(token) for token in doc] for doc in docs]

    return docs

docs = docs_preprocessor(docs)
#print(docs)


# Create Biagram & Trigram Models
from gensim.models import Phrases
from gensim import corpora, models

bigram = Phrases(docs, min_count=10)
trigram = Phrases(bigram[docs])

for idx in range(len(docs)):
    for token in bigram[docs[idx]]:
        if '_' in token:
            # Token is a bigram, add to document.
            docs[idx].append(token)
    for token in trigram[docs[idx]]:
        if '_' in token:
            # Token is a bigram, add to document.
            docs[idx].append(token)

dictionary = Dictionary(docs)
dictionary.filter_extremes(no_below=10, no_above=0.2)

# Create dictionary and corpus required for Topic Modeling
corpus = [dictionary.doc2bow(doc) for doc in docs]
print('Number of unique tokens: %d' % len(dictionary))
print('Number of documents: %d' % len(corpus))
#print(corpus[:1])

#temp = dictionary[0]
id2word = dictionary.id2token
model = models.ldamodel.LdaModel(corpus,num_topics=15,id2word=id2word)

print(model.print_topics(num_topics=15))

topics = (model.print_topics(num_topics=15))

with open('/.../topics.txt',"w+") as f:
    f.write(str(topics))
    f.close()

И это дает мне следующую ошибку:

Traceback (most recent call last):
  File "/.../scriptLDA.py", line 87, in <module>
    model = models.ldamodel.LdaModel(corpus,num_topics=15,id2word=id2word)
  File "/.../.local/lib/python3.6/site-packages/gensim/models/ldamodel.py", line 441, in __init__
    raise ValueError("cannot compute LDA over an empty collection (no terms)")
ValueError: cannot compute LDA over an empty collection (no terms)

Может кто-нибудь исправить это для меня?

И один Последний вопрос: если генерируемая модель содержит тексты на двух разных языках, существует ли простой способ удалить стоп-слова из обоих языков?

Спасибо!

...