!pip install -q tensorflow-gpu==2.0.0-beta1 # !pip install -q tensorflow-gpu==1.15 import tensorflow as tf import tensorflow_hub as hub import numpy as np import os from sklearn.metrics import classification_report from gensim.models import Word2Vec # দেখি কি কি আসলে আছে? print("Version: ", tf.__version__) print("Eager mode: ", tf.executing_eagerly()) print("Hub version: ", hub.__version__) print("GPU is", "available" if tf.test.is_gpu_available() else "NOT AVAILABLE") tf.__version__ # বাড়তি ওয়ার্নিং ফেলে দিচ্ছি, আপনাদের কাজের সময় লাগবে না import warnings warnings.filterwarnings("ignore") hub_url = "https://tfhub.dev/google/tf2-preview/nnlm-en-dim128/1" embed = hub.KerasLayer(hub_url) embeddings = embed(["A long sentence.", "single-word", "http://example.com"]) print(embeddings.shape, embeddings.dtype) model = tf.keras.Sequential([ embed, tf.keras.layers.Dense(16, activation="relu"), tf.keras.layers.Dense(1, activation="sigmoid"), ]) !wget https://bitbucket.org/r_hassan/datasets/raw/9caa4f67c34540e601cbad4de68d4786271b782c/bn-wiki-word2vec-300.txt.tgz.aa !wget https://bitbucket.org/r_hassan/datasets/raw/9caa4f67c34540e601cbad4de68d4786271b782c/bn-wiki-word2vec-300.txt.tgz.ab # ফাইল কনক্যাটেনেট করে যোগ করে 'টার' থেকে এক্সট্র্যাক্ট !cat bn-wiki-word2vec-300.txt.tgz.* | tar xzf - # প্রথম কয়েক লাইন দেখলেই বুঝবেন কি বলতে চাচ্ছি - ওয়ার্ড এমবেডিং ভেক্টর # শুরুতে বাংলা শব্দটা, এরপরে ভেক্টর !head -7 bn-wiki-word2vec-300.txt !wget https://github.com/raqueeb/datasets/raw/master/bangla-sentiment.pos !wget https://github.com/raqueeb/datasets/raw/master/bangla-sentiment.neg # দেখি এই ফাইলটাতে কি আচ্ছে প্রথম ৫ লাইনে? !head -5 bangla-sentiment.pos # বাকি ফাইলটাতে? !head -5 bangla-sentiment.neg # কি কি ডাউনলোড করলাম? !ls -al preprocessed_text_file_path = 'bangla-sentiment.pos' lines_from_file = [] with open(preprocessed_text_file_path, encoding='utf8') as text_file: for line in text_file: lines_from_file.append(line) # পজিটিভ ফাইলের লাইন সংখ্যা len(lines_from_file) preprocessed_text_file_path = 'bangla-sentiment.neg' lines_from_file = [] with open(preprocessed_text_file_path, encoding='utf8') as text_file: for line in text_file: lines_from_file.append(line) # নেগেটিভ ফাইলের লাইন সংখ্যা len(lines_from_file) # সব এক জায়গায় নিয়ে আসি all_sentences = [] with open('bangla-sentiment.pos', encoding='utf8') as f: all_sentences.extend([(line.strip(), 'positive') for line in f]) with open('bangla-sentiment.neg', encoding='utf8') as f: all_sentences.extend([(line.strip(), 'negative') for line in f]) # all_sentences এর প্রথম পাঁচ লাইন all_sentences[:5] # কতগুলো পজিটিভ আর কতো নম্বর লাইন থেকে নেগেটিভ শুরু হয়েছে? pos_count = 0 neg_count = 0 for sentence, label in all_sentences: if label =='positive': pos_count +=1 else: neg_count +=1 print(pos_count) print(neg_count) # নেগেটিভ লাইন শুরুর প্রথম পাঁচ লাইনে কি আছে? all_sentences[2040:2045] !wget https://raw.githubusercontent.com/tensorflow/hub/master/examples/text_embeddings_v2/export_v2.py # !wget https://raw.githubusercontent.com/tensorflow/hub/master/examples/text_embeddings/export.py !python export_v2.py --embedding_file=/content/bn-wiki-word2vec-300.txt --export_path=text_embedding --num_lines_to_ignore=1 # !python export.py --embedding_file=/content/bn-wiki-word2vec-300.txt --export_path=text_embedding --num_lines_to_ignore=1 --preprocess_text=True # সেভড মডেলের একটা কমান্ড লাইন ইন্টারফেস আছে দেখার জন্য, এখনো কিছু আসেনি এখানে !saved_model_cli show --dir text_embedding --all # এই মডিউলটা ফ্রিজ করা আছে, মনে আছে ট্রান্সফার লার্নিং এর কথা? # পাশাপাশি hub.KerasLayer এর আর্গুমেন্টগুলো দেখুন # __init__( # spec, # trainable=False, # name='module', # tags=None #) embedding_path = "text_embedding" embedding_layer = hub.KerasLayer(embedding_path, trainable=True) # embedding_layer = hub.KerasLayer(embedding_path, trainable=False) print(embedding_layer) embedding_layer(['ভালো আছি'], ['আমরা']).shape import random def generator(): random.shuffle(all_sentences) for sentence, label in all_sentences: if label =='positive': label = tf.keras.utils.to_categorical(1, num_classes=2) else: label = tf.keras.utils.to_categorical(0, num_classes=2) sentence_tensor = tf.constant(sentence, dtype=tf.dtypes.string) yield sentence_tensor, label def make_dataset(train_size): data = tf.data.Dataset.from_generator(generator=generator, output_types=(tf.string, tf.float32)) train_size = 4000 train_data = data.take(train_size) validation_data = data.skip(train_size) return train_data, validation_data # ৮০-২০% ভাগ করে ডেটাসেট তৈরি train_data, validation_data = make_dataset(0.80) # একটা ব্যাচ দেখি, যেখানে ২টা এলিমেন্ট থাকবে train_data থেকে # এরকম বেশ কয়েকটা উদাহরন দেখি নিচে next(iter(train_data.batch(2))) sentences_in_a_single_batch, labels_in_a_single_batch = next(iter(train_data.batch(2))) sentences_in_a_single_batch sentences_in_a_single_batch.shape labels_in_a_single_batch.shape sentence, label = next(iter(train_data.take(1))) # numpy()কে ডিকোড করতে হবে ইউনিকোডে, তা না হলে স্ট্রিংকে বাইট হিসেবে পাঠাবে sentence.numpy().decode('utf8') # to_categorical() এর কনভার্সনের পর লেবেল label.numpy() def create_model(): model = tf.keras.Sequential() model.add(embedding_layer) # model.add(tf.keras.layers.Flatten()) # model.add(tf.keras.layers.SpatialDropout1D(0.2)) # model.add(tf.keras.layers.LSTM(100, dropout=0.2, recurrent_dropout=0.2)) # model.add(Dense(13, activation='softmax')) model.add(tf.keras.layers.Dense(256, activation="relu")) model.add(tf.keras.layers.Dense(128, activation="relu")) model.add(tf.keras.layers.Dense(2, activation="softmax")) model.compile(optimizer="adam",loss="categorical_crossentropy",metrics=['acc']) return model from tensorflow.keras.callbacks import TensorBoard log_dir="logs/fit/" tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1) model = create_model() batch_size = 256 history = model.fit(train_data.batch(batch_size), validation_data=validation_data.batch(batch_size), epochs=10,callbacks=[tensorboard_callback]) model.summary() tf.saved_model.save(model, export_dir="my_model") sents = ['আমারা খুবি খুশি অফারটির জন্য', 'বই পড়তে অনেক পছন্দ করি', 'আজকের ঘটনা আমাকে মনে কষ্ট দিয়েছে', 'কাজটা খুব খারাপ হয়েছে', 'আমি দেশকে খুব ভালবাসি', 'এই বইটা বেশ ভালো লাগছে', 'একটা দুর্ঘটনা ঘটে গেল', 'আজকে একটা অসাধারণ অভিজ্ঞতা হলো', 'আমাদের কাজ করতে বেশ কষ্ট হয়', 'বিদ্যুতের ঘাটতি হলে কারখানার কাজ কমে যায়', 'ঢাকা-সিলেটসহ আশপাশের সড়কের যানবাহন চলাচল বন্ধ হয়ে যায়',] pred_dataset = tf.data.Dataset.from_tensor_slices(sents) prediction = model.predict(np.array(sents)) for sentence, pred_sentiment in zip(sents, prediction.argmax(axis=1)): print("Sentence:{} - predicted: {}".format(sentence, pred_sentiment)) %reload_ext tensorboard %tensorboard --logdir logs/fit