Обучение ner_rus модели на своих данных с использованием своих квантованных эмбеддингов

Добрый день!

Пытаюсь обучить ner_rus (LSTM + CRF) модель для извлечения именованных сущностей из текстов.
Использую свои данные и обученные с помощью fasttext эмбеддинги.
Если использую квантованную версию эмбеддингов, получаю следующую ошибку:

ValueError: /content/drive/MyDrive/Models/Fasttext_embeddings/model_gensim_fasttext_new.bin has wrong file format!

Пробовал эмбенддинги как из facebook fasttext, так и из gensim FastText (пример выше) - ошибка та же. Если использую не квантованные эмбеддинги facebook fasttext - работает.

Для сжатия использовал следующую библиотеку:

from gensim.models.fasttext import load_facebook_model
import compress_fasttext
big_model = load_facebook_model(‘path-to-original-model’).wv
small_model = compress_fasttext.prune_ft_freq(big_model, pq=True)
small_model.save(‘path-to-new-model’)

Конфиг модели:

with configs.ner.ner_rus.open(encoding=‘utf8’) as f:
ner_config = json.load(f)

ner_config[‘dataset_reader’][‘data_path’] = ‘/content/drive/MyDrive/Data/1k_up/’#train, val, test
ner_config[‘metadata’][‘variables’][‘NER_PATH’] = ‘/content/drive/MyDrive/Models/LSTM_CRF_1k_up_quat_embed’
ner_config[‘metadata’][‘download’] = [ner_config[‘metadata’][‘download’][-1]]
ner_config[‘chainer’][‘pipe’][4][‘save_path’] = ‘/content/drive/MyDrive/Models/LSTM_CRF_1k_up_quat_embed/tag.dict’ #new model dir
ner_config[‘chainer’][‘pipe’][2][‘return_probas’] = False
ner_config[‘chainer’][‘pipe’][12][‘save_path’] = ‘/content/drive/MyDrive/Models/LSTM_CRF_1k_up_quat_embed/model’#new model dir
ner_config[“chainer”][“pipe”][4][“load_path”] = ‘/content/drive/MyDrive/Models/LSTM_CRF_1k_up_quat_embed/tag.dict’
ner_config[“chainer”][“pipe”][12][“load_path”] = ‘/content/drive/MyDrive/Models/LSTM_CRF_1k_up_quat_embed/model’
ner_config[“chainer”][“pipe”][7][“load_path”] = ‘/content/drive/MyDrive/Models/Fasttext_embeddings/model_gensim_fasttext_new.bin’
ner_config[“train”][“batch_size”] = 16
ner_config[“train”][“epochs”] = 8
ner_config[“train”][“learning_rate”] = 1e-4
ner_config[“train”][“device”] = ‘GPU’

Подскажите:

  1. Можно ли использовать квантованные эмбеддинги?
  2. Если да, как это сделать?

В DeepPavlov для подгрузки эмбедингов fasttext используется пакет fasttext.
Он не умеет квантовать unsupervised модели. А compress-fasttext работает через gensim. Возможно, это и есть причина почему fasttext не может загрузить модель, которая квантована другим пакетом.

Так как квантованная модель подгружается успешно через gensim, то чтобы использовать эту модель в DeepPavlov придется написать свой эмбеддер, который подгружает модель с помощью gensim.

Для этого можно реализовать свою компоненту по аналогии с DeepPavlov/fasttext_embedder.py at 6c8f8924628f40eab3ce6301916dc6fbd38869f0 · deepmipt/DeepPavlov · GitHub, но с подгрузкой через gensim и использовать ее в пайплайне.

Если я напишу например компоненту fasttext_gensiquant_embedder.py, как мне потом добавить этот файл / в библиотеку / конфиг / пайплайн, чтобы использовать?

Например с такой структурой файлов:
.
├── fasttext_gensiquant_embedder.py
└── ner_rus.json

в ner_rus.json:

...
{
"class_name": "fasttext_gensiquant_embedder:my_embedder",
...
},
...
"metadata": {
    "imports": ["fasttext_gensiquant_embedder"],
    ...
}
1 Like