LoginSignup
5
3

More than 5 years have passed since last update.

GloVeが出力したモデル(txt)をgensim.word2vecで読み込めるように整形する。

Posted at

GloVeで学習すると、標準のオプションではvector.binとvector.txtが出力される。
これらはgensim.word2vecで読み込めないので、読み込める形式に整形する。

word2vecのフォーマット

区切り文字はスペース

1行目:単語種類数 次元数
2行目以降:単語1 ベクトル1 ベクトル2 ...

上記のようなシンプルなフォーマットとなっている。

GloVeのフォーマット

区切り文字はスペース

単語1 ベクトル1 ベクトル2 ...

上記のように、word2vecの1行目が欠けている。
つまり単語種類数と次元数を1行目に追加することで形式が変換できる。

実装

使い方

$ python glove2word2vec_format.py vector.txt > gensim_vector.txt

出力したものをmodel = word2vec.Word2Vec.load_word2vec_format("./gensim_vectors.txt", binary=False)とすれば読み込める。

ソースコード

glove2word2vec_format.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

def main():
    argvs = sys.argv  # コマンドライン引数を格納したリストの取得
    argc = len(argvs) # 引数の個数

    if (argc != 2):   # 引数が足りない場合は、その旨を表示
        print('Usage: # python %s filename' % argvs[0])
        quit()

    line_count = 0 # 行数
    vector_size = 0 # 次元数
    # 1度目のファイルアクセスで、行数と次元数を確認
    with open(argvs[1], "r") as fin:
        for line in fin:
            line_count += 1
        # 最後に次元数を確認
        vector = line.rstrip().split(' ')
        vector_size = len(vector) - 1
    # 2度目のファイルアクセスで、word2vec形式のものを標準出力
    with open(argvs[1], "r") as fin:
        print(line_count, vector_size)
        for line in fin:
            print(line, end="")

if __name__ == "__main__":
    main()

出来なかったこと

バイナリファイルを開いて、word2vec形式に変換したかった。
バイナリファイルの開き方が知識不足により実現できなかった。

5
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3