代码之家  ›  专栏  ›  技术社区  ›  Dan Maharry

如何使用gensim在Windows上运行word2vec

  •  0
  • Dan Maharry  · 技术社区  · 6 年前

    几年前,我的团队的前一个开发人员编写了下面的python代码word2vec,传递了一个培训文件和一个输出文件的位置。他在Linux上工作。我被要求在Windows机器上运行这个程序。铭记 我知道没有巨蟒 ,我已经安装了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()
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   DanS    6 年前

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

    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 )以及导入类( Word2Vec )。它 如果你把它们弄混了就分手。
    • 我没有找到/包括命令行的等效项 -cbow 0 争论。我想这表明了对跳克算法的偏好超过了cbow,但是需要一个拥有更多的 gensim 经验比我更能说明它的后果——或者说是那些把它排除在外的后果。
    • 我也没有包括(或试图复制)原始的Unicode删除逻辑。生成的模型输出基本上是二进制数据,所以照原样来看,(a)几乎是直接掉下来的,(b)让我对它要实现的目标感到相当茫然。

    希望这对你有所帮助。

        2
  •  0
  •   sophros    6 年前

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

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

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

    python.exe your_script_file.py pathToInput pathToOutput