word2vec中 distence.c 檔案源碼分析

來源:互聯網
上載者:User

標籤:word2vec   機器學習   

#include <stdio.h>#include <string.h>#include <math.h>//#include <malloc.h>#include <stdlib.h>const long long max_size = 2000;         // max length of stringsconst long long N = 5;                  // number of closest words that will be shownconst long long max_w = 50;              // max length of vocabulary entriesint main(int argc, char **argv) {  FILE *f;  char st1[max_size];  char *bestw[N];//指標數組,大小為N,其中的每一個元素指向char型的指標。  char file_name[max_size], st[100][max_size];  float dist, len, bestd[N], vec[max_size];  long long words, size, a, b, c, d, cn, bi[100];  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);//vocab_size  fscanf(f, "%lld", &size); //維數  vocab = (char *)malloc((long long)words * max_w * sizeof(char));  for (a = 0; a < N; a++) bestw[a] = (char *)malloc(max_size * 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++) {    a = 0;    while (1) {      vocab[b * max_w + a] = fgetc(f);      if (feof(f) || (vocab[b * max_w + a] == ‘ ‘)) break;      if ((a < max_w) && (vocab[b * max_w + a] != ‘\n‘)) a++;    }    vocab[b * max_w + a] = 0;    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);  while (1) {    for (a = 0; a < N; a++) bestd[a] = 0;    for (a = 0; a < N; a++) bestw[a][0] = 0;    printf("Enter word or sentence (EXIT to break): ");    a = 0;    while (1) {      st1[a] = fgetc(stdin);      if ((st1[a] == ‘\n‘) || (a >= max_size - 1)) {        st1[a] = 0;        break;      }      a++;    }    printf("st1:%s words:%lld \n",st1,words);    if (!strcmp(st1, "EXIT")) break;    cn = 0;    b = 0;    c = 0;    while (1) {//把st中的每個單詞分別儲存到st1二維數組中,共cn個。      st[cn][b] = st1[c];      b++;      c++;      st[cn][b] = 0;      if (st1[c] == 0) break;      if (st1[c] == ‘ ‘) {        cn++;        b = 0;        c++;      }    }    cn++;    for (a = 0; a < cn; a++) {      for (b = 0; b < words; b++) if (!strcmp(&vocab[b * max_w], st[a])) break;      if (b == words) b = -1;      bi[a] = b;      printf("\nWord: %s  Position in vocabulary: %lld\n", st[a], bi[a]);      if (b == -1) {        printf("Out of dictionary word!\n");        break;       //只要有一個詞不在詞彙表都終止for迴圈      }    }    if (b == -1) continue;    printf("\n                                              Word       Cosine distance\n------------------------------------------------------------------------\n");    for (a = 0; a < size; a++) vec[a] = 0;    for (b = 0; b < cn; b++) {//遍曆每個詞,如果輸入多個詞vec[a]是各個詞向量的累加和      if (bi[b] == -1) continue;      for (a = 0; a < size; a++) vec[a] += M[a + bi[b] * size];    }    len = 0;    for (a = 0; a < size; a++) len += vec[a] * vec[a];    len = sqrt(len);    for (a = 0; a < size; a++) vec[a] /= len;//將vec歸一化,當只輸入一個詞時,不起作用。    for (a = 0; a < N; a++) bestd[a] = -1;    for (a = 0; a < N; a++) bestw[a][0] = 0;    //由於查詢詞和詞彙表的詞向量都做了歸一化,所以餘弦相似性等價於向量的內積,內積越大越相似    for (c = 0; c < words; c++) {//遍曆詞彙表      a = 0;      for (b = 0; b < cn; b++)   //a的作用:如果遍曆詞和查詢詞相同,則跳過此詞        if (bi[b] == c) a = 1;      if (a == 1) continue;      dist = 0;      for (a = 0; a < size; a++)  //求向量的內積        dist += vec[a] * M[a + c * size];      for (a = 0; a < N; a++) {   //為dist尋找插入位置        if (dist > bestd[a]) {                   for (d = N - 1; d > a; d--) {            bestd[d] = bestd[d - 1];            strcpy(bestw[d], bestw[d - 1]);          }          bestd[a] = dist;          strcpy(bestw[a], &vocab[c * max_w]);          break;        }      }    }    for (a = 0; a < N; a++) printf("%50s\t\t%f\n", bestw[a], bestd[a]);  }  return 0;}

word2vec中 distence.c 檔案源碼分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.