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;
}
Из кода видно, что EOL может и не быть в файле, а значит моя фраза абсолютно корректна.
Теперь, что будет, если EOL в файле есть.
Он заменяется на специальное слово:
</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
А вот, если три (текст тот же самый, просто я добавил три EOL):
Я попробовал сейчас на скорую руку просто ввести два абзаца в строку обучающей выборки, ничего заметно не изменилось. Пространство слов из word2vec — это матрица, первый столбец — слова из словаря, начиная со второго по последний — значения компонент вектора. Есть вероятность, что эти значения меняются для слов, которые находятся между переводом строки, но это сложно увидеть. Если получу подтверждение, напишу update.
С сайта gensim: The training algorithms were originally ported from the C package code.google.com/p/word2vec and extended with additional functionality.
Единственное, чего не понял, почему они не используют оригинальную кластеризацию из word2vec и предлагают взять K-Means из scikit-learn вот в этом примере.
Я считаю, что ребята старались не зря выдумывая переменные. И, скажем, мне не понятно, как связаны между собой мат.ожидание уровня сигнала и угол между векторами. Я попробую на этой неделе сделать PCA, о результатах напишу.
Да, есть отличия. Но тенденция общая, на 50-60 «важных» признаках точность быстро растет, а потом выходит на плато. Но эти 50-60 признаков дают в районе 0.8. Я раньше всегда отбирал признаки через information gain, обычно получалось. Это ничем не хуже чем считать корреляцию. Тут igr падает от максимума до нуля практически равномерно по всему набору.
Нет, не пробовал. Интересовал только отбор переменных. Зато пробовал RFE, о чем в статье писать не стал. Неудачный опыт. 10 часов на трех ядрах, 60 отобранных признаков и точность в районе 0.8 на тестовой выборке, что на 10% хуже полного набора. Да, PCA встроен прямо в caret, вызывается через функцию preProcess.
Интересно, нужно будет попробовать.
При k-fold=5, ntree=100 и 3-х вариантах mtry получается 5 * 3 + 1 модель со 100 деревьями. 1 дерево на моем компьютере при 25000 наблюдениях и 5000 переменных строится в среднем 3 — 10 минут (зависит от mtry).
В итоге 16 * 100 * (3-10) мин.
Вот так модель считывает слова из файла:
Из кода видно, что EOL может и не быть в файле, а значит моя фраза абсолютно корректна.
Теперь, что будет, если EOL в файле есть.
Он заменяется на специальное слово: Это слово не участвует в расчете частоты, поэтому не выбрасывается из словаря и всегда находится в его начале. Если 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А вот, если три (текст тот же самый, просто я добавил три EOL):
А теперь попробуйте из этого что-то понять про абзацы внутри текста.
Удачи!
Я попробовал сейчас на скорую руку просто ввести два абзаца в строку обучающей выборки, ничего заметно не изменилось. Пространство слов из word2vec — это матрица, первый столбец — слова из словаря, начиная со второго по последний — значения компонент вектора. Есть вероятность, что эти значения меняются для слов, которые находятся между переводом строки, но это сложно увидеть. Если получу подтверждение, напишу update.
Единственное, чего не понял, почему они не используют оригинальную кластеризацию из word2vec и предлагают взять K-Means из scikit-learn вот в этом примере.
При k-fold=5, ntree=100 и 3-х вариантах mtry получается 5 * 3 + 1 модель со 100 деревьями. 1 дерево на моем компьютере при 25000 наблюдениях и 5000 переменных строится в среднем 3 — 10 минут (зависит от mtry).
В итоге 16 * 100 * (3-10) мин.