Gensim 用大数字标记文档

Gensim tagging documents with big numbers

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

文档[0]例如

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

出于某种原因,无法 build_vocabulary。虽然我只有 33382 个具有更高值的唯一 ids/tags,但这没关系,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 的代码,但无法自行解决。

如果您使用纯 python int 值作为文档标签,那么代码假定您希望这些也是底层向量数组的原始 int 索引——以及一个向量- 将分配足够大的数组来容纳最大的索引——即使许多较低的数字未被使用。

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

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

例如,您的 documents[0] 将是:

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