当前位置: 首页 > 面试题库 >

将word2vec bin文件转换为文本

慕皓君
2023-03-14
问题内容

我可以从word2vec网站下载GoogleNews-vectors-
negative300.bin.gz。.bin文件(大约3.4GB)是对我无用的二进制格式。Tomas
Mikolov向我们保证:“将二进制格式转换为文本格式应该很简单(尽管这将占用更多的磁盘空间)。检查距离工具中的代码,读取二进制文件相当简单。”
不幸的是,我对C的了解不足,无法理解http://word2vec.googlecode.com/svn/trunk/distance.c。

据说gensim能做到这一点还,但我已经找到了教程似乎是有关转换 文本,而不是相反。

有人可以建议修改C代码或gensim发出文本的指令吗?


问题答案:

在word2vec-toolkit邮件列表上,Thomas
Mensink以小型C程序的形式提供了一个答案,该程序会将.bin文件转换为文本。这是distance.c文件的修改。我用下面的Thomas代码替换了原来的distance.c,并重建了word2vec(make
clean; make),并将编译后的距离重命名为readbin。然后./readbin vector.bin将创建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;
}

我从中删除了“ \ b \ b” printf

顺便说一句,生成的文本文件仍然包含文本单词和一些不必要的空格,我不希望这些空格用于某些数值计算。我使用bash命令从每一行中删除了初始文本列和尾随空白。

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


 类似资料:
  • 问题内容: 我使用APKTool对Android应用程序进行了反向工程,并获得了.Smali文件作为源代码输出。我将带有应用程序的.Smali文件转换为.Java文件。我能够成功编辑.Java文件,但现在我想将它们转换回.Smali,以便可以使用新的.Smali文件重新编译应用程序。当我只留下.Java文件时,它不会重新编译并给出一些错误。我在互联网上找不到有关将.Java编译为.Smali的任何

  • 问题内容: 有什么方法可以将File对象转换为MultiPartFile?这样我就可以将该对象发送到接受接口对象的方法? 问题答案: 存在MockMultipartFile为此目的。如你的代码段中所示,如果文件路径已知,则以下代码对我有用。

  • 有没有办法将文件对象转换为多部分文件?以便我可以将该对象发送到接受接口对象的方法?

  • 问题内容: 按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我需要从现有的(X)HTML文档自动生成PDF文件。输入文件(报告)使用非常简单的基于表的布局,因此可能不需要支持真正精美的JavaScript / CSS。

  • 我有一些scala代码是我用IntelliJ和SBT-Plugin编写的,希望提供给我作为C++的DLL的代码。 我已经尝试过使用'ikvmc':我通过'package'将所有类打包在一个jar中。之后,我手动设置了一个jar,其中包含我使用的所有依赖项(scala-library、scama、jamtio、jama)。不幸的是,我得到了很多警告:'IKVMC0119'、“Emitted java

  • 问题内容: 我公司已经开发了一个Web应用程序(J2EE环境/ Tomcat服务器),并希望将其作为产品出售。客户可以将此产品用作基本版或高级版。在高级版中,客户具有一些额外的功能(可能是一些额外的链接)。这种区别是基于串行密钥进行的。 讨论上述问题时,我只是一个听众。 是否可以解决上述问题?我们如何将War文件转换为exe文件并嵌入逻辑以区分高级版本或基本版本。 问题答案: 我们如何将War文件