Как представить вложения ELMo как одномерный массив? - PullRequest
0 голосов
/ 30 октября 2018

Я использую языковую модель ELMo - https://allennlp.org/elmo для представления моих текстовых данных в виде числового вектора. Этот вектор будет использоваться в качестве обучающих данных для простой задачи анализа настроений.

В этом случае данные не на английском языке, поэтому я скачал пользовательскую модель ELMo из - https://github.com/HIT-SCIR/ELMoForManyLangs (я предполагаю, что это поведение аналогично официальному репозиторию allennlp)

Чтобы преобразовать текстовый документ в ELMo, встраивая функцию sents2elmo. Аргумент - это список токенизированных предложений, если я правильно понял документацию.

Таким образом, одна выборка в моих тренировочных данных может быть включена следующим образом:

from elmoformanylangs import Embedder
embedder = Embedder('custom_language') 
embeddings = embedder.sents2elmo([['hello', 'world', 'how', 'are', 'you', '?'], 
                                  ['am', 'great', 'thanks', '!']])

Это вернет список из двух пустых массивов, по одному для каждого предложения, и каждый токен в предложении будет представлен как один вектор размером 1024. И так как параметр по умолчанию sents2elmo(output_layer) равен -1, этот вектор представляет среднее значение 3 внутренних слоев в языковой модели.

Как вложения могут быть представлены в виде одномерного массива? Должен ли я просто усреднить все векторы слов для одного предложения. А затем усреднить все векторы предложений?

sentence_1 = np.mean(embeddings[0], axis=0)
sentence_2 = np.mean(embeddings[1], axis=0)
document = np.mean([sentence_1, sentence_2], axis=0)

Этот подход уничтожает какую-либо информацию? Если да, есть ли другие способы сделать это?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Как говорит Алекс, как вы уменьшаете размер каждого предложения, очень часто приходится иметь дело с различиями в размерах предложений, но я не знаю, зачем вам нужно усреднять все векторы предложений. В этом нет необходимости, поскольку теперь у вас есть пространство из 1024 объектов для каждого документа, вы можете использовать PCA для уменьшения размеров.

0 голосов
/ 17 декабря 2018

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

Или, после встраивания всех ваших данных, вы можете нормализовать функции встраивания по всему набору данных. Это приведет к тому, что все будет лежать в многомерной сфере, если ваше приложение будет работать лучше на таком коллекторе.

...