Codificatore di frasi universale

Visualizza su TensorFlow.org Esegui in Google Colab Visualizza su GitHub Scarica taccuino Vedi i modelli di mozzo TF

Questo quaderno illustra come accedere all'Universal Sentence Encoder e usarlo per le attività di somiglianza e classificazione delle frasi.

L'Universal Sentence Encoder rende facile l'incorporamento a livello di frase come lo è stato storicamente cercare gli incorporamenti per singole parole. Gli incorporamenti di frasi possono quindi essere banalmente utilizzati per calcolare la somiglianza del significato del livello di frase e per consentire prestazioni migliori nelle attività di classificazione a valle utilizzando dati di addestramento meno supervisionati.

Impostare

Questa sezione imposta l'ambiente per l'accesso all'Universal Sentence Encoder su TF Hub e fornisce esempi di applicazione del codificatore a parole, frasi e paragrafi.

%%capture
!pip3 install seaborn

Informazioni più dettagliate sull'installazione tensorflow può essere trovato alla https://www.tensorflow.org/install/ .

Carica il modulo TF Hub dell'Universal Sentence Encoder

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

Calcola una rappresentazione per ogni messaggio, mostrando varie lunghezze supportate.

Message: Elephant
Embedding size: 512
Embedding: [0.008344474248588085, 0.00048079612315632403, 0.06595245748758316, ...]

Message: I am a sentence for which I would like to get its embedding.
Embedding size: 512
Embedding: [0.05080860108137131, -0.016524313017725945, 0.015737781301140785, ...]

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.028332678601145744, -0.05586216226220131, -0.012941479682922363, ...]

Esempio di attività di somiglianza testuale semantica

Gli incorporamenti prodotti dall'Universal Sentence Encoder sono approssimativamente normalizzati. La somiglianza semantica di due frasi può essere banalmente calcolata come il prodotto interno delle codifiche.

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)

Somiglianza visualizzata

Qui mostriamo la somiglianza in una mappa termica. Il grafico finale è una matrice 9x9 in cui ogni voce [i, j] è colorato in base al prodotto interno delle codifiche per frase i e 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

Valutazione: benchmark STS (Semantic Textual Similarity).

La STS Benchmark fornisce una valutazione intrinseco del grado in cui i punteggi di similitudine calcolato usando frase embeddings allineamento con giudizio umano. Il benchmark richiede che i sistemi restituiscano punteggi di somiglianza per una selezione diversificata di coppie di frasi. Correlazione di Pearson viene poi utilizzato per valutare la qualità dei punteggi macchina somiglianza contro giudizi umani.

Scarica dati

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']]]
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/IPython/core/interactiveshell.py:3444: FutureWarning: The error_bad_lines argument has been deprecated and will be removed in a future version.


  exec(code_obj, self.user_global_ns, self.user_ns)

Valuta gli incorporamenti di frasi

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.8036394630692778
p-value = 0.0