Python 基于稀疏矩阵的gensim语料库

Python 基于稀疏矩阵的gensim语料库,python,python-3.x,gensim,Python,Python 3.x,Gensim,我有一个这样的数据框 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

我有一个这样的数据框

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)作为tmp.columns中的col]
,但生成的语料库似乎没有正确创建:

TypeError:doc2bow需要输入一个unicode标记数组,而不是一个字符串


有人能帮我吗?我希望生成的字典表示单词“tree”在此数据帧中出现两次(即列的总和)。

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)]]
mydict.doc2bow(tmp.columns, allow_update=True) 
# [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]
这六个文档(每个子列表)只有一个单词。子列表中的元组表示
(word\u id,frequency)
。因此,第一个文档包含一次
word0
。第二个文档包含
word1
一次,等等

情景2

如果您认为列名是单个文档,那么您可以这样做:

[mydict.doc2bow([col], allow_update=True) for col in tmp.columns]
# [[(0, 1)], [(1, 1)], [(2, 1)], [(3, 1)], [(4, 1)], [(5, 1)]]
mydict.doc2bow(tmp.columns, allow_update=True) 
# [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]
其中,语料库由单个文档组成,其中包含一次
word0
word5

一点点背景 与直接处理字符串(“标记”)不同,如“word”、“house”等,
gensim
使用表示字符串的整数。这些整数是单词ID。要查看哪个单词对应哪个id,可以使用:

mydict.token2id['word']
# 0
单词包被表示为一个元组,带有
(word\u id,frequency)
,因为任何给定的单词都可能在文档中出现多次。特别是在较长的文档中,单个单词可能出现100次


gensim聪明地保存了
(word\u id,100)
,而不是将对该单词的引用保存100次。这表示某个单词在文档中出现100次

doc
的值是多少?您可能是指tmp.columns中的col的
mycorp=[mydict.doc2bow([col],allow_update=True)]
您是对的。这就是我的意思——它会产生一条错误信息——我相应地更新了问题谢谢。使用场景1,我想使用矩阵中暗示的权重:“树”已经出现两次——我想在字典中表示这一点;(如何)我可以做到这一点?因为您指的是
tmp.columns
,实际上您的“语料库”中只有一次“tree”,因为您不能有重复的列名。如果您在
mydict.doc2bow(doc)
中使用
doc=[“tree”、“tree”、“word”、“house”]
,那么您可以通过使用
mydict.cfs
查看给定单词在语料库中出现的频率,它提供了一个字典,其中关键字是单词id,值是在语料库中出现的次数。我不知道您的数据是什么样的,但是对于您描述的问题,您输入的唯一相关部分是
['word'、'house'、'tree'、'car'、'food'、'train']
谢谢。有没有办法将上述矩阵处理为
doc1=[“word”]、doc2=[“house”]、doc3=[“tree”、“tree”]
等?是的,
doc=[doc1、doc2、doc3]
然后
yourdict=Dictionary(doc)
yourdict.cfs