Нормализовать вектор встраивания слов Fasttext, сгенерированный моделью

В настоящее время я использую FastText, чтобы получить вложения слов для некоторых входных текстовых данных, чтобы уловить сходство между ними и передать их в качестве входных данных в нейронную сеть для задачи NER. Сначала я попытался использовать файл fastText .vec, и мне удалось получить от них хороший результат сходства, затем я попытался использовать файл модели .bin, чтобы я мог получать вложения также из терминов вне словарного запаса но я заметил, что векторы, созданные из файлов .vec и .bin, отличаются. Файл .vec содержит вложения, обрезанные до диапазона [-1,1], в то время как это неверно для вложений, содержащихся в файле .bin. Используя файл .bin, я получаю очень плохие результаты, поэтому я пытаюсь понять, связано ли это с тем, что эти векторы (.bin) не нормализованы.

Есть ли хороший способ нормализовать эти векторы в диапазоне [-1, 1] с помощью Python?

Заранее спасибо.


person jesper    schedule 02.10.2018    source источник


Ответы (1)


Просто измените масштаб данных в диапазоне [-1, 1]. Желаю, чтобы это помогло.

def norm(data):
    min_v, max_v = min(data), max(data)
    mid_v = (max_v + min_v) >> 1
    len_v = float((max_v - min_v) >> 1)
    return [(v-mid_v)/len_v for v in data]
person whiledoing    schedule 02.10.2018
comment
Привет, спасибо за ответ. Я получаю сообщение об ошибке, поскольку работаю со значениями с плавающей запятой, а операнд ›› применяется к целочисленному значению. Моя проблема сейчас в том, что значения вложений действительно маленькие, и я думаю, что именно поэтому я получаю плохие результаты, при использовании файла .vec значения вполне нормальные, а результаты хорошие. - person jesper; 03.10.2018
comment
@jesper Если данные являются плавающими, вы можете изменить код на _1 _ , ›› более эффективен при работе с целыми числами. - person whiledoing; 05.10.2018
comment
@jesper Я не являюсь членом семьи, занимающейся вставкой слов, но что касается вашей проблемы, я думаю, что если входные данные очень малы (почти нулевые), это повлияет на производительность нейронной сети. Итак, как вы упомянули, для масштабирования ваших данных необходим какой-то метод нормализации. Я предлагаю вам выполнить поиск нормализации в документации по тензорному потоку, это будет намного лучше, чем ваш самореализованный алгоритм. Также проверьте документацию входной модели .bin, в ней могут быть ссылки на то, как работать с данными. - person whiledoing; 05.10.2018
comment
спасибо, я отмечу ваш как принятый ответ, так как он может быть хорошим решением для общего назначения. Я обязательно добавлю конкретное решение, как только найду его. - person jesper; 06.10.2018