1. ホーム
  2. python

[解決済み] Gensim: TypeError: doc2bow expects an array of unicode tokens on the input, not the single string

2022-02-09 12:35:17

質問

Pythonのタスクを始めているのですが、gensimを使用しているときに問題に直面しました。ディスクからファイルをロードして処理しようとしています(ファイルを分割して小文字にします)。

私が持っているコードは以下の通りです。

dictionary_arr=[]
for file_path in glob.glob(os.path.join(path, '*.txt')):
    with open (file_path, "r") as myfile:
        text=myfile.read()
        for words in text.lower().split():
            dictionary_arr.append(words)
dictionary = corpora.Dictionary(dictionary_arr)

リスト(dictionary_arr)には、全ファイルの全単語のリストが含まれており、gensim corpora.Dictionaryを使ってそのリストを処理します。しかし、エラーになります。

TypeError: doc2bow expects an array of unicode tokens on input, not a single string

何が問題なのか理解できないので、少し指導をお願いします。

解決するには?

dictionary.pyの中で、initialize関数は。

def __init__(self, documents=None):
    self.token2id = {} # token -> tokenId
    self.id2token = {} # reverse mapping for token2id; only formed on request, to save memory
    self.dfs = {} # document frequencies: tokenId -> in how many documents this token appeared

    self.num_docs = 0 # number of documents processed
    self.num_pos = 0 # total number of corpus positions
    self.num_nnz = 0 # total number of non-zeroes in the BOW matrix

    if documents is not None:
        self.add_documents(documents)

関数 add_documents 文書のコレクションから辞書を構築する。各文書は、以下のリストである。 トークンの

def add_documents(self, documents):

    for docno, document in enumerate(documents):
        if docno % 10000 == 0:
            logger.info("adding document #%i to %s" % (docno, self))
        _ = self.doc2bow(document, allow_update=True) # ignore the result, here we only care about updating token ids
    logger.info("built %s from %i documents (total %i corpus positions)" %
                 (self, self.num_docs, self.num_pos))

したがって、この方法でDictionaryを初期化した場合、ドキュメントを渡さなければならないが、単一のドキュメントを渡すことはできない。例えば

dic = corpora.Dictionary([a.split()])

はOKです。