Word2vec-bin-Datei in Text umwandeln

Lesezeit: 6 Minuten

Glenns Benutzer-Avatar
Glenn

Von dem Wort2vec Website kann ich GoogleNews-Vektoren-negative300.bin.gz herunterladen. Die .bin-Datei (ca. 3,4 GB) ist ein für mich nicht nützliches Binärformat. Tomás Mikolov versichert uns dass “Es ziemlich einfach sein sollte, das Binärformat in das Textformat zu konvertieren (obwohl das mehr Speicherplatz benötigt). Überprüfen Sie den Code im Entfernungstool, es ist ziemlich trivial, die Binärdatei zu lesen.” Leider kenne ich nicht genug C, um es zu verstehen http://word2vec.googlecode.com/svn/trunk/distance.c.

Angeblich Gensim kann dies auch tun, aber alle Tutorials, die ich gefunden habe, scheinen sich mit dem Konvertieren zu befassen aus Text, nicht umgekehrt.

Kann jemand Änderungen am C-Code oder Anweisungen für Gensim vorschlagen, um Text auszugeben?

Benutzeravatar von silo
Silo

Ich verwende diesen Code, um das Binärmodell zu laden, und speichere dann das Modell in einer Textdatei.

from gensim.models.keyedvectors import KeyedVectors

model = KeyedVectors.load_word2vec_format('path/to/GoogleNews-vectors-negative300.bin', binary=True)
model.save_word2vec_format('path/to/GoogleNews-vectors-negative300.txt', binary=False)

Verweise: API und nullege.

Notiz:

Der obige Code ist für Neu Gensim-Version. Zum früher Version habe ich diesen Code verwendet:

from gensim.models import word2vec

model = word2vec.Word2Vec.load_word2vec_format('path/to/GoogleNews-vectors-negative300.bin', binary=True)
model.save_word2vec_format('path/to/GoogleNews-vectors-negative300.txt', binary=False)

  • gensim 2.0 hat keine load_word2vec_format Methode für KeyedVectorsaber das hat bei mir funktioniert, als ich verwendet habe gensim.models.Word2Vec.laod_word2vec_format direkt mit dem Parameter binary=True/False

    – Kochfelder

    18. April 2017 um 23:00 Uhr

Glenns Benutzer-Avatar
Glenn

Auf der word2vec-toolkit-Mailingliste hat Thomas Mensink eine bereitgestellt Antworten in Form eines kleinen C-Programms, das eine .bin-Datei in Text umwandelt. Dies ist eine Modifikation der Datei distance.c. Ich habe die ursprüngliche distance.c durch Thomas’ Code unten ersetzt und word2vec neu erstellt (make clean; make) und die kompilierte Distanz in readbin umbenannt. Dann ./readbin vector.bin erstellt eine Textversion von vector.bin.

//  Copyright 2013 Google Inc. All Rights Reserved.
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>

const long long max_size = 2000;         // max length of strings
const long long N = 40;                  // number of closest words that will be shown
const long long max_w = 50;              // max length of vocabulary entries

int main(int argc, char **argv) {
  FILE *f;
  char file_name[max_size];
  float len;
  long long words, size, a, b;
  char ch;
  float *M;
  char *vocab;
  if (argc < 2) {
    printf("Usage: ./distance <FILE>\nwhere FILE contains word projections in the BINARY FORMAT\n");
    return 0;
  }
  strcpy(file_name, argv[1]);
  f = fopen(file_name, "rb");
  if (f == NULL) {
    printf("Input file not found\n");
    return -1;
  }
  fscanf(f, "%lld", &words);
  fscanf(f, "%lld", &size);
  vocab = (char *)malloc((long long)words * max_w * sizeof(char));
  M = (float *)malloc((long long)words * (long long)size * sizeof(float));
  if (M == NULL) {
    printf("Cannot allocate memory: %lld MB    %lld  %lld\n", (long long)words * size * sizeof(float) / 1048576, words, size);
    return -1;
  }
  for (b = 0; b < words; b++) {
    fscanf(f, "%s%c", &vocab[b * max_w], &ch);
    for (a = 0; a < size; a++) fread(&M[a + b * size], sizeof(float), 1, f);
    len = 0;
    for (a = 0; a < size; a++) len += M[a + b * size] * M[a + b * size];
    len = sqrt(len);
    for (a = 0; a < size; a++) M[a + b * size] /= len;
  }
  fclose(f);
  //Code added by Thomas Mensink
  //output the vectors of the binary format in text
  printf("%lld %lld #File: %s\n",words,size,file_name);
  for (a = 0; a < words; a++){
    printf("%s ",&vocab[a * max_w]);
    for (b = 0; b< size; b++){ printf("%f ",M[a*size + b]); }
    printf("\b\b\n");
  }  

  return 0;
}

Ich habe das “\b\b” aus der entfernt printf.

Übrigens enthielt die resultierende Textdatei immer noch das Textwort und einige unnötige Leerzeichen, die ich für einige numerische Berechnungen nicht haben wollte. Ich habe die anfängliche Textspalte und das abschließende Leerzeichen aus jeder Zeile mit Bash-Befehlen entfernt.

cut --complement -d ' ' -f 1 GoogleNews-vectors-negative300.txt > GoogleNews-vectors-negative300_tuples-only.txt
sed 's/ $//' GoogleNews-vectors-negative300_tuples-only.txt

Das Format ist das binäre Gleitkommaformat IEEE 754 mit einfacher Genauigkeit: Binary32
http://en.wikipedia.org/wiki/Single-precision_floating-point_format
Sie verwenden Little-Endian.

Machen wir ein Beispiel:

  • Erste Zeile ist String-Format: “3000000 300\n” (vocabSize & vecSize, getByte till byte==’\n’)
  • Die nächste Zeile enthält zuerst das Vocab-Wort und dann (300 * 4 Byte Float-Wert, 4 Byte für jede Dimension):

    getByte till byte==32 (space). (60 47 115 62 32 => <\s>[space])
    
  • dann repräsentiert jedes nächste 4 Byte eine Gleitkommazahl

    nächste 4 Byte: 0 0 -108 58 => 0.001129150390625.

Sie können den Wikipedia-Link überprüfen, um zu sehen, wie, lassen Sie mich dies als Beispiel tun:

(Little-Endian -> umgekehrte Reihenfolge) 00111010 10010100 00000000 00000000

  • zuerst ist Vorzeichenbit => Vorzeichen = 1 (sonst = -1)
  • nächsten 8 Bit => 117 => exp = 2^(117-127)
  • nächste 23 Bit => pre = 0*2^(-1) + 0*2^(-2) + 1*2^(-3) + 1*2^(-5)

Wert = Zeichen * exp * pre

Benutzeravatar von batgirl
Batgirl

Sie können die Binärdatei in word2vec laden und dann die Textversion wie folgt speichern:

from gensim.models import word2vec
 model = word2vec.Word2Vec.load_word2vec_format('Path/to/GoogleNews-vectors-negative300.bin', binary=True)
 model.save("file.txt")

`

Ich verwende Gensim, um mit GoogleNews-vectors-negative300.bin zu arbeiten, und ich füge eine hinzu binary = True Flag beim Laden des Modells.

from gensim import word2vec

model = word2vec.Word2Vec.load_word2vec_format('Path/to/GoogleNews-vectors-negative300.bin', binary=True) 

Scheint gut zu funktionieren.

  • Dies sollte die akzeptierte Antwort sein, da @Glenn die Verwendung erwähnt hat gensim Sowieso.

    – hlin117

    24. Februar 2016 um 7:30 Uhr

  • Gemäß gensim==3.8.1 lautet der Befehl: model = gensim.models.KeyedVectors.load_word2vec_format(““, binary=True)

    – mdev

    14. Januar 2020 um 11:09 Uhr


Benutzeravatar von Raphael Schumann
Raffael Schumann

Wenn Sie den Fehler erhalten:

ImportError: No module named models.word2vec

dann liegt es daran, dass es ein API-Update gab. Das wird funktionieren:

from gensim.models.keyedvectors import KeyedVectors

model = KeyedVectors.load_word2vec_format('./GoogleNews-vectors-negative300.bin', binary=True)
model.save_word2vec_format('./GoogleNews-vectors-negative300.txt', binary=False)

  • Dies sollte die akzeptierte Antwort sein, da @Glenn die Verwendung erwähnt hat gensim Sowieso.

    – hlin117

    24. Februar 2016 um 7:30 Uhr

  • Gemäß gensim==3.8.1 lautet der Befehl: model = gensim.models.KeyedVectors.load_word2vec_format(““, binary=True)

    – mdev

    14. Januar 2020 um 11:09 Uhr


Benutzeravatar von David Przybilla
David Przybilla

Ich hatte ein ähnliches Problem, ich wollte bin/non-bin (gensim)-Modelle als CSV-Ausgabe erhalten.

Hier ist der Code, der das auf Python macht, es wird davon ausgegangen, dass Sie Gensim installiert haben:

https://gist.github.com/dav009/10a742de43246210f3ba

1415820cookie-checkWord2vec-bin-Datei in Text umwandeln

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy