Ввод в mydict.doc2bow
, кажется, не правильно. Требуется список строк, а не одна строка. Список строк, являющихся документом.
Сценарий 1
Если вы считаете, что каждое имя столбца является документом (т. Е. Документ 1 равен ["word"]
), то вы можете сделать:
[mydict.doc2bow([col], allow_update=True) for col in tmp.columns]
# [[(0, 1)], [(1, 1)], [(2, 1)], [(3, 1)], [(4, 1)], [(5, 1)]]
Это шесть документов (каждый подсписок) только с одним словом. Кортежи в подсписке указывают (word_id, frequency)
. Таким образом, первый документ содержит word0
один раз. Второй документ содержит word1
один раз и т. Д. c.
Сценарий 2
Если вы считаете имена столбцов одним документом, то вы можете сделать:
mydict.doc2bow(tmp.columns, allow_update=True)
# [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]
Если ваш корпус состоит из одного документа, который содержит от word0
до word5
всего один раз
Немного фона
Вместо работы со строками ("токенами") непосредственно, как «слово», «дом», и т. д. c, gensim
использует целые числа, которые представляют строку. Эти целые числа являются идентификаторами слов. Чтобы увидеть, какое слово соответствует какому идентификатору, вы можете использовать:
mydict.token2id['word']
# 0
Мешок слов представляется как кортеж с (word_id, frequency)
, потому что любое данное слово может встречаться в документе несколько раз. Особенно в более длинных документах одно слово может появляться 100 раз.
Вместо того, чтобы сохранять ссылку на это слово 100 раз, gensim умнее и вместо этого сохраняет (word_id, 100)
. Это означает, что какое-то слово встречается в документе 100 раз.