Есть ли простой способ с помощью встроенных функций автоматически переучивать модель keras NLP? - PullRequest
0 голосов
/ 28 января 2020

У меня есть модель обработки естественного языка, построенная с использованием keras с использованием keras.preprocessing.text.Tokenizer. Я знаю, что могу переучить старую модель, вызвав ее .fit(...) после ее импорта, но мне нужно также обновить мой токенизатор. Токенайзер делает некоторые вещи: токенизирует строку пробелами, удаляет символы, преобразует в младшие, сохраняет только наиболее используемые токены после создания своего словаря, имеет sh токенов и добавляет 0, если предложение слишком короткое.

Пример:

tokenizer = Tokenizer(num_words=vocab_size)

tokenizer.fit_on_texts(df_train['message'][0:100].values)

x_train = tokenizer.texts_to_sequences(df_train['message'][0:100].values)

x_train = pad_sequences(x_train, padding='post', maxlen=maxlen)

Этот процесс необходим для возможности ввода последовательностей в сеть NLP. Проблема появляется, когда я пытаюсь автоматически переучить это. Каждый раз, когда я переучиваюсь, токенизатор должен обновляться. Если я попытаюсь добавить новый текст, все значения из словаря, которые использует класс токенизатора (то есть кодировка слова), изменятся.

Пример:

Если я обновлюсь так: tokenizer.fit_on_texts(df_train['message'][100:200].values),

, тогда

x_train = tokenizer.texts_to_sequences(df_train['message'][0:100].values)

выведет различные кодировки для предложений. Мне нужны такие же кодировки. В официальной документации сказано, что метод «def fit_on_texts (self, тексты)» «обновляет внутренний словарь на основе списка текстов». Он обновляет, но также изменяет все старые значения ключей, старые или новые.

Существует ли официальный способ сохранить старые значения слов и генерировать новые значения только для новых слов?

1 Ответ

0 голосов
/ 28 января 2020

Итак, согласно источнику для Tokenizer , все слова хранятся в классе Tokenizer. В частности:

self.word_counts = OrderedDict()
self.word_docs = defaultdict(int)

Таким образом, если вы хотите удалить слова, которые были ранее в вашей входной строке, вы можете удалить их, найдя любой элемент в new_input, который не находится на пересечении word_counts.keys() и new_input.

Однако есть еще один улов:

Когда вы запускаете .fit_on_texts, он ожидает список текстов или одну строку. В зависимости от того, как вы делаете вещи, вы также можете увеличивать счетчик документов. Если это намеренно, то вам не нужно ничего делать здесь. В противном случае вам нужно будет обработать как минимум уменьшающийся self.document_count.

(вам также может понадобиться манипулировать:

self.word_index
self.index_word

, если вам не нравится перемещение счетчика документов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...