Для чего используется spaCy для генерации векторов
Что проверяют
Понимаете ли вы, какие векторы на самом деле отдаёт spaCy и где их потолок. Следом обычно спрашивают, почему similarity() на маленькой модели даёт странные числа и чем это хуже эмбеддингов из трансформеров.
Как отвечать
spaCy это прежде всего быстрый промышленный конвейер: токенизация, лемматизация, POS, NER, разбор зависимостей. Векторы в нём вспомогательная возможность:
Token.vector: статичный вектор слова из таблицыnlp.vocab.vectors, уen_core_web_mdиen_core_web_lgэто 300 измерений. Вmdтаблица урезана, многие слова делят один вектор;Doc.vectorиSpan.vector: по умолчанию просто среднее векторов токенов. Порядок слов теряется, «собака укусила человека» и «человек укусил собаку» окажутся почти одинаковыми;similarity(): косинусная близость этих векторов;Token.has_vectorиis_oov: есть ли слово в таблице. У незнакомого слова вектор нулевой, если только векторы не в формате floret, который собирает их из подслов.
У en_core_web_sm и трансформерного en_core_web_trf статичных векторов нет, и similarity() на sm выдаёт предупреждение и опирается на внутренние контекстные признаки.
Где это полезно: быстрый бейзлайн для классификации и кластеризации, поиск похожих коротких текстов, признаки для textcat (статичные векторы подключаются к tok2vec в конфиге обучения). Свои векторы загружаются командой spacy init vectors.
Для семантического поиска и RAG это уже не лучший выбор: sentence-transformers и другие контекстные модели эмбеддингов заметно точнее. Сильный ответ звучит так: spaCy берём для предобработки и лёгких признаков, а эмбеддинги документов считаем специализированной моделью.
Где спотыкаются
Берут sm-модель и удивляются плохой близости. Для векторов нужна md или lg, либо своя таблица.
Думают, что Doc.vector учитывает контекст, как BERT. Это среднее статичных векторов, частые слова тянут результат на себя, поэтому стоп-слова часто стоит отфильтровать.
Сравнивают векторы из разных моделей или складывают их в один индекс. Пространства несовместимы, и близость получится бессмысленной.