طبقه بندی مقاله Bangla با TF-Hub

مشاهده در TensorFlow.org در Google Colab اجرا شود در GitHub مشاهده کنید دانلود دفترچه یادداشت

این COLAB نمایشی از استفاده است Tensorflow توپی برای طبقه بندی متن در غیر انگلیسی / زبان های محلی. در اینجا ما را انتخاب بنگلادش به عنوان زبان محلی و استفاده از pretrained درونه گیریها کلمه برای حل یک کار طبقه بندی multiclass که در آن ما در 5 دسته طبقه بندی اخبار مقالات بنگلادش. درونه گیریها pretrained برای بنگلادش از fastText است که یک کتابخانه توسط فیس بوک با بردار کلمه pretrained منتشر شده برای 157 زبان.

ما صادر تعبیه pretrained TF-توپی برای تبدیل درونه گیریها کلمه به یک ماژول متن تعبیه اول استفاده کنید و سپس با استفاده از ماژول برای آموزش یک طبقه بندی با tf.keras ، سطح بالا کاربران API دوستانه Tensorflow برای ساخت مدل های یادگیری عمیق. حتی اگر در اینجا از جاسازی‌های fastText استفاده می‌کنیم، می‌توان هر جاسازی دیگر را که از پیش آموزش داده شده‌اند از وظایف دیگر صادر کرد و به سرعت با هاب Tensorflow به نتیجه رسید.

برپایی

# https://github.com/pypa/setuptools/issues/1694#issuecomment-466010982
pip install gdown --no-use-pep517
sudo apt-get install -y unzip
Reading package lists...
Building dependency tree...
Reading state information...
unzip is already the newest version (6.0-21ubuntu1.1).
The following packages were automatically installed and are no longer required:
  linux-gcp-5.4-headers-5.4.0-1040 linux-gcp-5.4-headers-5.4.0-1043
  linux-gcp-5.4-headers-5.4.0-1044 linux-gcp-5.4-headers-5.4.0-1049
  linux-headers-5.4.0-1049-gcp linux-image-5.4.0-1049-gcp
  linux-modules-5.4.0-1049-gcp linux-modules-extra-5.4.0-1049-gcp
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 143 not upgraded.
import os

import tensorflow as tf
import tensorflow_hub as hub

import gdown
import numpy as np
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt
import seaborn as sns
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/pkg_resources/__init__.py:119: PkgResourcesDeprecationWarning: 0.18ubuntu0.18.04.1 is an invalid version and will not be supported in a future release
  PkgResourcesDeprecationWarning,

مجموعه داده

ما استفاده خواهد کرد BARD اقتصاد، دولت، بین المللی، ورزش و سرگرمی: (بنگلادش مقاله مجموعه داده) که در حدود 376226 مقالات جمع آوری شده از پورتال های مختلف خبری بنگلادش و نشاندار شده با 5 دسته. ما فایل از Google Drive این (دانلود bit.ly/BARD_DATASET ) لینک است با اشاره به از این مخزن گیتهاب.

gdown.download(
    url='https://drive.google.com/uc?id=1Ag0jd21oRwJhVFIBohmX_ogeojVtapLy',
    output='bard.zip',
    quiet=True
)
'bard.zip'
unzip -qo bard.zip

بردارهای کلمه از پیش آموزش دیده را به ماژول TF-Hub صادر کنید

TF-توپی برای تبدیل درونه گیریها کلمه به TF-هاب ماژول تعبیه متن فراهم می کند برخی از اسکریپت های مفید در اینجا . برای اینکه ماژول برای بنگلادش و یا هر زبان دیگر، ما به سادگی باید برای دانلود کلمه تعبیه .txt و یا .vec فایل را به دایرکتوری همان export_v2.py و اجرای اسکریپت.

صادر کننده خواند بردار تعبیه و صادرات آن به یک Tensorflow SavedModel . SavedModel شامل یک برنامه کامل TensorFlow شامل وزن و نمودار است. TF-توپی می توانید SavedModel به عنوان یک بار ماژول ، که ما استفاده خواهد کرد برای ساخت مدل برای طبقه بندی متن. از آنجا که ما با استفاده از tf.keras برای ایجاد مدل، ما استفاده از hub.KerasLayer ، فراهم می کند که یک wrapper برای یک ماژول TF-توپی برای استفاده به عنوان یک لایه Keras.

اول ما در درونه گیریها به حرف ما از fastText و تعبیه صادر کننده از TF-توپی از مخزن .

curl -O https://dl.fbaipublicfiles.com/fasttext/vectors-crawl/cc.bn.300.vec.gz
curl -O https://raw.githubusercontent.com/tensorflow/hub/master/examples/text_embeddings_v2/export_v2.py
gunzip -qf cc.bn.300.vec.gz --k
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  840M  100  840M    0     0  11.6M      0  0:01:12  0:01:12 --:--:-- 12.0M
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7469  100  7469    0     0  19053      0 --:--:-- --:--:-- --:--:-- 19005

سپس، اسکریپت صادرکننده را در فایل جاسازی خود اجرا می کنیم. از آنجایی که جاسازی‌های fastText یک خط سرصفحه دارند و بسیار بزرگ هستند (حدود 3.3 گیگابایت برای Bangla پس از تبدیل به یک ماژول)، ما خط اول را نادیده می‌گیریم و تنها 100000 نشانه اول را به ماژول جاسازی متن صادر می‌کنیم.

python export_v2.py --embedding_file=cc.bn.300.vec --export_path=text_module --num_lines_to_ignore=1 --num_lines_to_use=100000
INFO:tensorflow:Assets written to: text_module/assets
I1105 11:55:29.817717 140238757988160 builder_impl.py:784] Assets written to: text_module/assets
module_path = "text_module"
embedding_layer = hub.KerasLayer(module_path, trainable=False)

ماژول جاسازی متن دسته ای از جملات را در یک تانسور رشته های 1 بعدی به عنوان ورودی می گیرد و بردارهای جاسازی شکل (batch_size، embedding_dim) مربوط به جملات را خروجی می کند. این ورودی را با تقسیم بر روی فضاها پیش پردازش می کند. درونه گیریها ورد به درونه گیریها جمله با ترکیب sqrtn ترکیب (نگاه کنید به اینجا ). برای نمایش، فهرستی از کلمات Bangla را به عنوان ورودی ارسال می کنیم و بردارهای جاسازی مربوطه را دریافت می کنیم.

embedding_layer(['বাস', 'বসবাস', 'ট্রেন', 'যাত্রী', 'ট্রাক'])
<tf.Tensor: shape=(5, 300), dtype=float64, numpy=
array([[ 0.0462, -0.0355,  0.0129, ...,  0.0025, -0.0966,  0.0216],
       [-0.0631, -0.0051,  0.085 , ...,  0.0249, -0.0149,  0.0203],
       [ 0.1371, -0.069 , -0.1176, ...,  0.029 ,  0.0508, -0.026 ],
       [ 0.0532, -0.0465, -0.0504, ...,  0.02  , -0.0023,  0.0011],
       [ 0.0908, -0.0404, -0.0536, ..., -0.0275,  0.0528,  0.0253]])>

به مجموعه داده Tensorflow تبدیل کنید

از آنجا که مجموعه داده های واقعا بزرگ به جای بارگذاری کل مجموعه داده در حافظه است که ما یک ژنراتور به عملکرد نمونه ها در زمان اجرا در دسته با استفاده از استفاده از Tensorflow مجموعه داده توابع. مجموعه داده نیز بسیار نامتعادل است، بنابراین، قبل از استفاده از ژنراتور، مجموعه داده را به هم می زنیم.

dir_names = ['economy', 'sports', 'entertainment', 'state', 'international']

file_paths = []
labels = []
for i, dir in enumerate(dir_names):
  file_names = ["/".join([dir, name]) for name in os.listdir(dir)]
  file_paths += file_names
  labels += [i] * len(os.listdir(dir))

np.random.seed(42)
permutation = np.random.permutation(len(file_paths))

file_paths = np.array(file_paths)[permutation]
labels = np.array(labels)[permutation]

ما می‌توانیم توزیع برچسب‌ها را در نمونه‌های آموزشی و اعتبارسنجی پس از زدن بررسی کنیم.

train_frac = 0.8
train_size = int(len(file_paths) * train_frac)
# plot training vs validation distribution
plt.subplot(1, 2, 1)
plt.hist(labels[0:train_size])
plt.title("Train labels")
plt.subplot(1, 2, 2)
plt.hist(labels[train_size:])
plt.title("Validation labels")
plt.tight_layout()

png

برای ایجاد یک مجموعه داده با استفاده از یک ژنراتور، ما برای اولین بار نوشتن یک تابع ژنراتور که بار خوانده شده هر یک از مقالات از file_paths و برچسب از آرایه برچسب، و بازده به عنوان مثال یکی از آموزش در هر مرحله. ما این تابع مولد به تصویب tf.data.Dataset.from_generator روش و تعیین نوع خروجی. هر مثال آموزشی یک تاپل حاوی یک مقاله از است tf.string نوع داده ها و برچسب های کد گذاری یک گرم است. ما در مجموعه داده با تقسیم قطار اعتبار 80-20 با استفاده از تقسیم tf.data.Dataset.skip و tf.data.Dataset.take روش.

def load_file(path, label):
    return tf.io.read_file(path), label
def make_datasets(train_size):
  batch_size = 256

  train_files = file_paths[:train_size]
  train_labels = labels[:train_size]
  train_ds = tf.data.Dataset.from_tensor_slices((train_files, train_labels))
  train_ds = train_ds.map(load_file).shuffle(5000)
  train_ds = train_ds.batch(batch_size).prefetch(tf.data.AUTOTUNE)

  test_files = file_paths[train_size:]
  test_labels = labels[train_size:]
  test_ds = tf.data.Dataset.from_tensor_slices((test_files, test_labels))
  test_ds = test_ds.map(load_file)
  test_ds = test_ds.batch(batch_size).prefetch(tf.data.AUTOTUNE)


  return train_ds, test_ds
train_data, validation_data = make_datasets(train_size)

آموزش و ارزیابی مدل

از آنجا که ما در حال حاضر یک پوشش در اطراف ماژول ما به استفاده از آن به عنوان هر لایه دیگر در Keras اضافه شده است، ما می توانیم یک کوچک ایجاد متوالی مدل است که یک پشته خطی از لایه ها. ما می توانیم متن تعبیه ماژول با اضافه model.add درست مانند هر لایه دیگر. ما مدل را با تعیین ضرر و بهینه ساز جمع آوری می کنیم و آن را برای 10 دوره آموزش می دهیم. tf.keras API می توانید Tensorflow مجموعه داده به عنوان ورودی را اداره کند، بنابراین ما می توانیم یک نمونه مجموعه داده به روش مناسب برای آموزش مدل منتقل می کند. از آنجا که ما با استفاده از تابع ژنراتور، tf.data رسیدگی خواهد شد تولید نمونه، جداجدا سفارش داده شده آنها و تغذیه آنها به مدل.

مدل

def create_model():
  model = tf.keras.Sequential([
    tf.keras.layers.Input(shape=[], dtype=tf.string),
    embedding_layer,
    tf.keras.layers.Dense(64, activation="relu"),
    tf.keras.layers.Dense(16, activation="relu"),
    tf.keras.layers.Dense(5),
  ])
  model.compile(loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
      optimizer="adam", metrics=['accuracy'])
  return model
model = create_model()
# Create earlystopping callback
early_stopping_callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=3)

آموزش

history = model.fit(train_data, 
                    validation_data=validation_data, 
                    epochs=5, 
                    callbacks=[early_stopping_callback])
Epoch 1/5
1176/1176 [==============================] - 34s 28ms/step - loss: 0.2181 - accuracy: 0.9279 - val_loss: 0.1580 - val_accuracy: 0.9449
Epoch 2/5
1176/1176 [==============================] - 32s 27ms/step - loss: 0.1411 - accuracy: 0.9505 - val_loss: 0.1411 - val_accuracy: 0.9503
Epoch 3/5
1176/1176 [==============================] - 32s 27ms/step - loss: 0.1307 - accuracy: 0.9534 - val_loss: 0.1359 - val_accuracy: 0.9524
Epoch 4/5
1176/1176 [==============================] - 32s 27ms/step - loss: 0.1248 - accuracy: 0.9555 - val_loss: 0.1318 - val_accuracy: 0.9527
Epoch 5/5
1176/1176 [==============================] - 32s 27ms/step - loss: 0.1196 - accuracy: 0.9567 - val_loss: 0.1247 - val_accuracy: 0.9555

ارزیابی

ما می توانیم دقت و از دست دادن منحنی برای داده های آموزشی و اعتبار با استفاده از تجسم tf.keras.callbacks.History شی بازگردانده شده توسط tf.keras.Model.fit روش، که شامل از دست دادن ارزش و دقت برای هر دوره.

# Plot training & validation accuracy values
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

# Plot training & validation loss values
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

png

png

پیش بینی

می‌توانیم پیش‌بینی‌های داده‌های اعتبارسنجی را دریافت کنیم و ماتریس سردرگمی را بررسی کنیم تا عملکرد مدل را برای هر یک از 5 کلاس ببینیم. از آنجا tf.keras.Model.predict روش یک آرایه دوم برای احتمال ها برای هر کلاس را برمی گرداند، آنها را می توان به برچسب کلاس با استفاده از تبدیل np.argmax .

y_pred = model.predict(validation_data)
y_pred = np.argmax(y_pred, axis=1)
samples = file_paths[0:3]
for i, sample in enumerate(samples):
  f = open(sample)
  text = f.read()
  print(text[0:100])
  print("True Class: ", sample.split("/")[0])
  print("Predicted Class: ", dir_names[y_pred[i]])
  f.close()
রবিন উইলিয়ামস তাঁর হ্যাপি ফিট ছবিতে মজা করে বলেছিলেন, ‘আমি শুনতে পাচ্ছি, মানুষ কিছু একটা চাইছে...সে
True Class:  entertainment
Predicted Class:  state

নির্মাণ শেষে ফিতা কেটে মন্ত্রী ভবন উদ্বোধন করেছেন বহু আগেই। তবে এখনো চালু করা যায়নি খাগড়াছড়ি জেল
True Class:  state
Predicted Class:  state

কমলাপুর বীরশ্রেষ্ঠ মোস্তফা কামাল স্টেডিয়ামে কাল ফকিরেরপুল ইয়ংমেন্স ক্লাব ৩-০ গোলে হারিয়েছে স্বাধ
True Class:  sports
Predicted Class:  state

مقایسه عملکرد

در حال حاضر ما می توانید برچسب های صحیح برای داده ها اعتبار از را labels و مقایسه آنها با پیش بینی های ما به دست آوردن یک classification_report .

y_true = np.array(labels[train_size:])
print(classification_report(y_true, y_pred, target_names=dir_names))
precision    recall  f1-score   support

      economy       0.83      0.76      0.79      3897
       sports       0.99      0.98      0.98     10204
entertainment       0.90      0.94      0.92      6256
        state       0.97      0.97      0.97     48512
international       0.92      0.93      0.93      6377

     accuracy                           0.96     75246
    macro avg       0.92      0.92      0.92     75246
 weighted avg       0.96      0.96      0.96     75246

ما همچنین می توانیم عملکرد مدل ما با نتایج منتشر شده به دست آمده در اصل مقایسه مقاله ، که به حال 0.96 دقت .این نویسندگان اصلی توصیف بسیاری از مراحل قبل از پردازش در مجموعه داده انجام، از قبیل انداختن علائم نشانهگذاری و ارقام، از بین بردن 25 ترین frequest کلمات توقف. همانطور که ما می تواند در دیدن classification_report ، ما نیز مدیریت برای به دست آوردن 0.96 دقت و صحت بعد از آموزش تنها 5 دوره بدون هیچ پیش پردازش.

در این مثال، زمانی که ما لایه Keras از ماژول تعبیه ما ایجاد شده، ما تنظیم پارامتر trainable=False ، که به معنی وزن تعبیه خواهد در طول آموزش به روز نمی شود. سعی کنید آن را به True برای رسیدن به حدود 97٪ دقت با استفاده از این مجموعه داده پس از تنها 2 دوره.