Skip to content

Natural Language Processing (NLP) β€” Complete Guide

DodaTech Updated 2026-06-20 8 min read

In this tutorial, you'll learn about Natural Language Processing (NLP). We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.

Natural Language Processing (NLP) is a branch of artificial intelligence that enables computers to understand, interpret, and generate human language β€” powering everything from chatbots to translation to sentiment analysis.

What You'll Learn

You'll learn how NLP works β€” from tokenization and embeddings to transformers and large language models β€” and build a real sentiment analysis classifier using Python and Hugging Face.

Why It Matters

NLP powers the tools we use every day: Google Search understands your query, Gmail's Smart Compose finishes your sentences, ChatGPT answers questions, and security tools analyze phishing emails. NLP is arguably the most impactful branch of AI in daily life.

Real-World Use

When you type a Google search and it corrects your spelling, suggests completions, and understands that "apple" might mean the fruit or the company based on other words in your query β€” that's NLP at every level.

How NLP Works

flowchart LR
  A[Raw Text] --> B[Tokenization]
  B --> C[Embeddings]
  C --> D[Sequence Model]
  D --> E[Output]
  B --> F[Cleaning / Normalization]
  F --> C
  style A fill:#e0f0ff
  style E fill:#e0ffe0

Step 1: Tokenization

First, we split text into smaller pieces called tokens. Tokens can be words, subwords, or characters.

# Tokenization with NLTK
import nltk
nltk.download("punkt_tab", quiet=True)
from nltk.tokenize import word_tokenize, sent_tokenize

text = "Natural language processing is amazing! It helps computers understand us."

# Sentence tokenization
sentences = sent_tokenize(text)
print("Sentences:", sentences)

# Word tokenization
words = word_tokenize(text)
print("Words:", words)
print("Number of tokens:", len(words))

Expected output:

Sentences: ['Natural language processing is amazing!', 'It helps computers understand us.']
Words: ['Natural', 'language', 'processing', 'is', 'amazing', '!', 'It', 'helps', 'computers', 'understand', 'us', '.']
Number of tokens: 12

Tokenization converts unstructured text into discrete units the model can Process. Each token becomes an input to the neural network.

Step 2: Text Normalization

Before feeding text to a model, we clean it:

import re

def clean_text(text):
    # Lowercase
    text = text.lower()
    # Remove URLs
    text = re.sub(r"http\S+|www\S+|https\S+", "", text)
    # Remove special characters but keep punctuation
    text = re.sub(r"[^a-zA-Z0-9\s.,!?]", "", text)
    # Remove extra whitespace
    text = re.sub(r"\s+", " ", text).strip()
    return text

raw = "Check out DodaTech's NEW blog!! πŸš€ https://dodatech.com"
cleaned = clean_text(raw)
print(f"Raw:     {raw}")
print(f"Cleaned: {cleaned}")

Expected output:

Raw:     Check out DodaTech's NEW blog!! πŸš€ https://dodatech.com
Cleaned: check out dodatechs new blog

Why normalize? The model doesn't care about capitalization. URLs and emojis add noise. Normalization reduces vocabulary size and improves generalization.

Step 3: Word Embeddings

Computers can't understand "king" or "queen" as words. They need numbers. Word embeddings map each word to a dense vector where semantic relationships are preserved.

# Simplified word vectors (not actual pretrained values)
king     = [0.45, 0.12, -0.33, 0.89, ...]
queen    = [0.42, 0.15, -0.30, 0.85, ...]
man      = [0.30, 0.02, -0.41, 0.55, ...]
woman    = [0.28, 0.05, -0.38, 0.51, ...]

# Semantic relationship: king - man + woman β‰ˆ queen

Step 4: Sequence Models

Early NLP used RNNs and LSTMs to Process sequences. Modern NLP uses Transformers β€” the architecture behind BERT, GPT, and all modern LLMs.

flowchart TD
  subgraph Transformer Architecture
    A[Input Text] --> B[Token Embeddings]
    B --> C[Positional Encoding]
    C --> D[Multi-Head Self-Attention]
    D --> E[Feed Forward Network]
    E --> F[Output]
  end
  D -- "Parallel attention to all tokens" --> D

Building a Sentiment Analyzer

Let's build a real sentiment analysis classifier using Hugging Face's transformers library.

# Sentiment analysis with a pretrained BERT model
from transformers import pipeline

# Load the sentiment analysis pipeline (downloads model on first run)
classifier = pipeline(
    "sentiment-analysis",
    model="distilbert-base-uncased-finetuned-sst-2-english"
)

# Analyze multiple texts
texts = [
    "I absolutely love this product! It's amazing.",
    "This is the worst experience I've ever had.",
    "The movie was okay, nothing special.",
    "Durga Antivirus Pro caught a zero-day threat today.",
]

results = classifier(texts)
for text, result in zip(texts, results):
    label = result["label"]
    score = result["score"]
    emoji = "😊" if label == "POSITIVE" else "😞"
    print(f"{emoji} {label} ({score:.1%}): {text}")

Expected output:

😊 POSITIVE (99.9%): I absolutely love this product! It's amazing.
😞 NEGATIVE (99.8%): This is the worst experience I've ever had.
😞 NEGATIVE (56.2%): The movie was okay, nothing special.
😊 POSITIVE (98.5%): Durga Antivirus Pro caught a zero-day threat today.

The BERT model correctly identifies sentiment with high confidence. Note how "okay, nothing special" gets lower confidence β€” it's genuinely ambiguous.

Practical NLP for Security: Phishing Detection

This is where NLP shines for security. Phishing emails use specific linguistic patterns β€” urgency, fear, requests for credentials.

# Simple phishing keyword detection
import re

def analyze_email(text):
    phishing_indicators = [
        "urgent", "verify your account", "click here", "suspicious activity",
        "login now", "reset password", "bank details", "credit card",
        "you have won", "free gift", "act now", "limited time]
    ]

    text_lower = text.lower()
    found_indicators = []

    for indicator in phishing_indicators:
        if indicator in text_lower:
            found_indicators.append(indicator)

    # URL analysis
    urls = re.findall(r"https?://[^\s]+", text)
    suspicious_urls = [u for u in urls if not u.startswith("https://dodatech")]

    return {
        "phishing_indicators_found": found_indicators,
        "indicator_count": len(found_indicators),
        "urls_found": urls,
        "suspicious_urls": suspicious_urls,
        "risk_score": min(len(found_indicators) * 20 + len(suspicious_urls) * 30, 100),
    }

# Test on a suspected phishing email
email = """
Subject: URGENT: Your Account Has Been Compromised

Dear valued customer,

We detected suspicious activity on your account. Please verify your login
details immediately by clicking here: http://fake-bank-verify.com

This is a limited time offer to secure your account.
Act now to prevent account suspension.

Sincerely,
Security Team
"""

result = analyze_email(email)
print(f"Risk Score: {result['risk_score']}/100")
print(f"Phishing Indicators: {result['indicator_count']}")
print(f"Indicators found: {result['phishing_indicators_found']}")
print(f"Suspicious URLs: {result['suspicious_urls']}")

Expected output:

Risk Score: 90/100
Phishing Indicators: 4
Indicators found: ['urgent', 'verify your account', 'click here', 'suspicious activity']
Suspicious URLs: ['http://fake-bank-verify.com']

Real-world connection: Tools like Durga Antivirus Pro integrate NLP-based phishing detection alongside behavioral analysis, examining both email content and sender patterns to stop phishing attacks before they reach your inbox.

Common Errors Beginners Make

1. Forgetting to Handle Case

"Apple" and "apple" should usually be treated the same. Lowercase your text β€” but be careful: "US" (United States) shouldn't become "us" (pronoun).

2. Using Bag of Words for Everything

Bag of words loses word order. "Not good" and "good not" become identical. Use n-grams or embeddings for tasks where word order matters.

3. Ignoring Stop Words (or Removing Them Too Aggressively)

Stop word removal depends on your task. For sentiment analysis, removing "not" destroys meaning. For topic modeling, removing common words helps focus on content.

4. Not Handling Out-of-Vocabulary Words

Real-world text contains typos, slang, and new words. Use subword tokenization (like BPE or WordPiece) instead of full-word vocabularies to handle unseen words.

5. Overlooking Text Encoding

UTF-8 encoding issues cause invisible errors. Always specify encoding="utf-8" when reading text files. Non-ASCII characters (Γ©, Γ±, ΓΌ) cause silent failures in older tokenizers.

6. Expecting Perfect Accuracy on Ambiguous Text

"Sarcasm" and "irony" are hard even for humans to detect. "Yeah, great job" can be positive or scathing depending on context. Set realistic expectations for NLP systems.

7. Using Outdated Model Architectures

In 2024+, there's rarely a reason to train an LSTM from scratch. Use pretrained transformer models from Hugging Face β€” they're more accurate and require less data.

Practice Questions

  1. What is tokenization in NLP? Tokenization splits text into smaller units (tokens) β€” words, subwords, or characters β€” that the model can Process.

  2. Why are word embeddings better than one-hot encoding? Embeddings capture semantic relationships between words. One-hot vectors treat all words as equally dissimilar.

  3. What makes the Transformer architecture different from RNNs? Transformers Process all tokens in parallel using self-attention, while RNNs Process sequentially. Parallel processing enables much faster training and better handling of long-range dependencies.

  4. What is a pretrained language model? A model trained on a large text corpus that can be fine-tuned for specific tasks with less data and compute than training from scratch.

  5. How is NLP used in cybersecurity? Phishing detection, threat intelligence analysis, malware communication analysis, and automated incident report classification.

Challenge

Build a simple text classifier that categorizes short messages into "spam" or "ham" using TF-IDF features and a logistic regression classifier. Use the SMS Spam Collection dataset from UCI. Aim for 97%+ accuracy.

Real-World Task

Collect 10 emails from your own spam folder and 10 from your inbox. Run them through the Hugging Face sentiment analysis pipeline. Do spam emails tend to be more positive (offering money/gifts) or more negative (creating urgency/fear)? Document your findings.

FAQ

What is the difference between NLP and NLU?

NLP (Natural Language Processing) is the broader field of processing language with computers. NLU (Natural Language Understanding) is a subset focused on comprehension β€” understanding intent, meaning, and context. All NLU is NLP, but not all NLP requires understanding (e.g. text-to-speech).

Do I need a GPU for NLP?

For using pretrained models (inference), a CPU is fine. For training or fine-tuning large models, a GPU dramatically speeds things up. Google Colab offers free GPUs for experimentation.

How does NLP help with email security?

NLP models analyze email content, sender behavior, and linguistic patterns to identify phishing attempts, spam, and malicious attachments. Combined with behavioral analysis (as in Durga Antivirus Pro), NLP catches threats that rule-based filters miss β€” especially sophisticated social engineering attacks.

What's Next

Continue your NLP journey:

Computer Vision Guide
Deep Learning Basics
AI Agents Explained

Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro