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?
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)
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
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.
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
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
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
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: