Как запустить word2vec в Windows с помощью gensim - PullRequest
0 голосов
/ 12 декабря 2018

Пару лет назад предыдущий разработчик из моей команды написал следующий код 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()

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Я думаю, что ядро ​​того, что вам нужно, выглядит примерно так:

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.Я предполагаю, что это указывает на предпочтение алгоритму Skip-грамм по сравнению с CBOW, но потребуется кто-то с большим опытом работы gensim, чем я, чтобы посоветовать его последствия - или даже те, кто его пропустил.
  • НиЯ включил (или попытался воспроизвести) логику удаления Unicode оригинала.Сгенерированный вывод модели в основном представляет собой двоичные данные, поэтому, взятые «как есть», они (а) сразу падают и (б) оставляют меня в неведении относительно того, чего она даже пытается достичь.

Надеюсь, это все равно немного поможет.

0 голосов
/ 12 декабря 2018

Перво-наперво, вам нужно, чтобы вы опубликовали неполный код, или в вашем скрипте отсутствует следующая часть, которая позволяет ему принимать аргументы из командной строки (добавить его внизу скрипта):

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

Затем запустите сценарий (Python интерпретируется, а не компилируется) в командной строке (приблизительно) следующим образом:

python.exe your_script_file.py pathToInput pathToOutput
...