Я не уверен, что вызывает поведение, которое вы видите, хотя у меня есть теория ниже.
Но, обратите внимание, что текущее поведение gensim (через 3.7.1) иногда возвращается KeyError: all ngrams for word <...> absent
для слова OOV, не соответствует поведению исходной реализации FastText в Facebook и поэтому считается ошибкой.
Это должно быть исправлено в следующем выпуске.Вы можете прочитать примечание об изменении о новом совместимом поведении .
Итак, в ближайшем будущем с обновленной версией gensim вы никогда не увидите этот `KeyError '.
В то же время факторы, которые могут объяснить ваше наблюдаемое поведение, включают:
- Передача разделенных пробелом фраз на
FastText
не характерна.Кроме того, обычные токенизации обучающих текстов будут передавать только лексемы без никакого внутреннего пробела.Таким образом, для типичной модели нет шансов, что такие фразы, содержащие пространство, будут иметь векторы из полных слов.И ни один из их n-граммов символов, содержащих пробелы, также не будет отображаться в n-граммах, замеченных во время обучения.Если в gensim 3.7.1 и более ранних версиях вы вообще получили вектор, это будет связано с тем, что некоторые из n-грамм , а не , содержащих пробелы, были замечены в процессе обучения.(После публикации 3.7.1 вы всегда получите вектор, хотя он может быть составлен из случайных столкновений новых n-граммов слова запроса с n-граммами, изученными в процессе обучения, или просто из случайно инициализированных, но никогда не обученныхвекторы в хеш-таблице n-граммы модели.) - N-граммы изучаются с помощью искусственного префикса начала слова и суффикса конца слова, в частности символов
<
и >
.И диапазон размера по умолчанию в n-граммах составляет от 4 до 6 символов.Таким образом, ваша строка 'AuM Wert'
будет включать в себя n-граммы '<AuM'
, 'Wert'
и 'ert>'
.(Все остальные его n-граммы будут включать символ пробела, и, следовательно, не могут быть в наборе n-граммов, изученных во время обучения слов без пробелов.).Но обратите внимание, что более длинная фраза, в которой вы получите ошибку, будет не включать n-грамм 'ert>'
, потому что предыдущий конец токена был заменен пробелом.Таким образом, n-граммы более короткой фразы составляют , а не - правильное подмножество n-граммов более крупной фразы - и более крупная фраза может привести к ошибке, в отличие от более короткой.(И ваша более длинная фраза без пробела, которая не является ошибкой, также включает в себя несколько дополнительных n-граммов из 4-6 символов, которые могли содержаться в обучающих данных, которых нет в ошибочной фразе.)