在基于gensim文件的培训中表示包含多个句子的文档的正确方法

问题描述 投票:0回答:1

我正在尝试使用gensim的基于文件的培训(例如,下面的文档中的示例):

from multiprocessing import cpu_count
from gensim.utils import save_as_line_sentence
from gensim.test.utils import get_tmpfile
from gensim.models import Word2Vec, Doc2Vec, FastText
 # Convert any corpus to the needed format: 1 document per line, words delimited by " "
corpus = api.load("text8")
corpus_fname = get_tmpfile("text8-file-sentence.txt")
save_as_line_sentence(corpus, corpus_fname)
 # Choose num of cores that you want to use (let's use all, models scale linearly now!)
num_cores = cpu_count()
 # Train models using all cores
w2v_model = Word2Vec(corpus_file=corpus_fname, workers=num_cores)
d2v_model = Doc2Vec(corpus_file=corpus_fname, workers=num_cores)
ft_model = FastText(corpus_file=corpus_fname, workers=num_cores)

但是,我的实际语料库包含许多文档,每个文档包含许多句子。例如,假设我的语料库是莎士比亚的戏剧-每个戏剧都是一个文档,每个文档都有很多句子,并且我想为每个戏剧学习嵌入,但是词嵌入仅来自同一句子。由于基于文件的培训的目的是每行一份文档,因此我假设我应该每行放一份文件。但是,基于文件的培训文档没有包含多个句子的任何文档的示例。有没有一种方法可以在模型内部窥视,以查看在训练之前已找到的文档和单词上下文对?

构建此文件并保持句子边界的正确方法是什么?

谢谢

gensim corpus doc2vec sentence
1个回答
0
投票
但是,gensim中还有一个实施限制,您需要注意:每个训练文本只能有10,000个令牌长,如果您提供较大的文本,多余的令牌将被忽略。

因此,即使必须任意分割较长的文本,也请确保使用10k或更短的标记文本。 (按以上所述,令牌分组中的任何此类任意额外中断都不太可能对结果产生明显影响。)

但是,在Doc2Vec模式下使用corpus_file会带来一个特殊的问题,因为在该模式下,您无需为文本指定首选的tags。 (在此模式下,文本的标签实际上只是行号。)

在原始序列语料库模式下,此10k令牌限制的解决方法是将较大的文档分解为多个文档-但对原始文档中的所有子文档都使用相同的重复tags。 (这非常接近任何大小的文档将如何影响培训。)

[如果您的文档具有超过10k令牌,我建议您要么不使用corpus_file模式,要么建议使用某种方式使用少于10k令牌的逻辑子文档,然后将较大的文档建模为它们的子文档,或者调整下游任务以在相同的子文档单元上工作。

© www.soinside.com 2019 - 2024. All rights reserved.