如何使用 gensim 运行 Windows 上的 word2vec

How to run word2vec on Windows using gensim

几年前,我团队的一位前开发人员编写了以下 Python 调用 word2vec 的代码,传入训练文件和输出文件的位置。他致力于 Linux。我被要求在 Windows 机器上获取此 运行。请记住 我几乎不知道 Python,我已经安装了 Gensim,我猜它现在实现了 word2vec,但不知道如何重写代码以使用该库而不是似乎无法在 Windows 框上编译的可执行文件。有人可以帮我更新此代码吗?

#!/usr/bin/env python3

import os
import csv
import subprocess
import shutil

from gensim.models import word2vec

def train_word2vec(trainFile, output):
    # run word2vec:
    subprocess.run(["word2vec", "-train", trainFile, "-output", output,
                    "-cbow", "0", "-window", "10", "-size", "100"],
                   shell=False)
    # Remove some invalid unicode:
    with open(output, 'rb') as input_,\
         open('%s.new' % output, 'w') as new_output:
        for line in input_:
            try:
                print(line.decode('utf-8'), file=new_output, end='')
            except UnicodeDecodeError:
                print(line)
                pass
    shutil.move('%s.new' % output, output)

def main():
    train_word2vec("c:/temp/wc/test1_BigF.txt", "c:/temp/wc/test1_w2v_model.txt")

if __name__ == '__main__':
    main()

首先,您需要发布不完整的代码,或者您的脚本缺少以下部分,使其能够从命令行获取参数(将其添加到脚本底部):

if __name__ == '__main__':
    import sys
    train_word2vec(sys.argv[1], sys.argv[2])

然后 运行 脚本(Python 被解释,而不是编译)在命令行中(大约)以下列方式:

python.exe your_script_file.py pathToInput pathToOutput

我认为你所追求的核心是这样的:

import sys

from gensim.models.word2vec import Word2Vec

def train_word2vec(trainFile, output):
    # compile word arrays for each sentence of input vocab
    sentences = list(line.split() for line in open(trainFile))

    # effective executable invocation of original code (included for reference)
    # word2vec -train {trainFile} -output {output} -cbow 0 -window 10 -size 100

    # invocation via word2vec module with (mostly) equivalent params
    model = Word2Vec(sentences, size=100, window=10, min_count=1, workers=4)

    # save generated model        
    model.save(output)

if __name__ == '__main__':
    train_word2vec(sys.argv[1], sys.argv[2])

另存为train.py调用如下:

python train.py input.txt output.txt

注意几点:

  • 模块名称 (word2vec) 和导入的 class (Word2Vec) 的名称大小写不同。如果你把它们混在一起,崩溃。
  • 我没有 found/included 命令行 -cbow 0 参数的等价物。我猜想这表明 Skip-gram 算法比 CBOW 更受欢迎,但需要比我有更多 gensim 经验的人来就其后果提出建议 - 或者实际上是那些将其排除在外的人。
  • 我也没有包括(或试图复制)原始的 Unicode 删除逻辑。生成的模型输出主要是二进制数据,因此采用 'as is' 它 (a) 几乎立即崩溃并且 (b) 让我对它试图实现的目标一无所知。

希望这对您有所帮助。