Сохраните дату! Google I / O возвращается 18-20 мая Зарегистрируйтесь сейчас
Эта страница переведена с помощью Cloud Translation API.
Switch to English

Универсальный кодировщик предложений

Посмотреть на TensorFlow.org Запускаем в Google Colab Посмотреть на GitHub Скачать блокнот Посмотреть модели TF Hub

В этой записной книжке показано, как получить доступ к универсальному кодировщику предложений и использовать его для задач схожести предложений и классификации предложений.

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

Настраивать

В этом разделе настраивается среда для доступа к универсальному кодировщику предложений на TF Hub и приводятся примеры применения кодировщика к словам, предложениям и абзацам.

%%capture
!pip3 install seaborn

Более подробную информацию об установке Tensorflow можно найти на https://www.tensorflow.org/install/ .

Загрузите модуль TF Hub универсального кодировщика предложений

module https://tfhub.dev/google/universal-sentence-encoder/4 loaded

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

Message: Elephant
Embedding size: 512
Embedding: [0.008344488218426704, 0.00048081763088703156, 0.06595246493816376, ...]

Message: I am a sentence for which I would like to get its embedding.
Embedding size: 512
Embedding: [0.0508086122572422, -0.01652432046830654, 0.015737777575850487, ...]

Message: Universal Sentence Encoder embeddings also support short paragraphs. There is no hard limit on how long the paragraph is. Roughly, the longer the more 'diluted' the embedding will be.
Embedding size: 512
Embedding: [-0.0283326655626297, -0.05586216226220131, -0.012941461056470871, ...]

Пример задания семантического текстового сходства

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

def plot_similarity(labels, features, rotation):
  corr = np.inner(features, features)
  sns.set(font_scale=1.2)
  g = sns.heatmap(
      corr,
      xticklabels=labels,
      yticklabels=labels,
      vmin=0,
      vmax=1,
      cmap="YlOrRd")
  g.set_xticklabels(labels, rotation=rotation)
  g.set_title("Semantic Textual Similarity")

def run_and_plot(messages_):
  message_embeddings_ = embed(messages_)
  plot_similarity(messages_, message_embeddings_, 90)

Визуализация сходства

Здесь мы показываем сходство на тепловой карте. Окончательный граф представляет собой матрицу 9x9, где каждая запись [i, j] окрашена на основе внутреннего произведения кодировок для предложений i и j .

messages = [
    # Smartphones
    "I like my phone",
    "My phone is not good.",
    "Your cellphone looks great.",

    # Weather
    "Will it snow tomorrow?",
    "Recently a lot of hurricanes have hit the US",
    "Global warming is real",

    # Food and health
    "An apple a day, keeps the doctors away",
    "Eating strawberries is healthy",
    "Is paleo better than keto?",

    # Asking about age
    "How old are you?",
    "what is your age?",
]

run_and_plot(messages)

PNG

Оценка: тест STS (семантическое текстовое сходство)

Тест STS Benchmark обеспечивает внутреннюю оценку степени соответствия оценок сходства, вычисленных с использованием встраивания предложений, с человеческими суждениями. Тест требует, чтобы системы возвращали оценки сходства для разнообразного выбора пар предложений. Затем корреляция Пирсона используется для оценки качества оценок машинного сходства по сравнению с человеческими суждениями.

Скачать данные

import pandas
import scipy
import math
import csv

sts_dataset = tf.keras.utils.get_file(
    fname="Stsbenchmark.tar.gz",
    origin="http://ixa2.si.ehu.es/stswiki/images/4/48/Stsbenchmark.tar.gz",
    extract=True)
sts_dev = pandas.read_table(
    os.path.join(os.path.dirname(sts_dataset), "stsbenchmark", "sts-dev.csv"),
    error_bad_lines=False,
    skip_blank_lines=True,
    usecols=[4, 5, 6],
    names=["sim", "sent_1", "sent_2"])
sts_test = pandas.read_table(
    os.path.join(
        os.path.dirname(sts_dataset), "stsbenchmark", "sts-test.csv"),
    error_bad_lines=False,
    quoting=csv.QUOTE_NONE,
    skip_blank_lines=True,
    usecols=[4, 5, 6],
    names=["sim", "sent_1", "sent_2"])
# cleanup some NaN values in sts_dev
sts_dev = sts_dev[[isinstance(s, str) for s in sts_dev['sent_2']]]
Downloading data from http://ixa2.si.ehu.es/stswiki/images/4/48/Stsbenchmark.tar.gz
417792/409630 [==============================] - 0s 1us/step

Оценить вложения предложений

sts_data = sts_dev

def run_sts_benchmark(batch):
  sts_encode1 = tf.nn.l2_normalize(embed(tf.constant(batch['sent_1'].tolist())), axis=1)
  sts_encode2 = tf.nn.l2_normalize(embed(tf.constant(batch['sent_2'].tolist())), axis=1)
  cosine_similarities = tf.reduce_sum(tf.multiply(sts_encode1, sts_encode2), axis=1)
  clip_cosine_similarities = tf.clip_by_value(cosine_similarities, -1.0, 1.0)
  scores = 1.0 - tf.acos(clip_cosine_similarities) / math.pi
  """Returns the similarity scores"""
  return scores

dev_scores = sts_data['sim'].tolist()
scores = []
for batch in np.array_split(sts_data, 10):
  scores.extend(run_sts_benchmark(batch))

pearson_correlation = scipy.stats.pearsonr(scores, dev_scores)
print('Pearson correlation coefficient = {0}\np-value = {1}'.format(
    pearson_correlation[0], pearson_correlation[1]))
Pearson correlation coefficient = 0.8036396950530414
p-value = 0.0