ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

استكشاف حفلات الزفاف TF-Hub CORD-19 Swivel

عرض على TensorFlow.org تشغيل في Google Colab عرض على جيثب تحميل دفتر انظر نموذج TF Hub

تم تصميم وحدة تضمين النص CORD-19 Swivel من TF-Hub (https: //tfhub.dev/tensorflow/cord-19/swivel-128d/1) لدعم الباحثين في تحليل نصوص اللغات الطبيعية المتعلقة بـ كوفيد -19. تم تدريب هذه الزخارف على العناوين والمؤلفين والملخصات ونصوص الجسم والعناوين المرجعية للمقالات في مجموعة بيانات CORD-19 .

في هذا الكولاب سنقوم بما يلي:

  • حلل الكلمات المتشابهة لغويًا في مساحة التضمين
  • قم بتدريب المصنف على مجموعة بيانات SciCite باستخدام حفلات الزفاف CORD-19

اقامة

import functools
import itertools
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import pandas as pd

import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
tf.logging.set_verbosity('ERROR')

import tensorflow_datasets as tfds
import tensorflow_hub as hub

try:
  from google.colab import data_table
  def display_df(df):
    return data_table.DataTable(df, include_index=False)
except ModuleNotFoundError:
  # If google-colab is not available, just display the raw DataFrame
  def display_df(df):
    return df

حللوا حفلات الزفاف

لنبدأ بتحليل التضمين بحساب ورسم مصفوفة الارتباط بين المصطلحات المختلفة. إذا تعلم التضمين التقاط معنى الكلمات المختلفة بنجاح ، فيجب أن تكون متجهات تضمين الكلمات المتشابهة لغويًا قريبة من بعضها البعض. دعنا نلقي نظرة على بعض المصطلحات المتعلقة بـ COVID-19.

# Use the inner product between two embedding vectors as the similarity measure
def plot_correlation(labels, features):
  corr = np.inner(features, features)
  corr /= np.max(corr)
  sns.heatmap(corr, xticklabels=labels, yticklabels=labels)


with tf.Graph().as_default():
  # Load the module
  query_input = tf.placeholder(tf.string)
  module = hub.Module('https://tfhub.dev/tensorflow/cord-19/swivel-128d/1')
  embeddings = module(query_input)

  with tf.train.MonitoredTrainingSession() as sess:

    # Generate embeddings for some terms
    queries = [
        # Related viruses
        "coronavirus", "SARS", "MERS",
        # Regions
        "Italy", "Spain", "Europe",
        # Symptoms
        "cough", "fever", "throat"
    ]

    features = sess.run(embeddings, feed_dict={query_input: queries})
    plot_correlation(queries, features)

بي إن جي

يمكننا أن نرى أن التضمين نجح في التقاط معنى المصطلحات المختلفة. تتشابه كل كلمة مع الكلمات الأخرى في مجموعتها (أي "فيروس كورونا" يرتبط ارتباطًا وثيقًا بكلمة "سارس" و "ميرس") ، في حين أنها تختلف عن مصطلحات المجموعات الأخرى (أي أن التشابه بين "سارس" و "إسبانيا" هو قريبة من 0).

الآن دعونا نرى كيف يمكننا استخدام هذه الزخارف لحل مهمة معينة.

SciCite: تصنيف نية الاقتباس

يوضح هذا القسم كيف يمكن للمرء استخدام التضمين للمهام النهائية مثل تصنيف النص. سنستخدم مجموعة بيانات SciCite من مجموعات بيانات TensorFlow لتصنيف نوايا الاقتباس في الأوراق الأكاديمية. إعطاء جملة مع اقتباس من ورقة أكاديمية ، صنف ما إذا كان الهدف الرئيسي من الاقتباس هو معلومات أساسية ، أو استخدام طرق ، أو مقارنة النتائج.



class Dataset:
  """Build a dataset from a TFDS dataset."""
  def __init__(self, tfds_name, feature_name, label_name):
    self.dataset_builder = tfds.builder(tfds_name)
    self.dataset_builder.download_and_prepare()
    self.feature_name = feature_name
    self.label_name = label_name
  
  def get_data(self, for_eval):
    splits = THE_DATASET.dataset_builder.info.splits
    if tfds.Split.TEST in splits:
      split = tfds.Split.TEST if for_eval else tfds.Split.TRAIN
    else:
      SPLIT_PERCENT = 80
      split = "train[{}%:]".format(SPLIT_PERCENT) if for_eval else "train[:{}%]".format(SPLIT_PERCENT)
    return self.dataset_builder.as_dataset(split=split)

  def num_classes(self):
    return self.dataset_builder.info.features[self.label_name].num_classes

  def class_names(self):
    return self.dataset_builder.info.features[self.label_name].names

  def preprocess_fn(self, data):
    return data[self.feature_name], data[self.label_name]

  def example_fn(self, data):
    feature, label = self.preprocess_fn(data)
    return {'feature': feature, 'label': label}, label


def get_example_data(dataset, num_examples, **data_kw):
  """Show example data"""
  with tf.Session() as sess:
    batched_ds = dataset.get_data(**data_kw).take(num_examples).map(dataset.preprocess_fn).batch(num_examples)
    it = tf.data.make_one_shot_iterator(batched_ds).get_next()
    data = sess.run(it)
  return data


TFDS_NAME = 'scicite' 
TEXT_FEATURE_NAME = 'string' 
LABEL_NAME = 'label' 
THE_DATASET = Dataset(TFDS_NAME, TEXT_FEATURE_NAME, LABEL_NAME)
Downloading and preparing dataset scicite/1.0.0 (download: 22.12 MiB, generated: Unknown size, total: 22.12 MiB) to /home/kbuilder/tensorflow_datasets/scicite/1.0.0...
Shuffling and writing examples to /home/kbuilder/tensorflow_datasets/scicite/1.0.0.incomplete5C35GW/scicite-train.tfrecord
Shuffling and writing examples to /home/kbuilder/tensorflow_datasets/scicite/1.0.0.incomplete5C35GW/scicite-validation.tfrecord
Shuffling and writing examples to /home/kbuilder/tensorflow_datasets/scicite/1.0.0.incomplete5C35GW/scicite-test.tfrecord
Dataset scicite downloaded and prepared to /home/kbuilder/tensorflow_datasets/scicite/1.0.0. Subsequent calls will reuse this data.


NUM_EXAMPLES = 20  
data = get_example_data(THE_DATASET, NUM_EXAMPLES, for_eval=False)
display_df(
    pd.DataFrame({
        TEXT_FEATURE_NAME: [ex.decode('utf8') for ex in data[0]],
        LABEL_NAME: [THE_DATASET.class_names()[x] for x in data[1]]
    }))

تدريب مصنف النوايا citaton

سنقوم بتدريب المصنف على مجموعة بيانات SciCite باستخدام أداة تقدير. لنقم بإعداد input_fns لقراءة مجموعة البيانات في النموذج

def preprocessed_input_fn(for_eval):
  data = THE_DATASET.get_data(for_eval=for_eval)
  data = data.map(THE_DATASET.example_fn, num_parallel_calls=1)
  return data


def input_fn_train(params):
  data = preprocessed_input_fn(for_eval=False)
  data = data.repeat(None)
  data = data.shuffle(1024)
  data = data.batch(batch_size=params['batch_size'])
  return data


def input_fn_eval(params):
  data = preprocessed_input_fn(for_eval=True)
  data = data.repeat(1)
  data = data.batch(batch_size=params['batch_size'])
  return data


def input_fn_predict(params):
  data = preprocessed_input_fn(for_eval=True)
  data = data.batch(batch_size=params['batch_size'])
  return data

دعونا نبني نموذجًا يستخدم حفلات الزفاف CORD-19 مع طبقة تصنيف في الأعلى.

def model_fn(features, labels, mode, params):
  # Embed the text
  embed = hub.Module(params['module_name'], trainable=params['trainable_module'])
  embeddings = embed(features['feature'])

  # Add a linear layer on top
  logits = tf.layers.dense(
      embeddings, units=THE_DATASET.num_classes(), activation=None)
  predictions = tf.argmax(input=logits, axis=1)

  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(
        mode=mode,
        predictions={
            'logits': logits,
            'predictions': predictions,
            'features': features['feature'],
            'labels': features['label']
        })
  
  # Set up a multi-class classification head
  loss = tf.nn.sparse_softmax_cross_entropy_with_logits(
      labels=labels, logits=logits)
  loss = tf.reduce_mean(loss)

  if mode == tf.estimator.ModeKeys.TRAIN:
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=params['learning_rate'])
    train_op = optimizer.minimize(loss, global_step=tf.train.get_or_create_global_step())
    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

  elif mode == tf.estimator.ModeKeys.EVAL:
    accuracy = tf.metrics.accuracy(labels=labels, predictions=predictions)
    precision = tf.metrics.precision(labels=labels, predictions=predictions)
    recall = tf.metrics.recall(labels=labels, predictions=predictions)

    return tf.estimator.EstimatorSpec(
        mode=mode,
        loss=loss,
        eval_metric_ops={
            'accuracy': accuracy,
            'precision': precision,
            'recall': recall,
        })



EMBEDDING = 'https://tfhub.dev/tensorflow/cord-19/swivel-128d/1'  
TRAINABLE_MODULE = False  
STEPS =   8000
EVAL_EVERY = 200  
BATCH_SIZE = 10  
LEARNING_RATE = 0.01  

params = {
    'batch_size': BATCH_SIZE,
    'learning_rate': LEARNING_RATE,
    'module_name': EMBEDDING,
    'trainable_module': TRAINABLE_MODULE
}

تدريب وتقييم النموذج

دعونا ندرب ونقيم النموذج لمعرفة الأداء في مهمة SciCite

estimator = tf.estimator.Estimator(functools.partial(model_fn, params=params))
metrics = []

for step in range(0, STEPS, EVAL_EVERY):
  estimator.train(input_fn=functools.partial(input_fn_train, params=params), steps=EVAL_EVERY)
  step_metrics = estimator.evaluate(input_fn=functools.partial(input_fn_eval, params=params))
  print('Global step {}: loss {:.3f}, accuracy {:.3f}'.format(step, step_metrics['loss'], step_metrics['accuracy']))
  metrics.append(step_metrics)
Global step 0: loss 0.854, accuracy 0.621
Global step 200: loss 0.740, accuracy 0.691
Global step 400: loss 0.687, accuracy 0.733
Global step 600: loss 0.649, accuracy 0.748
Global step 800: loss 0.648, accuracy 0.733
Global step 1000: loss 0.617, accuracy 0.772
Global step 1200: loss 0.610, accuracy 0.757
Global step 1400: loss 0.591, accuracy 0.779
Global step 1600: loss 0.589, accuracy 0.777
Global step 1800: loss 0.580, accuracy 0.777
Global step 2000: loss 0.589, accuracy 0.764
Global step 2200: loss 0.567, accuracy 0.785
Global step 2400: loss 0.572, accuracy 0.774
Global step 2600: loss 0.571, accuracy 0.774
Global step 2800: loss 0.566, accuracy 0.772
Global step 3000: loss 0.568, accuracy 0.770
Global step 3200: loss 0.562, accuracy 0.777
Global step 3400: loss 0.559, accuracy 0.779
Global step 3600: loss 0.554, accuracy 0.777
Global step 3800: loss 0.547, accuracy 0.786
Global step 4000: loss 0.559, accuracy 0.774
Global step 4200: loss 0.550, accuracy 0.783
Global step 4400: loss 0.563, accuracy 0.771
Global step 4600: loss 0.547, accuracy 0.782
Global step 4800: loss 0.542, accuracy 0.786
Global step 5000: loss 0.547, accuracy 0.777
Global step 5200: loss 0.545, accuracy 0.789
Global step 5400: loss 0.545, accuracy 0.785
Global step 5600: loss 0.543, accuracy 0.782
Global step 5800: loss 0.545, accuracy 0.782
Global step 6000: loss 0.539, accuracy 0.784
Global step 6200: loss 0.542, accuracy 0.790
Global step 6400: loss 0.542, accuracy 0.784
Global step 6600: loss 0.548, accuracy 0.781
Global step 6800: loss 0.543, accuracy 0.785
Global step 7000: loss 0.541, accuracy 0.785
Global step 7200: loss 0.541, accuracy 0.778
Global step 7400: loss 0.535, accuracy 0.789
Global step 7600: loss 0.556, accuracy 0.774
Global step 7800: loss 0.544, accuracy 0.783

9ed1 درهم 853

بي إن جي

يمكننا أن نرى أن الخسارة تتناقص بسرعة مع زيادة الدقة بشكل خاص. دعنا نرسم بعض الأمثلة للتحقق من علاقة التنبؤ بالتسميات الحقيقية:

predictions = estimator.predict(functools.partial(input_fn_predict, params))
first_10_predictions = list(itertools.islice(predictions, 10))

display_df(
  pd.DataFrame({
      TEXT_FEATURE_NAME: [pred['features'].decode('utf8') for pred in first_10_predictions],
      LABEL_NAME: [THE_DATASET.class_names()[pred['labels']] for pred in first_10_predictions],
      'prediction': [THE_DATASET.class_names()[pred['predictions']] for pred in first_10_predictions]
  }))

يمكننا أن نرى أنه بالنسبة لهذه العينة العشوائية ، يتنبأ النموذج بالتسمية الصحيحة في معظم الأوقات ، مما يشير إلى أنه يمكنه تضمين الجمل العلمية بشكل جيد.

ماذا بعد؟

الآن بعد أن تعرفت على المزيد عن حفلات الزفاف CORD-19 Swivel من TF-Hub ، نشجعك على المشاركة في مسابقة CORD-19 Kaggle للمساهمة في اكتساب رؤى علمية من النصوص الأكاديمية المتعلقة بـ COVID-19.