Обновление словаря spaCy

Мне было интересно, можно ли обновить словарный запас spacys по умолчанию. Я пытаюсь сделать следующее:

  • запустить word2vec на моем собственном корпусе с помощью gensim
  • загрузить векторы в мою модель с помощью nlp.vocab.load_vectors_from_bin_loc(\path)

Но поскольку многие слова в моем корпусе не входят в словарь spacy по умолчанию, я не могу использовать импортированные векторы. Есть ли (простой) способ добавить эти недостающие типы?

Изменить:
Я понимаю, что смешивание векторов может быть проблематичным. Итак, мой вопрос:
Как я могу импортировать пользовательский словарь в spacy?


person Jean Zombie    schedule 20.04.2017    source источник


Ответы (1)


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

По умолчанию spaCy загружает файл data/vocab/vec.bin, где каталог «data» находится в каталоге модуля spacy.en Создайте файл vec.bin из файла bz2, используя spacy.vocab.write_binary_vectors Либо замените vec.bin spaCy или вызовите nlp.vocab.load_rep_vectors во время выполнения, указав путь к двоичному файлу. Вышеупомянутое поначалу немного неудобно, но формат двоичного файла намного меньше и быстрее загружается, а файлы векторов довольно большие. Обратите внимание, что GloVe распространяется в формате gzip, а не bzip.

Из интереса: вы используете векторы GloVe или что-то, что вы тренировали на своих собственных данных? Если ваши собственные данные, вы использовали Gensim? Я хотел бы сделать это намного проще, поэтому я был бы признателен за предложения о том, какой рабочий процесс вы хотели бы видеть.

Загружать новые векторы во время выполнения, при необходимости преобразовывая их

    import spacy.vocab

    def set_spacy_vectors(nlp, binary_loc, bz2_loc=None):
        if bz2_loc is not None:
            spacy.vocab.write_binary_vectors(bz2_loc, binary_loc)
        write_binary_vectors(bz2_input_loc, binary_loc)

        nlp.vocab.load_rep_vectors(binary_loc)

Замените vec.bin, чтобы ваши векторы загружались по умолчанию

from spacy.vocab import write_binary_vectors
    import spacy.en

    from os import path

    def main(bz2_loc):
        bin_loc = path.join(path.dirname(spacy.en.__file__), 'data', 'vocab', 'vec.bin')
        write_binary_vectors(bz2_loc, bin_loc)

if __name__ == '__main__':
    plac.call(main)
person Nishank Mahore    schedule 08.05.2017
comment
Было бы здорово легко сбросить векторы spacy.vocab в пригодный для использования формат с помощью gensim, переобучить с помощью gensim новый корпус, а затем перезагрузить в Spacy. В настоящее время это просто? - person Geoffrey Negiar; 06.11.2017