Natural Language Processing (NLP) এবং PyTorch

Machine Learning - পাইটর্চ (Pytorch)
131
131

Natural Language Processing (NLP) হল একটি শাখা যা কম্পিউটার সিস্টেমকে মানুষের ভাষা (যেমন ইংরেজি, বাংলা, ইত্যাদি) বুঝতে, বিশ্লেষণ করতে এবং প্রক্রিয়া করতে সহায়তা করে। NLP-এর মাধ্যমে কম্পিউটার ভাষার বিভিন্ন দিক যেমন বাক্য গঠন (Syntax), অর্থ (Semantics), এবং ব্যবহারিক অর্থ (Pragmatics) বুঝতে পারে এবং সেই অনুযায়ী সিদ্ধান্ত নিতে পারে।

PyTorch একটি শক্তিশালী ডিপ লার্নিং ফ্রেমওয়ার্ক যা NLP প্রকল্পে ব্যবহার করা যেতে পারে। PyTorch-এ torchtext লাইব্রেরি এবং বিভিন্ন পিপলিন (pipeline) সহ NLP কাজগুলো সুশৃঙ্খলভাবে করা যায়।

এই পোস্টে, আমরা PyTorch দিয়ে একটি সাধারণ NLP প্রজেক্ট তৈরির প্রক্রিয়া ব্যাখ্যা করব।


NLP এর মৌলিক কাজগুলো

  1. টেক্সট ক্লাসিফিকেশন: একটি টেক্সট ডকুমেন্টকে নির্দিষ্ট শ্রেণিতে (যেমন স্প্যাম বা নন-স্প্যাম) ভাগ করা।
  2. টেক্সট জেনারেশন: নতুন টেক্সট তৈরি করা, যেমন গণনা বা কবিতা সৃষ্টি
  3. ভাষা মডেলিং: একটি ভাষার শিরোনাম বা বাক্য প্রেডিক্ট করা।
  4. অবজেক্ট নামকরণ (Named Entity Recognition - NER): টেক্সট থেকে নাম, স্থান বা অন্যান্য সত্ত্বা চিন্হিত করা।
  5. ট্রান্সলেশন: একটি ভাষা থেকে অন্য ভাষায় অনুবাদ করা।
  6. সেন্টিমেন্ট অ্যানালাইসিস: টেক্সট থেকে ইতিবাচক বা নেতিবাচক অনুভূতি নির্ধারণ করা।

PyTorch এবং NLP

PyTorch, বিশেষ করে torchtext লাইব্রেরি ব্যবহার করে, সহজে NLP মডেল তৈরি করা সম্ভব। PyTorch-এর গঠন এবং টেনসর ব্যবস্থাপনা NLP কাজকে সহজ করে তোলে। এর সাহায্যে আমরা বিভিন্ন NLP সমস্যার জন্য মডেল তৈরি করতে পারি, যেমন রেকারেন্ট নিউরাল নেটওয়ার্ক (RNN), লং শর্ট টার্ম মেমোরি (LSTM), বা ট্রান্সফর্মার মডেল।


PyTorch দিয়ে Text Classification Model উদাহরণ

এখানে আমরা একটি সাধারণ টেক্সট ক্লাসিফিকেশন মডেল তৈরি করব, যা IMDb ডেটাসেট ব্যবহার করে সিনেমার রিভিউ প্রেডিক্ট করবে (ইতিবাচক বা নেতিবাচক)।

১. প্রয়োজনীয় লাইব্রেরি ইনস্টলেশন

pip install torch torchvision torchtext

২. ডেটাসেট লোডিং এবং প্রিপ্রসেসিং

import torch
from torchtext import data
from torchtext import datasets

# টেক্সট ফিল্ড তৈরি
TEXT = data.Field(sequential=True, tokenize='spacy', batch_first=True, include_lengths=True)
LABEL = data.LabelField(dtype=torch.float)

# ডেটাসেট লোড করা (IMDb)
train_data, test_data = datasets.IMDB.splits(TEXT, LABEL)

# ট্রেনিং ডেটা এবং টেস্ট ডেটা ভাগ করা
train_data, valid_data = train_data.split(random_state=torch.manual_seed(1234))

# শব্দ ভোকাবুলারি তৈরি করা
TEXT.build_vocab(train_data, max_size=25000, vectors="glove.6B.100d", unk_init=torch.Tensor.normal_)
LABEL.build_vocab(train_data)

# ডেটা লোডার তৈরি করা
batch_size = 64

train_iterator, valid_iterator, test_iterator = data.BucketIterator.splits(
    (train_data, valid_data, test_data), 
    batch_size=batch_size,
    device=torch.device("cuda" if torch.cuda.is_available() else "cpu")
)

৩. মডেল আর্কিটেকচার

এখন, একটি সাধারণ LSTM মডেল তৈরি করি:

import torch.nn as nn

class RNNModel(nn.Module):
    def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, n_layers, dropout):
        super().__init__()
        
        self.embedding = nn.Embedding(input_dim, embedding_dim)
        self.rnn = nn.LSTM(embedding_dim, hidden_dim, num_layers=n_layers, dropout=dropout, batch_first=True)
        self.fc = nn.Linear(hidden_dim, output_dim)
        self.dropout = nn.Dropout(dropout)
        self.sigmoid = nn.Sigmoid()

    def forward(self, text, text_lengths):
        embedded = self.embedding(text)
        packed_embedded = nn.utils.rnn.pack_padded_sequence(embedded, text_lengths, batch_first=True, enforce_sorted=False)
        packed_output, (hidden, cell) = self.rnn(packed_embedded)
        output = self.fc(self.dropout(hidden[-1]))
        return self.sigmoid(output)

# ইনপুট আউটপুট সাইজ নির্ধারণ
input_dim = len(TEXT.vocab)
embedding_dim = 100
hidden_dim = 256
output_dim = 1
n_layers = 2
dropout = 0.5

# মডেল তৈরি
model = RNNModel(input_dim, embedding_dim, hidden_dim, output_dim, n_layers, dropout)

৪. মডেল ট্রেনিং এবং অপটিমাইজেশন

import torch.optim as optim

# অপটিমাইজার এবং লস ফাংশন
optimizer = optim.Adam(model.parameters())
criterion = nn.BCEWithLogitsLoss()

# মডেল ট্রেনিং
def train_model(model, iterator, optimizer, criterion):
    model.train()
    epoch_loss = 0
    epoch_acc = 0

    for batch in iterator:
        optimizer.zero_grad()
        text, text_lengths = batch.text
        predictions = model(text, text_lengths).squeeze(1)
        loss = criterion(predictions, batch.label)
        acc = binary_accuracy(predictions, batch.label)
        loss.backward()
        optimizer.step()
        epoch_loss += loss.item()
        epoch_acc += acc.item()
    
    return epoch_loss / len(iterator), epoch_acc / len(iterator)

# Accuracy ফাংশন
def binary_accuracy(preds, y):
    rounded_preds = torch.round(preds)
    correct = (rounded_preds == y).float()
    acc = correct.sum() / len(correct)
    return acc

৫. মডেল টেস্টিং

# মডেল টেস্টিং
def evaluate_model(model, iterator, criterion):
    model.eval()
    epoch_loss = 0
    epoch_acc = 0

    with torch.no_grad():
        for batch in iterator:
            text, text_lengths = batch.text
            predictions = model(text, text_lengths).squeeze(1)
            loss = criterion(predictions, batch.label)
            acc = binary_accuracy(predictions, batch.label)
            epoch_loss += loss.item()
            epoch_acc += acc.item()

    return epoch_loss / len(iterator), epoch_acc / len(iterator)

# ট্রেনিং এবং টেস্টিং চলবে
for epoch in range(10):
    train_loss, train_acc = train_model(model, train_iterator, optimizer, criterion)
    valid_loss, valid_acc = evaluate_model(model, valid_iterator, criterion)
    print(f'Epoch {epoch+1}')
    print(f'Training Loss: {train_loss:.3f}, Training Accuracy: {train_acc*100:.2f}%')
    print(f'Validation Loss: {valid_loss:.3f}, Validation Accuracy: {valid_acc*100:.2f}%')

NLP মডেল ব্যবহার

একবার মডেল ট্রেনিং শেষ হলে, আপনি এটিকে প্রেডিকশন করার জন্য ব্যবহার করতে পারেন। উদাহরণস্বরূপ, একটি সিনেমার রিভিউ প্রেডিক্ট করার জন্য:

def predict_sentiment(model, sentence):
    model.eval()
    tokenized = sentence.split()
    indexed = [TEXT.vocab.stoi[t] for t in tokenized]
    tensor = torch.LongTensor(indexed).unsqueeze(0)
    length = torch.LongTensor([len(indexed)])
    
    prediction = model(tensor, length)
    return prediction.item()

sentence = "This movie is amazing!"
print(predict_sentiment(model, sentence))  # Sentiment prediction (0 = Negative, 1 = Positive)

সারাংশ

  • NLP হল একটি অত্যন্ত গুরুত্বপূর্ণ শাখা যেখানে কম্পিউটারের মাধ্যমে মানুষের ভাষা বিশ্লেষণ এবং বোঝা হয়। PyTorch ব্যবহার করে text classification, language modeling, text generation ইত্যাদি কাজ করা যায়।
  • এখানে আমরা IMDb ডেটাসেট ব্যবহার করে একটি sentiment analysis মডেল তৈরি করেছি যা সিনেমার রিভিউ থেকে ইতিবাচক বা নেতিবাচক সেন্টিমেন্ট প্রেডিক্ট করে।
  • RNN (Recurrent Neural Network) ব্যবহার করা হয়েছে, তবে আপনি LSTM বা GRU এর মতো আরও উন্নত মডেল ব্যবহার করতে পারেন।

PyTorch একটি শক্তিশালী টুল যা NLP প্রকল্পগুলিতে সহজে ডিপ লার্নিং মডেল তৈরি এবং ট্রেনিং করতে সহায়ক।

Content added By

NLP এর ধারণা এবং PyTorch এ কাজ করা

129
129

NLP (Natural Language Processing) এর ধারণা

Natural Language Processing (NLP) হল মেশিন লার্নিং এবং আর্টিফিশিয়াল ইনটেলিজেন্সের একটি শাখা যা কম্পিউটারের মাধ্যমে মানুষের ভাষা (যেমন, ইংরেজি, বাংলা, স্প্যানিশ ইত্যাদি) বুঝতে, বিশ্লেষণ করতে, প্রক্রিয়া করতে এবং উৎপাদন করতে ব্যবহৃত হয়। NLP এর উদ্দেশ্য হলো কম্পিউটারের মাধ্যমে ভাষার সঙ্গে সম্পর্কিত কাজগুলো সহজ করা, যেমন:

  • টেক্সট ক্লাসিফিকেশন: কোন টেক্সট একটি নির্দিষ্ট ক্যাটেগরিতে পড়ে (যেমন, স্প্যাম ডিটেকশন)।
  • টেক্সট জেনারেশন: নতুন টেক্সট তৈরি করা (যেমন, সঙ্গীত লেখা, গল্প তৈরি)।
  • ট্রান্সলেশন: একটি ভাষা থেকে অন্য ভাষায় অনুবাদ (যেমন, গুগল ট্রান্সলেট)।
  • সেন্টিমেন্ট অ্যানালাইসিস: টেক্সটের মধ্যে অনুভূতি বিশ্লেষণ করা (যেমন, পজিটিভ বা নেগেটিভ রিভিউ শনাক্তকরণ)।
  • নামকরণ এন্টিটি রিকগনিশন (NER): টেক্সট থেকে নাম, স্থান বা তারিখের মতো গুরুত্বপূর্ণ তথ্য শনাক্ত করা।

NLP বিভিন্ন কাজের জন্য ভাষার গঠন ও অর্থ বুঝতে চেষ্টা করে। এটি ভাষাগত বৈশিষ্ট্য যেমন Syntax (বাক্য গঠন) এবং Semantics (অর্থ) বিশ্লেষণ করে।


PyTorch এ NLP কাজ করা

PyTorch একটি পাওয়ারফুল ডিপ লার্নিং লাইব্রেরি যা NLP কাজের জন্যও ব্যাপকভাবে ব্যবহৃত হয়। PyTorch এ NLP কাজ করার জন্য মূলত TorchText লাইব্রেরি ব্যবহার করা হয়, তবে PyTorch এর অন্যান্য লাইব্রেরি এবং transformers এর মতো লাইব্রেরিও NLP টাস্কে ব্যবহৃত হয়।

PyTorch এ NLP কাজের জন্য কিছু মৌলিক স্টেপস:

  1. ডেটা লোড এবং প্রিপ্রসেসিং: প্রাথমিক কাজ হচ্ছে ডেটা লোড করা এবং সঠিকভাবে প্রিপ্রসেসিং করা (যেমন, টোকেনাইজেশন, স্টপওয়ার্ড রিমুভাল, লেমাটাইজেশন)।
  2. টোকেনাইজেশন: টোকেনাইজেশন হল টেক্সটকে ছোট ছোট ইউনিটে (টোকেন) ভেঙে ফেলা, যেমন শব্দ বা অক্ষর। এতে শব্দ বা বাক্যকে সঠিকভাবে প্রক্রিয়া করা সহজ হয়।
  3. এম্বেডিং (Word Embeddings): NLP মডেলগুলি সাধারণত word embeddings ব্যবহার করে, যেমন Word2Vec, GloVe, বা FastText, যেগুলি শব্দগুলির অর্থ এবং সম্পর্ক সম্বলিত ভেক্টর তৈরি করে।
  4. মডেল তৈরি: PyTorch এ সাধারণত RNN, LSTM, GRU অথবা Transformer মডেল ব্যবহার করা হয় NLP টাস্কে।
  5. মডেল ট্রেনিং এবং টেস্টিং: মডেলটি ট্রেনিং ডেটা দিয়ে ট্রেন করা হয় এবং পরে টেস্ট ডেটা দিয়ে এর পারফরমেন্স মূল্যায়ন করা হয়।

PyTorch এ NLP কাজের উদাহরণ: টেক্সট ক্লাসিফিকেশন

এখানে একটি সাধারণ টেক্সট ক্লাসিফিকেশন মডেল তৈরি করার উদাহরণ দেওয়া হয়েছে, যেখানে আমরা PyTorch ব্যবহার করে একটি LSTM মডেল তৈরি করব এবং একটি ছোট ডেটাসেট ব্যবহার করে ট্রেন করব।

ধাপ ১: প্রয়োজনীয় প্যাকেজ ইনস্টল করা

pip install torch torchtext

ধাপ ২: ডেটাসেট লোড এবং প্রিপ্রসেসিং

আমরা TorchText ব্যবহার করে ডেটাসেট লোড করব এবং প্রিপ্রসেস করব। এখানে একটি সাধারণ IMDB ডেটাসেট ব্যবহার করা হয়েছে, যা পজিটিভ এবং নেগেটিভ সিনেমা রিভিউ থেকে তৈরি।

import torch
from torchtext import data
from torchtext.datasets import IMDB

# ফিল্ডস তৈরি করা
TEXT = data.Field(sequential=True, lower=True, batch_first=True)
LABEL = data.LabelField(dtype=torch.float)

# IMDB ডেটাসেট লোড করা
train_data, test_data = IMDB.splits(TEXT, LABEL)

# শব্দ ভোকাবুলারি তৈরি করা
TEXT.build_vocab(train_data, max_size=25000, vectors="glove.6B.100d", unk_init=torch.Tensor.normal_)
LABEL.build_vocab(train_data)

# ডেটা লোডার তৈরি করা
train_iterator, test_iterator = data.BucketIterator.splits((train_data, test_data), batch_size=64, device=device)

ধাপ ৩: LSTM মডেল তৈরি করা

এখন আমরা একটি সোজা LSTM মডেল তৈরি করব যা টেক্সট ক্লাসিফিকেশন করবে।

import torch.nn as nn

class LSTMModel(nn.Module):
    def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, n_layers, dropout):
        super().__init__()
        self.embedding = nn.Embedding(input_dim, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, hidden_dim, n_layers, dropout=dropout, batch_first=True)
        self.fc = nn.Linear(hidden_dim, output_dim)
        self.dropout = nn.Dropout(dropout)
    
    def forward(self, text):
        embedded = self.embedding(text)
        lstm_out, (hidden, cell) = self.lstm(embedded)
        hidden = self.dropout(hidden[-1])
        out = self.fc(hidden)
        return out

# মডেল ইনস্ট্যান্স তৈরি
input_dim = len(TEXT.vocab)
embedding_dim = 100
hidden_dim = 256
output_dim = 1
n_layers = 2
dropout = 0.5

model = LSTMModel(input_dim, embedding_dim, hidden_dim, output_dim, n_layers, dropout)

ধাপ ৪: মডেল ট্রেনিং

এখন আমরা আমাদের LSTM মডেলটি ট্রেনিং করব। এর জন্য আমরা binary cross-entropy loss এবং Adam optimizer ব্যবহার করব।

import torch.optim as optim
from torchmetrics.classification import BinaryAccuracy

# অপটিমাইজার এবং লস ফাংশন
optimizer = optim.Adam(model.parameters())
criterion = nn.BCEWithLogitsLoss()

# মডেল ট্রেনিং
def train_model(model, iterator, optimizer, criterion):
    model.train()
    epoch_loss = 0
    epoch_acc = 0

    for batch in iterator:
        optimizer.zero_grad()
        predictions = model(batch.text).squeeze(1)
        loss = criterion(predictions, batch.label)
        acc = BinaryAccuracy()(predictions, batch.label)
        loss.backward()
        optimizer.step()

        epoch_loss += loss.item()
        epoch_acc += acc.item()

    return epoch_loss / len(iterator), epoch_acc / len(iterator)

# ট্রেনিং চালানো
train_loss, train_acc = train_model(model, train_iterator, optimizer, criterion)
print(f'Train Loss: {train_loss:.3f}, Train Accuracy: {train_acc*100:.2f}%')

ধাপ ৫: মডেল টেস্টিং

টেস্ট ডেটা দিয়ে মডেলটির পারফরম্যান্স যাচাই করতে:

def evaluate_model(model, iterator, criterion):
    model.eval()
    epoch_loss = 0
    epoch_acc = 0

    with torch.no_grad():
        for batch in iterator:
            predictions = model(batch.text).squeeze(1)
            loss = criterion(predictions, batch.label)
            acc = BinaryAccuracy()(predictions, batch.label)

            epoch_loss += loss.item()
            epoch_acc += acc.item()

    return epoch_loss / len(iterator), epoch_acc / len(iterator)

test_loss, test_acc = evaluate_model(model, test_iterator, criterion)
print(f'Test Loss: {test_loss:.3f}, Test Accuracy: {test_acc*100:.2f}%')

সারাংশ

NLP (Natural Language Processing) হলো ভাষা সম্পর্কিত কাজের জন্য ব্যবহৃত মেশিন লার্নিং এবং ডিপ লার্নিং এর শাখা। PyTorch এ NLP কাজ করার জন্য বিভিন্ন প্রযুক্তি এবং মডেল (যেমন LSTM, GRU, Transformer) ব্যবহার করা হয়। এখানে আমরা LSTM ব্যবহার করে একটি টেক্সট ক্লাসিফিকেশন মডেল তৈরি করেছি যা প্রাক প্রশিক্ষিত GloVe embeddings এবং TorchText ব্যবহার করে ইম্প্লিমেন্ট করা হয়েছে। PyTorch একটি শক্তিশালী প্ল্যাটফর্ম NLP মডেল ট্রেনিং এবং ডিপ লার্নিং কাজগুলো সহজ এবং দ্রুত করতে সাহায্য করে।

Content added By

Word Embeddings (Word2Vec, GloVe)

147
147

Word Embeddings হলো একটি প্রক্রিয়া যার মাধ্যমে শব্দগুলোকে একটি সুনির্দিষ্ট ভেক্টরে রূপান্তরিত করা হয়, যেখানে প্রতিটি শব্দ একটি নির্দিষ্ট সংখ্যার ভেক্টর হিসেবে উপস্থাপিত হয়। Word Embeddings শব্দের মধ্যে সেমান্টিক সম্পর্ক (semantic relationships) ধরতে সাহায্য করে এবং শব্দের মধ্যে ভৌত বা অর্থগত সম্পর্ক তৈরি করে।

Word embeddings এর মাধ্যমে, একে অপরের সাথে সম্পর্কিত শব্দগুলো কাছাকাছি অবস্থানে থাকে, যা মেশিন লার্নিং বা ডিপ লার্নিং মডেলগুলিকে ভাষার অর্থ বুঝতে সাহায্য করে।

১. Word2Vec (Word to Vec)

Word2Vec (Word to Vec) হলো একটি পদ্ধতি যা শব্দের জন্য dense vector representations তৈরি করতে ব্যবহৃত হয়। এটি Google দ্বারা উন্নত একটি শব্দ এম্বেডিং মডেল, যা শব্দের মধ্যে সেমান্টিক সম্পর্ক শেখার জন্য প্রশিক্ষিত হয়।

Word2Vec দুটি প্রধান আর্কিটেকচারে কাজ করে:

  • Continuous Bag of Words (CBOW): এই মডেলে, আপনি একটি শব্দের আশেপাশের শব্দগুলো (কনটেক্সট) জানলে মূল শব্দটি কী হবে তা শিখেন।
  • Skip-gram: এই মডেলে, আপনি একটি মূল শব্দ জানলে তার আশেপাশের শব্দগুলো কী হবে তা শিখেন।

Word2Vec এর কাজের পদ্ধতি:

  1. Training Process: Word2Vec একটি নিউরাল নেটওয়ার্ক ব্যবহার করে প্রশিক্ষিত হয়, যেখানে এটি শব্দের কনটেক্সটের ভিত্তিতে একটি শব্দের বৈশিষ্ট্য শিখতে চেষ্টা করে। যেমন, "কুকুর" এবং "বিড়াল" শব্দের মধ্যে সেমান্টিক সম্পর্ক থেকে তাদের এম্বেডিং (vector) কাছাকাছি হবে।
  2. Vector Representation: প্রশিক্ষণের পর, প্রতিটি শব্দের একটি নির্দিষ্ট ভেক্টর তৈরি হয়, যা মডেল দ্বারা শিখিত হয় এবং যেটি অন্য শব্দের থেকে পার্থক্য বোঝাতে সাহায্য করে।
  3. Analogy Example: Word2Vec দিয়ে আপনি শব্দের মধ্যে অ্যানোলোজি (analogy) সম্পর্কও বের করতে পারেন:
    • King - Man + Woman = Queen
    • এটি মডেলের জন্য একটি উদাহরণ হতে পারে, যেখানে আমরা কিংয়ের সমান অক্ষাংশের সাথে মহিলার (Woman) সমান রূপান্তর করি এবং Queen পেয়ে যাই।

Word2Vec এর সুবিধা:

  • দ্রুত প্রশিক্ষণ এবং উচ্চ ক্ষমতা
  • কনটেক্সটভিত্তিক শব্দের সম্পর্ক ধরা
  • ম্যানুয়ালি শব্দের সম্পর্ক বোঝার থেকে অনেক কার্যকর

২. GloVe (Global Vectors for Word Representation)

GloVe (Global Vectors for Word Representation) একটি আরেকটি জনপ্রিয় টেকনিক যা শব্দের জন্য এম্বেডিং তৈরি করার জন্য ব্যবহৃত হয়। এটি Stanford University দ্বারা তৈরি হয়েছে এবং Word2Vec এর তুলনায় কিছুটা ভিন্ন কৌশল ব্যবহার করে।

GloVe এর কাজের পদ্ধতি:

GloVe একটি matrix factorization টেকনিক ব্যবহার করে, যা একটি শব্দ-শব্দ সহমিলন ম্যাট্রিক্স (word co-occurrence matrix) তৈরি করে। এটি একটি globally aggregated কৌশল, যেখানে পুরো ডেটাসেটের মধ্যে শব্দের সহমিলন পরিসংখ্যান ব্যবহার করা হয়।

  1. Co-occurrence Matrix: GloVe প্রথমে একটি শব্দ-শব্দ সহমিলন ম্যাট্রিক্স তৈরি করে, যেখানে শব্দগুলির মধ্যে সহমিলনের পরিসংখ্যান রয়েছে (যেমন, দুটি শব্দ কতবার একসাথে একে অপরের পাশে আসে)।
  2. Factorization: এই ম্যাট্রিক্সের ফ্যাক্টরাইজেশন করা হয় যাতে প্রতিটি শব্দের একটি dense vector representation তৈরি করা যায়।
  3. Objective: GloVe এর লক্ষ্য হলো, শব্দের co-occurrence পরিসংখ্যানের ভিত্তিতে শব্দের এম্বেডিং তৈরি করা। অর্থাৎ, এটি একটি কনটেক্সটভিত্তিক প্রতিক্রিয়া তৈরি করে, যেমন Word2Vec।

GloVe এর সুবিধা:

  • Globally aggregated context: GloVe সাধারণত ভালোভাবে কাজ করে যখন আপনি পুরো ডেটাসেটের সম্পর্ক ধরে রাখতে চান। এটি একটি বৃহৎ ডেটাসেটে ভাল কাজ করে।
  • প্রথমিক বিশ্লেষণ: GloVe শব্দের গাণিতিক সম্পর্ক বিশ্লেষণ করার জন্য কার্যকর, যেমন শব্দের সম্পর্ক এবং ব্যাখ্যা।

৩. Word2Vec vs GloVe

বৈশিষ্ট্যWord2VecGloVe
কৌশললোকাল কনটেক্সট ভিত্তিক (Local Context Based)গ্লোবাল সহমিলন পরিসংখ্যান ভিত্তিক (Global Co-occurrence)
ডেটা প্রসেসিংদ্রুত প্রশিক্ষণ এবং কম্পিউটেশনাল খরচবৃহত্তর ডেটাসেটের জন্য উপযুক্ত
প্রকৃতিডিপ নিউরাল নেটওয়ার্কম্যাট্রিক্স ফ্যাক্টরাইজেশন
ব্যবহারশব্দের সমকক্ষ (analogy), কনটেক্সট ভিত্তিক কাজশব্দের সম্পর্ক, উচ্চ মাত্রিক তথ্য বিশ্লেষণ

সারাংশ

Word2Vec এবং GloVe দুটি শব্দ এম্বেডিং কৌশল যা ভাষাগত সম্পর্ক এবং শব্দের মধ্যে সেমান্টিক সম্পর্ক শিখতে সহায়ক। Word2Vec একটি লোকাল কনটেক্সট ভিত্তিক মডেল যা শব্দের সম্পর্ক শেখে, আর GloVe গ্লোবাল কনটেক্সট এবং সহমিলন ম্যাট্রিক্সের উপর ভিত্তি করে শব্দের এম্বেডিং তৈরি করে। এই দুটি কৌশল শব্দের বুদ্ধিমত্তা বা অর্থ বুঝতে সাহায্য করে এবং ভাষার মডেল তৈরি করার ক্ষেত্রে একটি শক্তিশালী টুল হিসেবে ব্যবহৃত হয়।

Content added By

Sentiment Analysis এবং Text Classification

132
132

Sentiment Analysis এবং Text Classification দুটি গুরুত্বপূর্ণ প্রাকৃতিক ভাষা প্রক্রিয়াকরণ (NLP) টাস্ক যা টেক্সট ডেটার সাথে কাজ করার সময় ব্যাপকভাবে ব্যবহৃত হয়। এগুলির মূল উদ্দেশ্য হল টেক্সট ডেটার মধ্যে গোপন তথ্য বিশ্লেষণ এবং শ্রেণীবদ্ধকরণ করা।


১. Sentiment Analysis (সেন্টিমেন্ট অ্যানালাইসিস)

Sentiment Analysis হল একটি Text Classification টাস্ক যেখানে টেক্সটের একটি অংশের সেন্টিমেন্ট বা আবেগ চিহ্নিত করা হয়। সাধারণত এটি ইতিবাচক, নেতিবাচক, এবং নিরপেক্ষ হিসেবে শ্রেণীবদ্ধ করা হয়। এটি ব্যবসা, সোশ্যাল মিডিয়া মনিটরিং, রিভিউ বিশ্লেষণ, এবং কাস্টমার সাপোর্ট ব্যবস্থাপনায় ব্যবহৃত হয়।

Sentiment Analysis এর উদ্দেশ্য:

  • একটি টেক্সটের মধ্যে যে আবেগ বা মনোভাব আছে, সেটা চিহ্নিত করা। উদাহরণস্বরূপ, একটি ফিল্ম রিভিউ যদি "এটি একটি দারুণ সিনেমা ছিল" হয়, তবে সেন্টিমেন্ট হবে ইতিবাচক (Positive)। আবার, "এই সিনেমাটি অনেক খারাপ ছিল" হলে সেন্টিমেন্ট হবে নেতিবাচক (Negative)

Sentiment Analysis এর প্রক্রিয়া:

  1. টেক্সট প্রিপ্রসেসিং:
    • Tokenization: শব্দ বা সাব-ওয়ার্ডে টেক্সটকে ভাগ করা।
    • Stop Words Removal: অনাবশ্যক শব্দগুলো (যেমন: "the", "is", "a") বাদ দেওয়া।
    • Stemming / Lemmatization: শব্দের মূল রূপে রূপান্তর করা।
  2. টেক্সট ভেক্টরাইজেশন:
    • Bag of Words (BoW), TF-IDF বা Word Embedding (যেমন Word2Vec, GloVe) ব্যবহার করে টেক্সটকে সংখ্যায় রূপান্তর করা।
  3. মডেল প্রশিক্ষণ:
    • বিভিন্ন মডেল যেমন Naive Bayes, SVM, LSTM, BERT, বা Transformer-based models ব্যবহার করা হয় সেন্টিমেন্ট অ্যানালাইসিসের জন্য।

Python এ Sentiment Analysis উদাহরণ:

এখানে PyTorch এবং HuggingFace Transformers ব্যবহার করে একটি বেসিক Sentiment Analysis মডেল তৈরির উদাহরণ দেওয়া হলো।

from transformers import pipeline

# HuggingFace থেকে Pretrained Sentiment Analysis Pipeline ব্যবহার
sentiment_analyzer = pipeline('sentiment-analysis')

# টেক্সট ইনপুট
text = "I love this movie! It's amazing."

# প্রেডিকশন
result = sentiment_analyzer(text)

print(result)  # [{'label': 'POSITIVE', 'score': 0.9998}]

এটি একটি BERT ভিত্তিক মডেল ব্যবহার করে সেন্টিমেন্ট বিশ্লেষণ করে এবং প্রেডিকশন হিসেবে POSITIVE বা NEGATIVE সেন্টিমেন্ট প্রদান করে।


২. Text Classification (টেক্সট ক্লাসিফিকেশন)

Text Classification হল একটি মেশিন লার্নিং টাস্ক যেখানে টেক্সট ডেটাকে বিভিন্ন ক্লাস বা ক্যাটেগরিতে শ্রেণীবদ্ধ করা হয়। এটি একটি সাধারণ NLP টাস্ক যা বিভিন্ন প্রকার ডেটাতে ব্যবহৃত হয়, যেমন স্প্যাম ডিটেকশন, টপিক মডেলিং, এমেইল ক্লাসিফিকেশন, নিউজ ক্লাসিফিকেশন ইত্যাদি।

Text Classification এর উদ্দেশ্য:

  • একাধিক ক্লাসে টেক্সট ডেটাকে শ্রেণীভুক্ত করা। উদাহরণস্বরূপ:
    • স্প্যাম বা নন-স্প্যাম (স্প্যাম ডিটেকশন)
    • রাজনীতি, খেলা, বিজ্ঞান (নিউজ ক্লাসিফিকেশন)

Text Classification এর প্রক্রিয়া:

  1. টেক্সট প্রিপ্রসেসিং:
    • টেক্সটকে টোকেনাইজেশন, স্টপওয়ার্ড রিমুভাল, এবং স্টেমিং/লেম্যাটাইজেশন এর মাধ্যমে প্রিপ্রসেস করা হয়।
  2. ভেক্টরাইজেশন:
    • টেক্সটকে Bag of Words (BoW), TF-IDF, বা Word Embeddings এর মাধ্যমে সংখ্যায় রূপান্তর করা হয়।
  3. মডেল প্রশিক্ষণ:
    • Naive Bayes, Logistic Regression, SVM, LSTM, বা Transformer-based models (যেমন BERT, RoBERTa) ব্যবহার করা হয়।

Text Classification এর উদাহরণ:

import torch
from torch import nn
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import accuracy_score

# উদাহরণ ডেটাসেট
texts = ["I love programming", "This movie is awesome", "I hate waiting", "Worst experience ever", "Best game ever"]
labels = [1, 1, 0, 0, 1]  # 1 = Positive, 0 = Negative

# TF-IDF ভেক্টরাইজেশন
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(texts)
y = labels

# ডেটা ট্রেন এবং টেস্টে ভাগ করা
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Logistic Regression মডেল
from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X_train, y_train)

# প্রেডিকশন এবং একিউরেসি
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

print(f"Accuracy: {accuracy * 100}%")

এখানে TF-IDF ব্যবহার করে টেক্সট ভেক্টরাইজ করা হয়েছে এবং Logistic Regression মডেল দিয়ে ক্লাসিফিকেশন করা হয়েছে।


Sentiment Analysis এবং Text Classification এর মধ্যে পার্থক্য

পার্থক্যSentiment AnalysisText Classification
লক্ষ্যটেক্সটের আবেগ বা সেন্টিমেন্ট চিহ্নিত করা (ইতিবাচক, নেতিবাচক)টেক্সটকে নির্দিষ্ট শ্রেণিতে বিভক্ত করা (যেমন, স্প্যাম বা নন-স্প্যাম)
ক্লাসসাধারণত দুটি (ইতিবাচক/নেতিবাচক)একাধিক শ্রেণী হতে পারে (স্প্যাম, স্প্যাম নয়)
ব্যবহারসোশ্যাল মিডিয়া মনিটরিং, রিভিউ বিশ্লেষণ, কাস্টমার ফিডব্যাকস্প্যাম ডিটেকশন, টপিক মডেলিং, নিউজ শ্রেণীবিভাগ

উপসংহার

  • Sentiment Analysis এবং Text Classification উভয়ই NLP এর গুরুত্বপূর্ণ টাস্ক, কিন্তু তাদের উদ্দেশ্য এবং প্রয়োগ আলাদা।
  • Sentiment Analysis সাধারণত দুইটি শ্রেণীতে (ইতিবাচক/নেতিবাচক) টেক্সট শ্রেণীবদ্ধ করে, যখন Text Classification অধিক সংখ্যক শ্রেণী ব্যবহার করে।
  • PyTorch, HuggingFace, এবং অন্যান্য জনপ্রিয় লাইব্রেরি ব্যবহার করে সহজেই এই টাস্কগুলো সম্পন্ন করা যায়।
Content added By

PyTorch দিয়ে NLP প্রজেক্ট তৈরি

82
82

Natural Language Processing (NLP) হলো মেশিন লার্নিং এবং ডিপ লার্নিংয়ের একটি গুরুত্বপূর্ণ শাখা, যা ভাষাগত তথ্যের সাথে কাজ করে, যেমন টেক্সট বা স্পিচ ডেটা। PyTorch-এ NLP প্রজেক্ট তৈরি করার জন্য সাধারণত প্রাকৃতিক ভাষা প্রক্রিয়াকরণ (NLP) টাস্ক যেমন টেক্সট ক্লাসিফিকেশন, স্প্যাম ফিল্টারিং, টেক্সট জেনারেশন, এম্বেডিং, টেক্সট ট্রান্সলেশন ইত্যাদি করা হয়।

এখানে আমরা একটি সাধারণ টেক্সট ক্লাসিফিকেশন প্রজেক্ট তৈরি করব, যেখানে একটি মডেল বিনামূল্যে টেক্সট ডেটা ব্যবহার করে দুইটি শ্রেণীতে (positive/negative) শ্রেণীবদ্ধ করবে। আমরা LSTM (Long Short-Term Memory) ব্যবহার করব যা NLP টাস্কে জনপ্রিয় মডেল।


ধাপ ১: PyTorch এবং প্রয়োজনীয় লাইব্রেরি ইনস্টলেশন

প্রথমে, PyTorch এবং প্রয়োজনীয় লাইব্রেরি ইনস্টল করতে হবে:

pip install torch torchvision torchaudio
pip install torchtext

ধাপ ২: ডেটা লোডিং এবং প্রিপ্রসেসিং

এখানে আমরা torchtext লাইব্রেরি ব্যবহার করে একটি সাধারণ টেক্সট ডেটাসেট (যেমন IMDB বা AG News) লোড করব এবং কিছু প্রিপ্রসেসিং করব।

১. ডেটা লোডিং:

import torch
from torchtext.datasets import IMDB
from torchtext.data import Field, BucketIterator

# Define Fields (data preprocessing steps)
TEXT = Field(sequential=True, tokenize='spacy', batch_first=True, include_lengths=True)
LABEL = Field(sequential=False, use_vocab=True, pad_token=None, unk_token=None)

# Load IMDB dataset
train_data, test_data = IMDB.splits(TEXT, LABEL)

২. প্রিপ্রসেসিং:

  • Tokenization: আমরা spaCy tokenizer ব্যবহার করব।
  • Vocabulary Creation: ডেটাসেট থেকে ভোক্যাবুলারি তৈরি করা হবে।
  • Vectorization: শব্দগুলিকে ইনডেক্সে রূপান্তর করা হবে।
# Build vocabulary
TEXT.build_vocab(train_data, max_size=10000, vectors="glove.6B.100d", unk_init=torch.Tensor.normal_)
LABEL.build_vocab(train_data)

# Create iterators for batching
BATCH_SIZE = 64
train_iterator, test_iterator = BucketIterator.splits((train_data, test_data), batch_size=BATCH_SIZE, device=torch.device('cuda' if torch.cuda.is_available() else 'cpu'))

ধাপ ৩: মডেল তৈরি

এখন, আমরা একটি LSTM ভিত্তিক মডেল তৈরি করব, যা টেক্সট ক্লাসিফিকেশন করবে। আমরা Embedding Layer, LSTM Layer, এবং Fully Connected Layer ব্যবহার করব।

import torch.nn as nn

class LSTMModel(nn.Module):
    def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, n_layers, dropout):
        super(LSTMModel, self).__init__()
        self.embedding = nn.Embedding(input_dim, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers=n_layers, dropout=dropout, batch_first=True)
        self.fc = nn.Linear(hidden_dim, output_dim)
        self.dropout = nn.Dropout(dropout)
        
    def forward(self, text, text_lengths):
        embedded = self.embedding(text)
        packed_embedded = nn.utils.rnn.pack_padded_sequence(embedded, text_lengths.cpu(), batch_first=True, enforce_sorted=False)
        packed_output, (hidden, cell) = self.lstm(packed_embedded)
        output = self.dropout(hidden[-1])
        return self.fc(output)

# Hyperparameters
input_dim = len(TEXT.vocab)
embedding_dim = 100
hidden_dim = 256
output_dim = 1
n_layers = 2
dropout = 0.5

# Create model
model = LSTMModel(input_dim, embedding_dim, hidden_dim, output_dim, n_layers, dropout)

ধাপ ৪: মডেল ট্রেনিং

এখন, আমরা মডেলটি ট্রেন করব। আমরা binary cross-entropy loss এবং Adam optimizer ব্যবহার করব।

import torch.optim as optim
import torch.nn.functional as F

# Loss function and optimizer
optimizer = optim.Adam(model.parameters())
criterion = nn.BCEWithLogitsLoss()

# Move model to GPU if available
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
criterion.to(device)

# Training loop
def train(model, iterator, optimizer, criterion):
    model.train()
    epoch_loss = 0
    epoch_acc = 0
    
    for batch in iterator:
        text, text_lengths = batch.text
        labels = batch.label
        
        optimizer.zero_grad()
        
        # Forward pass
        predictions = model(text, text_lengths).squeeze(1)
        
        # Calculate loss and accuracy
        loss = criterion(predictions, labels.float())
        acc = binary_accuracy(predictions, labels)
        
        # Backward pass
        loss.backward()
        optimizer.step()
        
        epoch_loss += loss.item()
        epoch_acc += acc.item()
    
    return epoch_loss / len(iterator), epoch_acc / len(iterator)

def binary_accuracy(preds, y):
    rounded_preds = torch.round(torch.sigmoid(preds))
    correct = (rounded_preds == y).float()
    acc = correct.sum() / len(correct)
    return acc

# Train the model for some epochs
num_epochs = 5
for epoch in range(num_epochs):
    train_loss, train_acc = train(model, train_iterator, optimizer, criterion)
    print(f'Epoch: {epoch+1}, Train Loss: {train_loss:.3f}, Train Accuracy: {train_acc:.3f}')

ধাপ ৫: মডেল ভ্যালিডেশন

ভ্যালিডেশন ডেটা ব্যবহার করে মডেলটি পরীক্ষা করা।

def evaluate(model, iterator, criterion):
    model.eval()
    epoch_loss = 0
    epoch_acc = 0
    
    with torch.no_grad():
        for batch in iterator:
            text, text_lengths = batch.text
            labels = batch.label
            
            predictions = model(text, text_lengths).squeeze(1)
            
            loss = criterion(predictions, labels.float())
            acc = binary_accuracy(predictions, labels)
            
            epoch_loss += loss.item()
            epoch_acc += acc.item()
    
    return epoch_loss / len(iterator), epoch_acc / len(iterator)

# Evaluate the model
val_loss, val_acc = evaluate(model, test_iterator, criterion)
print(f'Validation Loss: {val_loss:.3f}, Validation Accuracy: {val_acc:.3f}')

ধাপ ৬: মডেল সংরক্ষণ এবং লোড করা

মডেলটি প্রোডাকশনে ব্যবহারের জন্য সংরক্ষণ (save) এবং পরে লোড (load) করা যাবে।

মডেল সংরক্ষণ:

torch.save(model.state_dict(), 'text_classification_model.pth')

মডেল লোড করা:

model = LSTMModel(input_dim, embedding_dim, hidden_dim, output_dim, n_layers, dropout)
model.load_state_dict(torch.load('text_classification_model.pth'))
model.eval()

সারাংশ

এই প্রজেক্টে, আমরা একটি LSTM মডেল তৈরি করেছি এবং IMDB ডেটাসেট ব্যবহার করে টেক্সট ক্লাসিফিকেশন করার জন্য PyTorch এর মাধ্যমে একটি NLP প্রজেক্ট তৈরি করেছি। মডেলটি ট্রেন করার জন্য আমরা Embedding Layer, LSTM Layer, এবং Fully Connected Layer ব্যবহার করেছি। এরপর আমরা মডেলটি Flask বা FastAPI এ ডেপ্লয় করতে পারি এবং প্রোডাকশনে ব্যবহার করতে পারি।

এই প্রক্রিয়া দ্বারা, আপনি অন্য ধরনের NLP টাস্ক, যেমন স্প্যাম ফিল্টারিং, টেক্সট জেনারেশন, ভাষা অনুবাদ, এবং অন্য ক্লাসিফিকেশন টাস্কে PyTorch ব্যবহার করতে পারবেন।

Content added By
Promotion