דף זה תורגם על ידי Cloud Translation API.
Switch to English

מקודד משפט אוניברסלי

צפה ב- TensorFlow.org הפעל בגוגל קולאב צפה ב- GitHub הורד מחברת ראה דגמי TF Hub

מחברת זו ממחישה כיצד לגשת למקודד המשפטים האוניברסלי ולהשתמש בו למשימות דמיון משפטים וסיווג משפטים.

המקודד למשפט אוניברסלי מקל על קבלת טבלאות ברמת המשפט כפי שהיה מבחינה היסטורית בחיפוש אחר הטבלאות אחר מילים בודדות. לאחר מכן ניתן להשתמש בטביעות המשפט לחישוב רמת המשפט שמשמעותה דמיון וכן לאפשר ביצועים טובים יותר במשימות סיווג במורד הזרם תוך שימוש בנתוני אימון פחות מפוקחים.

להכין

סעיף זה מגדיר את הסביבה לגישה למקודד המשפטים האוניברסלי ב- TF Hub ומספק דוגמאות להחלת המקודד על מילים, משפטים ופסקאות.

%%capture
!pip3 install seaborn

מידע מפורט יותר אודות התקנת Tensorflow ניתן למצוא בכתובת https://www.tensorflow.org/install/ .

טען את מודול ה- TF של ה- Universal Senten Encoder

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

חישוב ייצוג לכל הודעה, המציג אורכים שונים הנתמכים.

Message: Elephant
Embedding size: 512
Embedding: [0.008344489149749279, 0.0004808177181985229, 0.06595245748758316, ...]

Message: I am a sentence for which I would like to get its embedding.
Embedding size: 512
Embedding: [0.0508086159825325, -0.016524316743016243, 0.015737783163785934, ...]

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.028332684189081192, -0.0558621771633625, -0.012941448017954826, ...]


דוגמה למשימה של דמיון טקסטואלי סמנטי

השיבוצים שהופקו על ידי מקודד המשפטים האוניברסלי הם מנורמלים בקירוב. ניתן לחשב את הדמיון הסמנטי של שני משפטים באופן טריוויאלי כתוצר הפנימי של הקידודים.

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 מספק הערכה אינטריסטית למידת ציוני הדמיון המחושבים באמצעות טבלאות משפטים תואמים את פסקי הדין האנושיים. המדד מחייב מערכות להחזיר ציוני דמיון עבור מבחר מגוון של זוגות משפטים. מתאם פירסון משמש אז להערכת איכות ציוני הדמיון של המכונה לעומת שיפוטים אנושיים.

הורד נתונים

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']]]

הערך את טבילות המשפטים

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