ELMo Embeddings

Abdulkader Helwan
3 min readJan 17, 2024
Text Embeddings

Traditionally, computers have represented text using bag-of-words (BoW) models, which simply count the occurrences of each word in a document. While BoW models provide a basic representation, they fail to capture the contextual meaning of words and their relationships to other words in a sentence or document.

Text embeddings, on the other hand, go beyond simple word counts to represent words as vectors in a high-dimensional space. These vectors are learned from large amounts of text data and capture the semantic relationships between words. As a result, text embeddings can be used to perform various NLP tasks with greater accuracy and efficiency.

Types of Text Embeddings

Several techniques have been developed for generating text embeddings, each with its own strengths and limitations. Some of the most popular include:

  • Word2Vec: Developed by Google, Word2Vec employs two main approaches: Continuous Bag of Words (CBOW) and Skip-gram. These models predict the surrounding words given a target word or vice versa, learning the semantic relationships between words in the process.
  • GloVe: Introduced by Stanford University, GloVe utilizes global word-word co-occurrence statistics to learn word representations. This approach captures the global context of words, providing a more nuanced understanding of their meanings.
  • ELMo: Embeddings from Language Models (ELMo) is a deep learning technique that utilizes a bi-directional language model (biLM) to generate contextual word embeddings. Unlike traditional methods, ELMo captures the context-dependent meaning of words, making it particularly effective for NLP tasks that require understanding word relationships.

In this story, we will be discussing ELMo embeddings and its implementation in Python.

What is ELMo?

ELMo is a deep learning technique that utilizes a bi-directional language model (biLM) to generate contextual representations of words. Unlike traditional word embedding methods like Word2Vec and GloVe, which rely on statistical relationships between words, ELMo considers the surrounding words to capture the context-dependent meaning of each word. This ability to capture context is what sets ELMo apart and makes it particularly effective in NLP tasks.

ELMo Architecture

The heart of ELMo is a biLM, which consists of two independent LSTM (Long Short-Term Memory) networks, each processing the input sequence in opposite directions: forward and backward. The outputs of these two LSTMs are concatenated to form a single vector representation for each word in the input sequence.

This concatenation of forward and backward LSTM outputs represents the contextual information surrounding each word. The resulting ELMo representations are significantly more complex and informative than traditional word embeddings, allowing for better performance in various NLP tasks.

ELMo embeddings. Source

Using ELMo in NLP Tasks

ELMo has demonstrated impressive performance across a wide range of NLP tasks, including:

  • Part-of-speech (POS) tagging: Determining the grammatical role of each word in a sentence
  • Named entity recognition (NER): Identifying and classifying named entities such as people, places, and organizations
  • Sentiment analysis: Determining the overall sentiment of a text, whether it’s positive, negative, or neutral
  • Question answering: Answering questions posed about a given text

Implementing ELMo in Python

Fortunately, ELMo is not only powerful but also relatively easy to implement in Python. Several libraries, such as AllenNLP and TensorFlow, provide pre-trained ELMo models that can be easily integrated into NLP models.

Here’s a simplified example of how to use ELMo in Python with AllenNLP:

import tensorflow as tf
from allennlp.models import BidirectionalLM

# Load the pre-trained ELMo model
elmo = BidirectionalLM.from_pretrained('path/to/elmo_model')

# Convert text to tokens
tokens = tokenizer(text)

# Generate ELMo embeddings
embeddings = elmo(tokens)


ELMo has revolutionized the field of NLP by introducing contextual word embeddings that capture the intricate relationships between words and their contexts. Its ability to improve performance across a wide range of NLP tasks has made it an essential tool for language models.