Предложение возвращает пустой словарь от gensim.corpora - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь изменить пример из этого поста , который применяет tf-idf.

from sklearn.datasets import fetch_20newsgroups
from gensim.corpora import Dictionary
from gensim.models.tfidfmodel import TfidfModel
from gensim.matutils import sparse2full
import numpy as np
import spacy

nlp  = spacy.load('en_core_web_md')


def keep_token(t):
    return (t.is_alpha and 
            not (t.is_space or t.is_punct or 
                 t.is_stop or t.like_num))

def lemmatize_doc(doc):
    return [ t.lemma_ for t in doc if keep_token(t)]

sentences = ['Pro USB and Analogue Microphone']
docs = [lemmatize_doc(nlp(doc)) for doc in sentences]
docs_dict = Dictionary(docs)
docs_dict.filter_extremes(no_below=20, no_above=0.2)
docs_dict.compactify()
docs_corpus = [docs_dict.doc2bow(doc) for doc in docs]
model_tfidf = TfidfModel(docs_corpus, id2word=docs_dict)
docs_tfidf  = model_tfidf[docs_corpus]
docs_vecs   = np.vstack([sparse2full(c, len(docs_dict)) for c in docs_tfidf])
tfidf_emb_vecs = np.vstack([nlp(docs_dict[i]).vector for i in range(len(docs_dict))])
docs_emb = np.dot(docs_vecs, tfidf_emb_vecs) 


But I'm getting this error: 

   282     _warn_for_nonsequence(tup)
--> 283     return _nx.concatenate([atleast_2d(_m) for _m in tup], 0)
    284 
    285 

ValueError: need at least one array to concatenate

Причина в том, что эта строка перенастраивает пустой список:

docs_corpus = [docs_dict.doc2bow(doc) for doc in docs]
docs_corpus

Это потому, что словарь пуст:

enter image description here

Но я кормлю диктовку непустым списком

enter image description here

Эту часть я не нахожупричина, по которой это не удается

1 Ответ

1 голос
/ 23 сентября 2019

Проблема в этой строке:

docs_dict.filter_extremes(no_below=20, no_above=0.2)

no_below=20 означает, что все токены со счетом менее 20 во всем корпусе будут удалены из словаря.no_above=0.2 означает, что все токены, встречающиеся в более чем 20 процентах ваших документов, будут удалены из словаря.Поскольку для примера вы использовали только игрушечный документ, все ваши токены будут отфильтрованы.Просто прокомментируйте строку при использовании набора игрушечных документов.

...