Welcome to the transformative world of Natural Language Processing (NLP). Here, the elegance of human language meets the precision of machine intelligence. The unseen force of NLP powers many of the digital interactions we rely on. Various applications use this Natural Language Processing guide, such as chatbots responding to your questions, search engines tailoring results based on semantics, and voice assistants setting reminders for you.
In this comprehensive guide, we will dive into multiple fields of NLP while highlighting its cutting-edge applications that are revolutionizing business and improving user experiences.
In the era of deep learning, it is challenging to analyze emotions because of the layers and complex. Learn how deep learning models, especially those based on the Transformer architecture, are adept at interpreting these challenging layers to provide a more detailed sentiment analysis.
We will use the Kaggle dataset ‘Airline_Reviews‘ for our useful insights. This dataset is filled with real-world text data.
This article was published as a part of the Data Science Blogathon.
Natural Language Processing (NLP) is a branch of artificial intelligence that focuses on teaching machines to understand, interpret, and respond to human language. This technology connects humans and computers, allowing for more natural interactions.
NLP is used in a wide range of applications, from simple tasks such as spell check and keyword search to more complex operations such as machine translation, sentiment analysis, and chatbot functionality. It is the technology that allows voice-activated virtual assistants, real-time translation services, and even content recommendation algorithms to function. As a multidisciplinary field, natural language processing (NLP) combines insights from linguistics, computer science, and machine learning to create algorithms that can understand textual data, making it a cornerstone of today’s AI applications.
NLP has evolved significantly over the years, advancing from rule-based systems to statistical models and, most recently, to deep learning. The journey towards capturing the particulars of language can be seen in the change from conventional Bag-of-Words (BoW) models to Word2Vec and then to contextual embeddings. As computational power and data availability increased, NLP started using sophisticated neural networks to comprehend linguistic subtlety. Modern transfer learning advances allow models to improve on particular tasks, ensuring efficiency and accuracy in real-world applications.
Transformers are a type of neural network architecture and became the foundation of many cutting-edge NLP models. Transformers, compared to their predecessors, which relied heavily on recurrent or convolutional layers, use a mechanism known as “attention” to draw global dependencies between input and output.
A Transformer’s architecture is made up of an encoder and a decoder, each of which has multiple identical layers. The encoder takes the input sequence and compresses it into a “context” or “memory” that the decoder uses to generate the output. Transformers are distinguished by their “self-attention” mechanism, which weighs various parts of the input when producing the output, allowing the model to focus on what’s important.
They are used in NLP tasks because they excel at a variety of data transformation tasks, including but not limited to machine translation, text summarization, and sentiment analysis.
Named Entity Recognition (NER) is an important part of NLP that involves identifying and categorizing named entities in text into predefined categories. Traditional NER systems relied heavily on rule-based and feature-based approaches. However, with the advent of deep learning and, in particular, Transformer architectures like BERT (Bidirectional Encoder Representations from Transformers), a NER’s performance has increased substantially.
Google’s BERT is pre-trained on a large amount of text and can generate contextual embeddings for words. This means that BERT can understand the context in which the word shows up, making it highly helpful for tasks like NER where context is critical.
import spacy
import torch
from transformers import BertTokenizer, BertModel
import pandas as pd
# Loading the airline reviews dataset into a DataFrame
df = pd.read_csv('/kaggle/input/airline-reviews/Airline_Reviews.csv')
# Initializing BERT tokenizer and model
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")
# Initializing spaCy model for NER
nlp = spacy.load("en_core_web_sm")
# Defining a function to get named entities from a text using spaCy
def get_entities(text):
doc = nlp(text)
return [(ent.text, ent.label_) for ent in doc.ents]
# Extracting and printing named entities from the first 4 reviews in the DataFrame
for i, review in df.head(4).iterrows():
entities = get_entities(review['Review'])
print(f"Review #{i + 1}:")
for entity in entities:
print(f"Entity: {entity[0]}, Label: {entity[1]}")
print("\n")
'''This code loads a dataset of airline reviews, initializes the BERT and spaCy models,
and then extracts and prints the named entities from the first four reviews.
'''
In traditional embeddings like Word2Vec or GloVe, a word always has the same vector depiction regardless of its context. The multiple meanings of words are not accurately represented. Contextual embeddings have become a popular way to circumvent this limitation.
In contrast to Word2Vec, contextual embeddings capture the meaning of words based on their context, allowing for flexible word representations. For example, the word “bank” looks a different way in the sentences “I sat by the river bank” and “I went to the bank.” The constantly changing illustration produces more accurate theories, especially for tasks requiring subtle understanding. Models’ ability to understand common phrases, synonyms, and other linguistic constructs that were formerly hard for machines to understand is improving.
The Transformer architecture fundamentally changed the NLP landscape, enabling the development of models like BERT, GPT-2, and T5. These models use attentional mechanisms to assess the relative weights of different words in a sequence, resulting in a highly contextual and nuanced understanding of the text.
T5 (Text-to-Text Transfer Transformer) generalizes the idea by treating every NLP problem as a text-to-text problem, whereas BERT is an effective summarization model. Translation, for example, entails converting English text to French text, while summarization involves reducing a long text. As a result, T5 is easily adaptable. Train T5 with a variety of tasks due to its unifying system, possibly using information from a single assignment to train on another.
import pandas as pd
from transformers import T5Tokenizer, T5ForConditionalGeneration
# Loading the airline reviews dataset into a DataFrame
df = pd.read_csv('/kaggle/input/airline-reviews/Airline_Reviews.csv')
# Initializing T5 tokenizer and model (using 't5-small' for demonstration)
model_name = "t5-small"
model = T5ForConditionalGeneration.from_pretrained(model_name)
tokenizer = T5Tokenizer.from_pretrained(model_name)
# Defining a function to summarize text using the T5 model
def summarize_with_t5(text):
input_text = "summarize: " + text
# Tokenizing the input text and generate a summary
input_tokenized = tokenizer.encode(input_text, return_tensors="pt",
max_length=512, truncation=True)
summary_ids = model.generate(input_tokenized, max_length=100, min_length=5,
length_penalty=2.0, num_beams=4, early_stopping=True)
return tokenizer.decode(summary_ids[0], skip_special_tokens=True)
# Summarizing and printing the first 5 reviews in the DataFrame for demonstration
for i, row in df.head(5).iterrows():
summary = summarize_with_t5(row['Review'])
print(f"Summary {i+1}:\n{summary}\n")
#print("Summary ",i+1,": ", summary)
print("-" * 50)
''' This code loads a dataset of airline reviews, initializes the T5 model and tokenizer,
and then generates and prints summaries for the first five reviews.
'''
Following the successful completion of the code, it is clear that the generated summaries are concise yet successfully convey the main points of the original reviews. This shows the ability of the T5 model to understand and evaluate data. Because of its effectiveness and capacity for text summarization, this model is one of the most sought-after in the NLP field.
Going beyond the simple categorization of sentiments into positive, negative, or neutral categories, we can go deeper to extract more specific sentiments and even determine the intensity of these sentiments. Combining BERT’s power with additional deep learning layers can create a sentiment analysis model that provides more in-depth insights.
Now, we will look into how sentiments vary across the dataset to identify patterns and trends in the reviews feature of the dataset.
Now, lets look at the NLP implementation using BERT.
Preparing the data is crucial before beginning the modeling process. This involves loading the dataset, dealing with missing values, and converting the unprocessed data into a sentiment analysis-friendly format. In this instance, we will translate the Overall_Rating column from the airline reviews dataset into sentiment categories. We will use these categories as our target labels when we train the sentiment analysis model.
import pandas as pd
# Loading the dataset
df = pd.read_csv('/kaggle/input/airline-reviews/Airline_Reviews.csv')
# Converting 'n' values to NaN and then convert the column to numeric data type
df['Overall_Rating'] = pd.to_numeric(df['Overall_Rating'], errors='coerce')
# Dropping rows with NaN values in the Overall_Rating column
df.dropna(subset=['Overall_Rating'], inplace=True)
# Converting ratings into multi-class categories
def rating_to_category(rating):
if rating <= 2:
return "Very Negative"
elif rating <= 4:
return "Negative"
elif rating == 5:
return "Neutral"
elif rating <= 7:
return "Positive"
else:
return "Very Positive"
# Applying the function to create a 'Sentiment' column
df['Sentiment'] = df['Overall_Rating'].apply(rating_to_category)
Tokenization is the process of transforming text into tokens. The model then uses these tokens as input. We will use the DistilBERT tokenizer, enhance for accuracy and performance. Our reviews will be transformed into a format that the DistilBERT model can understand with the aid of this tokenizer.
from transformers import DistilBertTokenizer
# Initializing the DistilBert tokenizer with the 'distilbert-base-uncased' pre-trained model
tokenizer = DistilBertTokenizer.from_pretrained('distilbert-base-uncased')
We must implement PyTorch’s Dataset and DataLoader classes to train and assess our model effectively. The DataLoader will allow us to batch our data, speeding up the training process, and the Dataset class will assist in organizing our data and labels.
from torch.utils.data import Dataset, DataLoader
from sklearn.model_selection import train_test_split
# Defining a custom Dataset class for sentiment analysis
class SentimentDataset(Dataset):
def __init__(self, reviews, labels):
self.reviews = reviews
self.labels = labels
self.label_dict = {"Very Negative": 0, "Negative": 1, "Neutral": 2,
"Positive": 3, "Very Positive": 4}
# Returning the total number of samples
def __len__(self):
return len(self.reviews)
# Fetching the sample and label at the given index
def __getitem__(self, idx):
review = self.reviews[idx]
label = self.label_dict[self.labels[idx]]
tokens = tokenizer.encode_plus(review, add_special_tokens=True,
max_length=128, pad_to_max_length=True, return_tensors='pt')
return tokens['input_ids'].view(-1), tokens['attention_mask'].view(-1),
torch.tensor(label)
# Splitting the dataset into training and testing sets
train_df, test_df = train_test_split(df, test_size=0.2, random_state=42)
# Creating DataLoader for the training set
train_dataset = SentimentDataset(train_df['Review'].values, train_df['Sentiment'].values)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
# Creating DataLoader for the test set
test_dataset = SentimentDataset(test_df['Review'].values, test_df['Sentiment'].values)
test_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)
'''This code defines a custom PyTorch Dataset class for sentiment analysis and then creates
DataLoaders for both training and testing datasets.
'''
We can now initialize the DistilBERT model for sequence classification with our prepared data. On the basis of our dataset, we will train this model and modify its weights in order to predict the tone of airline reviews.
from transformers import DistilBertForSequenceClassification, AdamW
from torch.nn import CrossEntropyLoss
# Initializing DistilBERT model for sequence classification with 5 labels
model = DistilBertForSequenceClassification.from_pretrained('distilbert-base-uncased',
num_labels=5)
# Initializing the AdamW optimizer for training
optimizer = AdamW(model.parameters(), lr=1e-5)
# Defining the Cross-Entropy loss function
loss_fn = CrossEntropyLoss()
# Training loop for 3 epochs
for epoch in range(3):
for batch in train_loader:
# Unpacking the input and label tensors from the DataLoader batch
input_ids, attention_mask, labels = batch
# Zero the gradients
optimizer.zero_grad()
# Forward pass: Get the model's predictions
outputs = model(input_ids, attention_mask=attention_mask)
# Computing the loss between the predictions and the ground truth
loss = loss_fn(outputs[0], labels)
# Backward pass: Computing the gradients
loss.backward()
# Updating the model's parameters
optimizer.step()
'''This code initializes a DistilBERT model for sequence classification, sets
up the AdamW optimizer and CrossEntropyLoss, and then train the model for 3 epochs.
'''
We must assess our model’s performance on untested data after training. This will help us determine how well our model will work in practical situations.
correct_predictions = 0
total_predictions = 0
# Set the model to evaluation mode
model.eval()
# Disabling gradient calculations as we are only doing inference
with torch.no_grad():
# Looping through batches in the test DataLoader
for batch in test_loader:
# Unpacking the input and label tensors from the DataLoader batch
input_ids, attention_mask, labels = batch
# Getting the model's predictions
outputs = model(input_ids, attention_mask=attention_mask)
# Getting the predicted labels
_, preds = torch.max(outputs[0], dim=1)
# Counting the number of correct predictions
correct_predictions += (preds == labels).sum().item()
# Counting the total number of predictions
total_predictions += labels.size(0)
# Calculating the accuracy
accuracy = correct_predictions / total_predictions
# Printing the accuracy
print(f"Accuracy: {accuracy * 100:.2f}%")
''' This code snippet evaluates the trained model on the test dataset and prints
the overall accuracy.
'''
We can save the model once we are happy with its performance. This makes it possible to use the model across various platforms or applications.
# Saving the trained model to disk
model.save_pretrained("/kaggle/working/")
# Saving the tokenizer to disk
tokenizer.save_pretrained("/kaggle/working/")
''' This code snippet saves the trained model and tokenizer to the specified
directory for future use.
'''
Let’s use the sentiment of a sample review to train our trained model to predict it. This exemplifies how real-time sentiment analysis can be performed using the model.
# Function to predict the sentiment of a given review
def predict_sentiment(review):
# Tokenizing the input review
tokens = tokenizer.encode_plus(review, add_special_tokens=True, max_length=128,
pad_to_max_length=True, return_tensors='pt')
# Running the model to get predictions
with torch.no_grad():
outputs = model(tokens['input_ids'], attention_mask=tokens['attention_mask'])
# Getting the label with the maximum predicted value
_, predicted_label = torch.max(outputs[0], dim=1)
# Defining a dictionary to map numerical labels to string labels
label_dict = {0: "Very Negative", 1: "Negative", 2: "Neutral", 3: "Positive",
4: "Very Positive"}
# Returning the predicted label
return label_dict[predicted_label.item()]
# Sample review
review_sample = "The flight was amazing and the staff was very friendly."
# Predicting the sentiment of the sample review
sentiment_sample = predict_sentiment(review_sample)
# Printing the predicted sentiment
print(f"Predicted Sentiment: {sentiment_sample}")
''' This code snippet defines a function to predict the sentiment of a given
review and demonstrate its usage on a sample review.
'''
Natural language processing (NLP) has undergone a revolution thanks to transfer learning, which enables models to use prior knowledge from one task and apply it to new, related tasks. Researchers and developers can now fine-tune pre-trained models on particular tasks, such as sentiment analysis or named entity recognition, instead of training models from scratch, which frequently requires enormous amounts of data and computational resources.
Frequently trained on vast corpora like the entirety of Wikipedia, these pre-trained models capture complex linguistic patterns and relationships. Transfer learning enables NLP applications to operate more quickly, with less data needed, and frequently with state-of-the-art performance, democratizing access to superior language models for a wider range of users and tasks.
The fusion of conventional linguistic methods and contemporary DL techniques has ushered in a period of unparalleled advancements in the quickly developing field of NLP. We constantly push the limits of what machines can understand and process in human language. From utilizing embeddings to grasp context subtleties to harnessing the power of Transformer architectures like BERT and T5.
Particularly transfer learning has made it more accessible to use high-performing models, lowering entry barriers and encouraging innovation. As the subjects raised, it becomes clear that the ongoing interaction between human linguistic ability and machine computational power holds promise for a time when machines will not only comprehend but also be able to relate to the subtleties of human language.
A. Contextual embeddings dynamically represent words according to the context of the sentences that they use.
A. The Transformer architecture uses attention mechanisms to manage sequence data effectively, resulting in cutting-edge performance on various NLP tasks.
A. Reduced training time and data requirements are achieved by transfer learning, which enables NLP models to use knowledge from one task and apply it to new tasks.
A. Advanced sentiment analysis goes further and uses deep learning insights to extract more precise sentiments and their intensities.
The media shown in this article is not owned by Analytics Vidhya and is used at the Author’s discretion.