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

在基于gensim文件的培训中正确表示包含多个句子的文档,gensim,corpus,doc2vec,sentence,Gensim,Corpus,Doc2vec,Sentence,我尝试使用gensim的基于文件的培训(以下文档中的示例): 然而,我的实际语料库包含许多文档,每个文档包含许多句子。 例如,让我们假设我的语料库是莎士比亚的戏剧——每部戏剧都是一个文档,每个文档都有许多句子,我想学习每部戏剧的嵌入,但单词嵌入只来自同一个句子。 因为基于文件的培训意味着每行一个文档,所以我假设我应该每行放一个剧本。但是,基于文件的培训文档中没有任何包含多个句子的文档示例。 是否有一种方法可以窥视模型内部,以查看在培训之前找到的文档和单词上下文对 建立这个文件、保持句子边界的正确

我尝试使用gensim的基于文件的培训(以下文档中的示例):

然而,我的实际语料库包含许多文档,每个文档包含许多句子。 例如,让我们假设我的语料库是莎士比亚的戏剧——每部戏剧都是一个文档,每个文档都有许多句子,我想学习每部戏剧的嵌入,但单词嵌入只来自同一个句子。 因为基于文件的培训意味着每行一个文档,所以我假设我应该每行放一个剧本。但是,基于文件的培训文档中没有任何包含多个句子的文档示例。 是否有一种方法可以窥视模型内部,以查看在培训之前找到的文档和单词上下文对

建立这个文件、保持句子边界的正确方法是什么


谢谢

这些算法实现对实际语句没有任何真正的理解或依赖。他们只是接收文本——大量的单词标记

通常,提供给
Word2Vec
的文本是多个句子。有时,标点符号(如句子结尾句点)甚至被保留为伪词。(当这些句子在源数据中确实彼此连续时,句子之间重叠的单词上下文窗口甚至可能是一个优势。)

所以你不必担心“保持句子的界限”。你提供的任何文本,如果是真正同时出现的词的合理单位,也会起作用。(特别是在
Word2Vec
FastText
中,即使将文本之间的分隔符更改为句子、段落、章节或文档,也不太可能对最终的单词向量产生太大的影响–它只是更改训练上下文的一个子集,可能不会以任何方式显著更改哪些单词影响其他哪些词。)

但是,在
gensim
中还有另一个实现限制需要注意:每个培训文本的长度只能是10000个标记,如果您提供更大的文本,那么额外的标记将被忽略

因此,请确保使用10k或更短的文本,即使您必须任意拆分更长的文本。(如上所述,令牌分组中的任意额外中断不太可能对结果产生明显影响。)

但是,在
corpus_file
模式下使用
Doc2Vec
会出现一个特殊问题,因为在该模式下,您无法为文本指定首选的
标记。(在此模式下,文本的标记实质上只是行号。)

在原始序列语料库模式中,这个10k标记限制的解决方法只是将较大的文档拆分为多个文档-但对原始文档中的所有子文档使用相同的重复
标记。(这非常接近于任何规模的doc对培训的影响。)

如果您的文档中有超过10k的标记,我建议您不要使用
corpus\u file
模式,或者想出一些方法来使用小于10k标记的逻辑子文档,然后可能将较大的文档建模为它们的子文档集,或者调整下游任务,使其在相同的子文档单元上工作

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)