TF-Hub ile Bangla Madde Sınıflandırması

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın GitHub'da görüntüle Not defterini indir

Bu CoLab kullanmanın bir tanıtımdır Tensorflow Hub İngilizce olmayan / yerel dillerde metin sınıflandırma için. Burada seçim Bangla yerel dil olarak ve biz 5 kategoride Bangla haber makalelerini sınıflandırmak bir çok sınıflı sınıflandırma görevi çözmek için kelime katıştırmalarını pretrained kullanın. Bangla için pretrained kalıplamaların geliyor Fasttext 157 dilde yayımlanan pretrained kelime vektörler ile Facebook tarafından bir kütüphanedir.

Önce bir metin gömme modülüne kelime katıştırmalarını dönüştürmek için TF-Hub pretrained katıştırma ihracatçısı kullanacağız ve ardından aldığı bir sınıflandırıcı yetiştirmek modülü kullanmak tf.keras , Tensorflow en yüksek düzeyde kullanıcı dostu API derin öğrenme modellerini oluşturmak için. Burada fastText yerleştirmelerini kullanıyor olsak bile, diğer görevlerden önceden eğitilmiş diğer yerleştirmeleri dışa aktarmak ve Tensorflow hub ile hızlı bir şekilde sonuç almak mümkündür.

Kurmak

# 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,

veri kümesi

Biz kullanacağız Bard ekonomi, devlet, uluslararası, spor ve eğlence: Farklı Bangla haber portallarından toplanan ve 5 kategori ile etiketlenmiş etrafında 376.226 makaleleri vardır (Bangla Madde Veri seti). Bu (Google Drive, dosyayı indirmeye bit.ly/BARD_DATASET ) linkinden bahsediyor bu GitHub depo.

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

Önceden eğitilmiş kelime vektörlerini TF-Hub modülüne aktarın

TF-Hub TF-göbek metin katıştırma modülleri kelime katıştırmalarını dönüştürmek için bazı yararlı komut dosyaları sağlar burada . Bangla'daki veya başka bir dil için modül yapmak için, biz sadece gömme sözcüğü indirmek zorunda .txt veya .vec aynı dizine export_v2.py ve komut dosyasını çalıştırın.

İhracatçı gömme vektörleri okur ve bir Tensorflow bunu ihraç SavedModel . SavedModel, ağırlıkları ve grafiği içeren eksiksiz bir TensorFlow programı içerir. TF-Hub bir şekilde SavedModel yükleyebilirsiniz modülü biz metin sınıflandırma için model oluşturmak için kullanacaktır. Kullandığımız yana tf.keras model oluşturmak için, kullanacağımız hub.KerasLayer bir Keras bir tabaka olarak kullanım için bir TF-Hub modülü için bir sargıyı içerir.

İlk olarak TF-Hub bizim kelime Fasttext gelen katıştırmalarını ve gömme ihracatçısı alacak repo .

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

Ardından, gömme dosyamızdaki ihracatçı betiğini çalıştıracağız. fastText yerleştirmeleri bir başlık satırına sahip olduğundan ve oldukça büyük olduğundan (bir modüle dönüştürdükten sonra Bangla için yaklaşık 3,3 GB), ilk satırı yok sayar ve metin yerleştirme modülüne yalnızca ilk 100.000 jetonu dışa aktarırız.

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)

Metin gömme modülü, girdi olarak bir 1D dizgi tensöründe bir dizi cümle alır ve cümlelere karşılık gelen gömme şekil vektörlerini (batch_size, embedding_dim) verir. Boşluklara bölerek girişi önceden işler. Kelime kalıplamaların ile cümle tespitlerinin birleştirilerek sqrtn birleştirici (Bkz buraya ). Gösterim için, girdi olarak bir Bangla kelime listesi iletiyoruz ve ilgili gömme vektörlerini alıyoruz.

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 Veri Kümesine Dönüştür

Veri kümesi yerine bellekte tüm veri kümesini yükleme gerçekten büyük olduğu için kullandığımız gruplar halinde çalışma zamanında örnekleri elde etmek için bir jeneratör kullanacak Tensorflow Veri kümesi fonksiyonları. Veri kümesi de çok dengesizdir, bu nedenle üreteci kullanmadan önce veri kümesini karıştıracağız.

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]

Karıştırdıktan sonra eğitim ve doğrulama örneklerinde etiketlerin dağılımını kontrol edebiliriz.

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

Bir oluşturmak için Dataset bir jeneratör kullanarak, öncelikle bir jeneratör makalelerin her okur fonksiyon yazmak file_paths her adımda etiket diziden ve etiketler ve verimi bir eğitim örneği. Biz bu jeneratör işlevi geçmesi tf.data.Dataset.from_generator yöntemi ve çıkış türlerini belirtir. Her eğitim örneğin bir maddesi içeren bir başlık olur tf.string veri tipi ve bir sıcak kodlanmış etiket. Biz kullanarak 80-20 bir tren doğrulama bölünmüş veri kümesi bölmek tf.data.Dataset.skip ve tf.data.Dataset.take yöntemleri.

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)

Model Eğitimi ve Değerlendirmesi

Daha önce keras başka katman olarak kullanmak için modül etrafında sarıcı ilave beri, küçük oluşturabilir ardışık katmanların doğrusal yığını modeli. Biz bizim metin gömme modülü ekleyebilir model.add tıpkı diğer katman gibi. Modeli, kayıp ve optimize ediciyi belirterek derliyoruz ve 10 epoch için eğitiyoruz. tf.keras biz modeli eğitim için uygun yönteme bir Veri kümesi örneğini geçirebilmeleri için API, girdi olarak Tensorflow Veri Kümeleri işleyebilir. Jeneratörü fonksiyonunu kullanarak beri, tf.data , örneklerini oluşturan bunları dozajları ve modeli 'ne yedirilmeleri idare edecektir.

modeli

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)

Eğitim

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

Değerlendirme

Biz kullanılarak eğitim ve doğrulama verileri için doğru ve kayıp eğrilerini görselleştirmek tf.keras.callbacks.History tarafından döndürülen bir nesne tf.keras.Model.fit her dönem için kaybı ve doğruluk değeri içeren bir yöntem.

# 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

Tahmin

Doğrulama verileri için tahminleri alabilir ve 5 sınıfın her biri için modelin performansını görmek için karışıklık matrisini kontrol edebiliriz. Çünkü tf.keras.Model.predict yöntem, her sınıf için olasılıklar için bir nd dizi döner, bu kullanarak sınıf etiket dönüştürülebilir 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

Performansı Karşılaştır

Şimdi gelen doğrulama verileri için doğru etiketleri alabilir labels ve almak için bizim tahminler ile karşılaştırmak 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

Ayrıca orijinal elde yayınlanan sonuçlarla bizim modelin performansını karşılaştırabilirsiniz kağıt 0.96 hassas hayranlarıyla orijinal yazarlar birçok ön işleme aşamaları böyle, noktalama ve rakam bırakarak en iyi 25 en yoluylaSQLConfigDataSourceilefRequestparametre durdurma sözcükleri ayıklaması gibi veri kümesi üzerinde gerçekleştirilen tarif vardı. Biz görebileceğiniz gibi classification_report , biz de herhangi bir ön işleme olmadan sadece 5 dönemini için eğitim sonrasında 0,96 hassasiyet ve doğruluk elde etmek için yönetmek!

Bizim gömme modülünden Keras tabakası oluştururken Bu örnekte, biz parametre set trainable=False eğitim sırasında güncelleştirilmiş olmayacak gömme ağırlıklarını demektir. Bunu belirlemeyi deneyin True sadece 2 dönemini sonra bu veri kümesini kullanarak etrafında% 97 doğruluk ulaşmak için.