在 gensim word2vec 中使用 PathLineSentences 嵌入多词 ngram 短语

Embedding multiword ngram phrases with PathLineSentences in gensim word2vec

我有大约 82 个 gzip 文件(每个大约 180MB,总共 14GB),每个文件都包含换行分隔的句子。我正在考虑将 PathLineSentences from gensim Word2Vec to train word2vec model on the vocabularies. In that way 列表用于 RAM。

现在我还想让嵌入包含多词短语。但是从 documentation 来看,我似乎需要一个已经训练好的短语检测器和我拥有的所有句子,例如

from gensim.models import Phrases
# Train a bigram detector.
bigram_transformer = Phrases(all_sentences)
# Apply the trained MWE detector to a corpus, using the result to train a Word2vec model.
model = Word2Vec(bigram_transformer[all_sentences], min_count=1)

现在,我有两个问题:

  1. 有什么方法可以在 运行 Word2Vec 以流式传输的方式在每个单独的文件之上进行短语检测?
  2. 如果不是,有没有什么方法可以像 PathLineSentences 一样以流式方式进行短语检测,以类似的方式进行初始短语检测?

Gensim Phrases class 将接受与 Word2Vec 完全相同形式的数据:所有标记化文本的可迭代。

您可以提供它作为初始训练语料库,然后作为要转换为成对二元语法的语料库。

但是,我强烈建议您 不要 尝试在同时流中进行短语组合作为馈送 Word2Vec,出于清晰和效率的原因.

相反,进行一次转换,将结果写入一个新的单一语料库文件。那么:

  • 您可以轻松查看二元组合的结果
  • 决定组合哪些单词的逐对计算将只进行一次,创建一个由 space 分隔的标记组成的简单语料库。 (否则,`Word2Vec 完成的每个 epochs + 1 遍都需要重复相同的计算。)

大致是这样的:

with open('corpus.txt', 'w') as of:
    for phrased_sentence in bigram_transformer[all_sentences]:
        of.write(' '.join(phrased_sentence)
        of.write('\n')

(如果您愿意,您可以改为使用 GzipFilesmart_open 的 gzip 功能写入 gzip 文件,如 corpus.txt.gz。)

然后新文件会向您显示 Word2Vec 正在运行的确切数据,并且可以作为简单的语料库提供 - 用 LineSentence 包装为可迭代对象,甚至使用 corpus_file 选项可以更好地使用更多 workers 个线程。