首页 > 解决方案 > Gensim 用大数字标记文档

问题描述

我想用映射到数据库中 id 属性的标签来标记我的文档。例如,ID 也可以是这样的:

文件[0] 例如

TaggedDocument(words=['blabla', 'request'], tags=[225616076])

由于某种原因,它无法构建词汇表。虽然我只有 33382 个具有更高值的唯一 ID/标签,但这没关系,gensim 写道我有“225616077 个标签”(在日志中)。

2018-07-30 12:07:59,271 : INFO : collecting all words and their counts
2018-07-30 12:07:59,273 : INFO : PROGRESS: at example #0, processed 0 words (0/s), 0 word types, 0 tags
2018-07-30 12:07:59,330 : INFO : PROGRESS: at example #1000, processed 7974 words (314086/s), 1975 word types, 225616077 tags
2018-07-30 12:07:59,343 : INFO : PROGRESS: at example #2000, processed 15882 words (701054/s), 2794 word types, 225616077 tags
...

...  
2018-07-30 12:14:56,454 : INFO : estimated required memory for 6765 words and 20 dimensions: 19793760900 bytes
2018-07-30 12:14:56,457 : INFO : resetting layer weights

---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
in <module>()
----> 1 model.build_vocab(documents)

我怎么解决这个问题?我不想从 0 开始,然后将其映射到更高的数字(无用的计算时间)。我还尝试将其标记为字符串(因此文档 [0] 是 TaggedDocument(words=['blabla', 'request'], tags=['225616076'])),但它也不起作用。

我正在检查 gensim 的代码,但无法自行解决。

标签: pythongensimtopic-modelingdoc2vec

解决方案


如果您使用纯 pythonint值作为 doc-tags,那么代码假定您希望这些也是底层向量数组的原始 int 索引——并且将分配一个足够大以容纳最大索引的向量数组——甚至如果许多较低的数字未使用。

这是一种优化,允许代码避免构建通常的标签到索引映射,对于那些已经整齐识别文本的人,从 0 开始编号。

如果您的 ID 从 0 开始不连续,并且不容易以这种方式工作,您可以使用字符串标签,代码将识别这些标签需要映射到唯一的索引位置 - 并且只有一个向量数组将分配正确的大小。

例如,您documents[0]将是:

TaggedDocument(words=['blabla', 'request'], tags=[str(225616076)])

推荐阅读