У меня есть общий вопрос о способе textcategorizer в просторных работах. Судя по разным частям информации о пространственной документации и моих тестах, кажется, что она не использует предварительно обученные модели и их функции, по крайней мере, в языках с небольшими моделями, такими как немецкий, или, конечно, так называемые языки с поддержкой apha, такие как польский без моделей. Я использую spacy 2.1.8, и моя задача категоризации - классифицировать текст на немецком языке на 18 эксклюзивных категорий. Это работает хорошо, и я получил удивительно хорошую перекрестную проверку точности, однако, пытаясь понять механику, я обнаружил некоторые удивительные вещи, когда тестировал, я не загружаю модель, используя spacy.blank. Ядро моего кода выглядит следующим образом:
nlp = spacy.blank("de")
textcat = nlp.create_pipe(
"textcat",
config={
"exclusive_classes": True,
"architecture": "simple_cnn",
}
)
nlp.add_pipe(textcat, last=True)
for c in categories:
textcat.add_label(c)
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != "textcat"]
with nlp.disable_pipes(*other_pipes):
optimizer = nlp.begin_training()
print("what vectors:",nlp.vocab.vectors.name)
#here I get always the output spacy_pretrained_vectors,f.e. if I call "pl" instead "de"
Затем я использую nlp.update в мини-пакетах и оптимизируюсь со средними значениями
nlp.update(texts, annotations, sgd=optimizer, drop=0.2, losses=losses)
with textcat.model.use_params(optimizer.averages):
# evaluate on the dev data split off in load_data()
scores = eval_save_multi_scores(nlp.tokenizer, textcat, x_dev_skf, y_dev_skf)
Первые странные вещи заключались в том, что переход на совершенно другой язык, такой как польский, и выполнение той же классификации по немецким текстам неизменить результаты, окончательная точность остается неизменной после 5-кратного резюме. Я также пробовал финский и испанский языки, тоже самое. Таким образом, это доказывает для меня, что он не использует свойства предварительно обученных моделей, даже если есть доступные контекстно-зависимые тензоры, которые совместно используются в конвейере, как для немецкого языка (Из вопроса https://github.com/explosion/spaCy/issues/2523) Согласно описанию из spacy.ioдля архитектуры, которую я использую: «Модель нейронной сети, в которой векторы токенов вычисляются с использованием CNN. Векторы объединяются в средние значения и используются в качестве функций в сети с прямой связью». Поэтому я понимаю, что в ней используется токенизатор (специфическийтолько для языка, а затем вычислите! (поэтому не используйте те из предварительно обученных моделей) контекстно-зависимые векторы токенов для текстов, и этого достаточно для NN, чтобы корректировать веса, чтобы иметь правильную категоризацию, даже если токен не так верен при выборе другогоlang чем text. У кого-нибудь есть другие объяснения или что-то еще, что можно добавить?