Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Word2vec принимает данные для обучения в виде текстового файла с одной длинной строкой, содержащей слова, разделенные пробелами (выяснил это, анализируя примеры работы с word2vec из официальной документации). Склеил наборы данных в одну строку и сохранил её в текстовом файле.
void ReadWord(char *word, FILE *fin) {
int a = 0, ch;
while (!feof(fin)) {
ch = fgetc(fin);
if (ch == 13) continue;
if ((ch == ' ') || (ch == '\t') || (ch == '\n')) {
if (a > 0) {
if (ch == '\n') ungetc(ch, fin);
break;
}
if (ch == '\n') {
strcpy(word, (char *)"</s>");
return;
} else continue;
}
word[a] = ch;
a++;
if (a >= MAX_STRING - 1) a--; // Truncate too long words
}
word[a] = 0;
}
</s>Это слово не участвует в расчете частоты, поэтому не выбрасывается из словаря и всегда находится в его начале. Если EOL в тексте несколько, меняется распределение слов, находящихся рядом с EOL. Вот расчет дистанции, если EOL только один:
Word: </s> Position in vocabulary: 0
Word CosDist
1 factor 0.3524520
2 frightening 0.3380254
3 admit 0.3336470
4 scary 0.3289483
5 scariest 0.3148671
6 prom 0.3142520
7 time 0.3083785
8 paranormal 0.3076151
9 cheesy 0.3073355
10 impressed 0.3042146
Word: </s> Position in vocabulary: 0 1 yelling 0.3524468 2 toddler 0.3464943 3 janitor 0.3398002 4 running 0.3376773 5 drunk 0.3368221 6 bunch 0.3361016 7 iq 0.3348956 8 pathetically 0.3328072 9 unbelievably 0.3261482 10 retarded 0.3218134
Глубокое обучение на R, тренируем word2vec