Генсим корпус из разреженной матрицы - PullRequest
0 голосов
/ 11 марта 2020

У меня есть фрейм данных, подобный этому

import pandas as pd
from gensim.corpora import Dictionary

tmp = pd.DataFrame({"word":  [1, 0, 0, 0, 0, 0],
                    "house": [0, 1, 0, 0, 0, 0],
                    "tree":  [0, 0, 1, 0, 0, 1], # occurred twice
                    "car":   [0, 0, 0, 1, 0, 0],
                    "food":  [0, 0, 0, 0, 1, 0],
                    "train": [0, 0, 0, 0, 0, 1]})
mydict = gensim.corpora.Dictionary()

, из этого я хочу создать gensim корпус.

Я пытался mycorp = [mydict.doc2bow(col, allow_update=True) for col in tmp.columns], но в результате получается корпус не был правильно создан:

TypeError: doc2bow ожидает массив входных токенов Unicode, а не одну строку

Может кто-нибудь помочь мне с этим? Я хотел бы, чтобы результирующий словарь представлял тот факт, что слово «дерево» встречалось дважды в этом фрейме данных (т.е. сумма столбца).

1 Ответ

1 голос
/ 11 марта 2020

Ввод в 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 раз.

...