Как извлечь и использовать кодировки BERT предложений для схожести текста среди предложений. (PyTorch / Tensorflow)

Я хочу создать модель подобия текста, которую я обычно использую для поиска часто задаваемых вопросов и других методов, чтобы получить наиболее связанный текст. Я хочу использовать высокооптимизированную модель BERT для этой задачи НЛП. Я обычно использую кодировки всех предложений, чтобы получить матрицу сходства с использованием cosine_similarity и вернуть результаты.

В гипотетических условиях, если у меня есть два предложения как hello world и hello hello world, тогда я предполагаю, что BRT даст мне что-то вроде [0.2,0.3,0], (0 для заполнения) и [0.2,0.2,0.3], и я могу передать эти два внутри sklearn's cosine_similarity.

Как я должен извлекать вложения из предложений, чтобы использовать их в модели? Я где-то нашел, что его можно извлечь, например:

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
input_ids = torch.tensor(tokenizer.encode("Hello, my dog is cute")).unsqueeze(0)  # Batch size 1
outputs = model(input_ids)
last_hidden_states = outputs[0]  # The last hidden-state is the first element of the output tuple
Using Tensorflow:

import tensorflow as tf
from transformers import BertTokenizer, TFBertModel

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = TFBertModel.from_pretrained('bert-base-uncased')
input_ids = tf.constant(tokenizer.encode("Hello, my dog is cute"))[None, :]  # Batch size 1
outputs = model(input_ids)
last_hidden_states = outputs[0]  # The last hidden-state is the first element of the output tuple

Это правильный путь? Потому что я где-то читал, что BERT предлагает разные типы вложений.

ТАКЖЕ предложите любой другой метод определения сходства текста


person Deshwal    schedule 22.07.2020    source источник


Ответы (1)


Если вы хотите сравнить вложения предложений, рекомендуемый способ сделать это с помощью BERT - использовать значение токена CLS. Это соответствует первому токену вывода (после измерения пакета).

last_hidden_states = outputs[0]
cls_embedding = last_hidden_states[0][0]

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

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

person DMolony    schedule 22.07.2020
comment
Что, если предложения имеют два совершенно разных по длине? На самом деле, я хочу найти текстовое сходство между вопросами по естествознанию (PCM- ›Физика, химия, математика). - person Deshwal; 22.07.2020
comment
Неважно. Токен CLS можно рассматривать как краткое изложение предложения. Также отлично подходит усреднение вложений слов для создания вложения предложения. Посмотрите, что лучше всего подходит для вас. - person DMolony; 22.07.2020
comment
@Deshwal. Можете ли вы отметить этот ответ как правильный, поскольку он отвечает на ваш вопрос. - person DMolony; 23.07.2020