Machine Learning With Graphs Made Simple [& Practical How To Guide]

by | Dec 13, 2023 | Data Science, Machine Learning

What is Machine Learning with Graphs?

Machine learning with graphs refers to applying machine learning techniques and algorithms to analyze, model, and derive insights from graph-structured data. In this context, a graph is a mathematical representation of nodes (vertices) and edges (connections) that illustrate relationships between different entities.

Machine learning with graphs involves leveraging these interconnected relationships to extract meaningful patterns, make predictions, perform classifications, and conduct various learning tasks. It involves specialized algorithms and methodologies tailored to handle graph data, capturing intricate dependencies and structures inherent in interconnected datasets.

Graph-based machine learning can be used in many practical ways, including:

  1. Node Classification: Predicting labels or attributes of nodes based on their connections and features within the graph.
  2. Link Prediction: Inferring missing or future connections between nodes in the graph.
  3. Graph Classification: Classifying entire graphs based on their structural properties or features.
  4. Community Detection: Identifying groups or communities of nodes with similar connectivity patterns.
  5. Graph Embedding: Learning low-dimensional representations for nodes or the entire graph, enabling downstream machine learning tasks.

Introduction to Graphs in Machine Learning

Graphs, as a fundamental structure in machine learning, provide a robust framework for representing and analyzing interconnected data. These mathematical structures consist of nodes connected by edges, where nodes represent entities and edges denote relationships or connections between these entities.

Nodes and edges in a graph representing entities and relationships. These graphs can be manipulated with machine learning

Graphs are mathematical structures consisting of nodes connected by edges.

Unlike traditional tabular representations, graphs capture complex relationships prevalent in real-world data, such as social interactions, network connections, or molecular structures. They offer versatility by accommodating diverse relationship types, making them adept at representing intricate scenarios.

In contrast to tabular data structures, graphs prioritize relationship modelling, allowing for a more nuanced representation of connections between entities. They provide contextual insight by emphasizing interconnections, offering a holistic view of data beyond individual data points. This emphasis on relationships becomes particularly impactful in machine learning applications.

Graphs empower machine learning algorithms to leverage interconnected data, enhancing learning capabilities and improving predictive accuracy. They facilitate the discovery of patterns and structures that might remain concealed in other data representations, enriching the learning process and enabling a deeper understanding of complex datasets.

Their utility spans various fields: in social networks, graphs drive analyses to understand influence, information flow, and community detection. In biological sciences, particularly genomics and drug discovery, graphs model molecular structures, interactions, and pathways. In logistics and infrastructure planning, graphs optimize transportation routes, model infrastructure networks, and enhance logistical planning.

Graphs are pivotal in machine learning, facilitating a deeper understanding of interconnected data. Their versatility and ability to capture complex relationships make them indispensable across various domains, revolutionising how data is understood, processed, and utilised in modern ML applications.

What are the Different Types of Graphs in Machine Learning?

Graphs in machine learning come in various types, each tailored to represent specific relationships and structures within data. Understanding these types is crucial for selecting the appropriate graph representation for a given problem domain.

1. Directed and Undirected Graphs

  • Directed Graphs (Digraphs): Nodes connected by directed edges, indicating a unidirectional relationship. Information flows from one node to another.
  • Undirected Graphs: Nodes linked by undirected edges, implying a bidirectional relationship where the connection is mutual.

2. Weighted Graphs

Weighted Edges: Graphs where edges carry a numerical weight or value, representing the strength, distance, or significance of the relationship between nodes. This is commonly used in traffic networks (edge weights as distances) or social networks (weights as interaction frequency).

3. Bipartite Graphs

Distinct Node Sets: This consists of two separate sets of nodes where edges only connect nodes from different backgrounds, not within the same set. This is predominantly used in recommendation systems to model user-item interactions or in network analysis.

4. Complete and Incomplete Graphs

  • Complete Graphs: Every pair of distinct nodes is connected by an edge, resulting in a fully interconnected network.
  • Incomplete Graphs: Some pairs of nodes lack edges, creating a network with missing connections.

5. Cyclic and Acyclic Graphs

  • Cyclic Graphs: Contain at least one cycle, where a sequence of edges leads back to the starting node, forming a loop.
  • Acyclic Graphs (DAGs – Directed Acyclic Graphs): These lack cycles, offering a structured, non-repetitive relationship among nodes.

6. Hypergraphs

Beyond Node-to-Node Relations: Hypergraphs generalise the concept of edges by allowing connections between more than two nodes simultaneously, creating hyperedges. This is often used in knowledge graphs to represent complex relationships among entities.

7. K-partite Graphs

  • Partitioned Node Sets: Nodes are divided into K disjoint sets, where edges only connect nodes from different backgrounds, not within the exact location. This is applied in scenarios where relationships exist between distinct classes or groups.

8. Planar and Non-planar Graphs

  • Planar Graphs: Graphs that can be drawn on a plane without any edges crossing each other.
  • Non-planar Graphs: Graphs that cannot be represented on a plane without edge crossings.

Understanding these distinct types of graphs in machine learning enables us to choose the most suitable representation that aligns with the nature and characteristics of the data at hand. The appropriate graph type is crucial for practical analysis and modelling in diverse problem domains.

Now that we know what kind of graph best suits our data, it is time to choose a graph representation method. In other words, how are we going to create and store our graph?

Choosing a Graph Representation Method

The representation of graphs in machine learning involves various methods, each offering unique advantages in terms of efficiency, storage, and computational requirements. Understanding these methods is essential for effectively manipulating and analysing graph-based data.

Here is a list of different methods you could choose from:

1. Adjacency Matrix

 A square matrix representing connections between nodes in a graph.

  • Representation: Entries indicate the presence or absence of edges between nodes.
  • Advantages:
    • Simple and intuitive model.
    • Facilitates quick edge queries and matrix operations.
  • Drawbacks:
    • Memory-intensive for large graphs.
    • Inefficient for sparse graphs due to excessive memory usage.

2. Adjacency List

A list-based approach represents a graph where each node maintains a list of its neighbouring nodes.

  • Representation: Nodes store references to their adjacent nodes.
  • Advantages:
    • Memory-efficient for sparse graphs.
    • Suitable for graphs with varying degrees of connectivity.
  • Drawbacks:
    • Slower edge retrieval in dense graphs.
    • Requires additional memory for pointers or references.

3. Incidence Matrix

A matrix representation indicating the relationship between nodes and edges.

  • Representation: Rows represent nodes, columns represent edges, and entries denote node-edge connections.
  • Advantages:
    • Efficient for bipartite graphs and network analysis.
    • Enables easy edge traversal and computation.
  • Drawbacks:
    • It is a more complex representation compared to an adjacency matrix/list.
    • It can be memory-intensive for large graphs with many edges.

4. Property Graphs

Graph representation that allows attributes or properties to be associated with nodes and edges.

  • Representation: Nodes and edges can have additional metadata or attributes.
  • Advantages:
    • Enables modelling complex real-world scenarios with other information.
    • Supports rich querying and analysis based on node/edge properties.
  • Drawbacks:
    • Increased storage requirements for other properties.
    • Complexity in handling and maintaining metadata consistency.

5. Graph Database

A database management system designed for storing and querying graph data.

  • Representation: Stores graph entities and their relationships as first-class citizens.
  • Advantages:
    • Optimised for complex graph queries and traversals.
    • Supports efficient storage and retrieval of interconnected data.
  • Drawbacks:
    • Overhead in setup and maintenance compared to traditional databases.
    • It may have scalability challenges for massive graphs.

Choosing the appropriate graph representation method depends on factors such as graph size, density, connectivity patterns, and the nature of the analysis or operations required. Each method has its strengths and weaknesses, making it crucial to select the most suitable representation for specific machine learning tasks.

Now that you have chosen a graph representation method, it is time to start manipulating your graph by considering different graph metrics.

Graph Metrics in Machine Learning

Metrics within graph theory are pivotal in extracting meaningful insights, understanding network structures, and identifying influential elements within a graph. In machine learning, these metrics are foundational tools for quantifying and interpreting the complex relationships encoded in graphs.

Here are the most important metrics:

1. Degree Centrality

Degree centrality measures the importance of a node based on its degree, i.e., the number of edges connected to it.

  • Significance: A high degree of centrality signifies nodes with many connections, often indicating influential or central nodes within a network.
  • Applications: Used in identifying key players in social networks, essential genes in biological networks, or critical infrastructure in transportation networks.

2. Betweenness Centrality

Measures the extent to which a node lies on the shortest paths between other nodes.

  • Significance: Nodes with high betweenness centrality act as bridges, connecting disparate parts of the network.
  • Applications: Essential in understanding information flow, traffic routing, and bottleneck identification in various network structures.

3. Closeness Centrality

Evaluate how close a node is to all other nodes in the graph.

  • Significance: Nodes with high closeness centrality are easily accessible and can efficiently disseminate information across the network.
  • Applications: Applied in routing algorithms, analysing network efficiency, and identifying central network nodes.

4. Eigenvector Centrality

Measures the importance of a node considering its connections to other high-scoring nodes.

  • Significance: Nodes with high eigenvector centrality are connected to other highly connected nodes.
  • Applications: Used in ranking web pages (PageRank algorithm) and identifying influential nodes in social networks.

5. Clustering Coefficient

Measures the degree to which nodes in a graph tend to cluster together.

  • Significance: High clustering coefficients indicate dense regions or communities within the graph.
  • Applications: Essential for community detection, identifying network structures, and understanding the cohesion of subgroups within a network.

6. PageRank Algorithm

An algorithm used to rank web pages based on their importance and relevance.

  • Significance: Assigns importance scores to nodes based on the link structure, influencing subsequent ranking and information retrieval processes.
  • Applications: Widely applied in search engines, recommendation systems, and network analysis beyond web page ranking.

Understanding these graph metrics is fundamental in discerning the structural properties of graphs and extracting valuable insights crucial for machine learning tasks. They aid in identifying pivotal nodes, assessing network robustness, and uncovering hidden patterns within complex interconnected data structures.

Real-world Examples

Real-world applications of graph-based machine learning traverse diverse domains, showcasing the versatility and potency of graph representations in deciphering intricate relationships within various systems.

  • Social Networks Analysis: Platforms like Facebook or X utilise graph-based ML to comprehend network structures, predict user behaviour, identify communities, and curate targeted content recommendations.
  • Biological Networks: In genomic interactions or protein pathways, graph-based ML aids in drug discovery, predicts gene functions, and unravels crucial biological pathways.
  • Transportation Networks: Graph models optimise transportation routes, forecast traffic flow, and refine logistical planning in road or air networks.
  • Recommendation Systems: E-commerce or streaming platforms leverage graph-based ML for personalised recommendations, refining user-item interactions through nuanced relationship capture.
  • Fraud Detection: Financial transactions or online activities benefit from graph-based ML, identifying anomalous patterns and enhancing fraud detection by scrutinising transaction networks.
  • Knowledge Graphs: Powering search engines and recommendation systems, graph-based ML facilitates semantic understanding, elevating search relevance and knowledge inference.
  • Healthcare Networks: In patient-doctor interactions or disease spread modelling, graph-based ML aids in disease prediction, patient clustering, and resource allocation by leveraging interconnected medical data.

These real-world instances underscore the breadth of graph-based machine learning applications. These approaches offer invaluable insights and solutions by harnessing interconnected data, enriching decision-making processes and empowering machine learning models across diverse fields.

Top 8 Algorithms for Graph-Based Machine Learning

Graph-based machine learning algorithms leverage the inherent structure of graphs to extract meaningful insights, make predictions, and perform various learning tasks. These algorithms, tailored for graph data, play a pivotal role in understanding and harnessing the complex relationships within interconnected datasets.

1. Graph Neural Networks (GNNs)

Neural networks are designed to operate on graph-structured data.

  • Functionality: GNNs aggregate information from neighbouring nodes, enabling nodes to update their representations based on local graph structures.
  • Variations: Graph Convolutional Networks (GCNs), Graph Attention Networks (GATs), GraphSAGE (Graph Sample and Aggregation).

2. PageRank Algorithm

Ranks web pages based on their importance and relevance.

  • Functionality: Measures a page’s importance by considering the quantity and quality of links pointing to it.
  • Applications: Used in web search engines and recommendation systems to rank pages or entities.

3. Community Detection Algorithms

Identify communities or clusters within a network.

  • Functionality: Detects groups of nodes with higher intra-group connections compared to inter-group links.
  • Variations: Louvain Method, Label Propagation Algorithm (LPA), Modularity-based methods.

4, Graph Embedding Techniques

Representing nodes in a continuous vector space.

  • Functionality: Maps nodes into low-dimensional embeddings while preserving structural information and node proximity.
  • Variations: Node2Vec, DeepWalk, GraphSAGE, LINE (Large-scale Information Network Embedding).

5. Random Walk Algorithms

Traverses graphs through random paths.

  • Functionality: Captures graph structure by simulating paths that explore neighbourhoods.
  • Applications: Used in generating node embeddings and understanding graph structures.

6. Link Prediction Algorithms

Predicts missing or future connections between nodes.

  • Functionality: Uses existing graph topology and node features to infer the likelihood of potential edges.
  • Variations: Common Neighbors, Jaccard Coefficient, Node2Vec, GraphSAGE.

7. Graph Clustering Algorithms

Partition graphs into clusters or communities.

  • Functionality: Divides graphs into subsets based on connectivity patterns or node similarities.
  • Variations: Spectral Clustering, Modularity-based methods, K-means on graph embeddings.

8. Graph-based Semi-Supervised Learning

Learning tasks using both labelled and unlabeled data in graph structures.

  • Functionality: Leverages graph connections to propagate label information from labelled nodes to unlabeled ones.
  • Applications: Classification, node labeling, and recommendation systems.

These algorithms form the backbone of graph-based machine learning, enabling the analysis, manipulation, and extraction of valuable insights from interconnected data structures. Their versatility and adaptability empower machine learning models to tackle complex problems across diverse domains while leveraging the rich relationships encoded in graph data.

How Can Deep Learning be Used on Graphs

Deep learning applied to graph-structured data represents a powerful paradigm to uncover and utilise intricate relationships within interconnected datasets. This approach encompasses a suite of neural network models and intense neural networks tailored to process and learn from graph data.

Techniques like Graph Convolutional Networks (GCNs), GraphSAGE, and Graph Attention Networks (GATs) facilitate learning node embeddings, capturing intricate node-level representations based on their local graph neighbourhoods.

Information propagation mechanisms, such as message passing and aggregation, allow nodes to update their features by gathering information from adjacent nodes, fostering multi-layer representations. Such architectures are instrumental in node classification, link prediction, and graph classification.

Attention mechanisms enhance learning by enabling nodes to attend to relevant information selectively. This methodology finds applications across domains such as social network analysis for community detection and recommendation systems, bioinformatics for drug discovery, fraud detection, semantic understanding, and more, unlocking the potential to derive valuable insights from complex graph structures.

Efficient training strategies, scalability considerations, and specialised architectures make deep learning on graphs a pivotal approach in leveraging interconnected data for diverse machine-learning tasks.

How To Implementing Graph-Based Machine Learning

Implementing graph-based machine learning involves leveraging specialised libraries, frameworks, and methodologies tailored for handling graph-structured data. This section explores the tools, techniques, and practical steps in applying graph-based methods to real-world machine learning tasks.

Graph Libraries and Frameworks

  • NetworkX: Python library for creating, manipulating, and studying complex networks and graphs.
  • Graph-tool: Efficient Python library for graph manipulation and analysis with an emphasis on performance.
  • PyTorch Geometric: PyTorch extension for handling graph data, providing tools for GNN implementations.
  • DGL (Deep Graph Library): Framework for building scalable and flexible graph neural networks.

Data Preparation and Feature Engineering

  • Data Understanding: Gain insights into the graph structure, node attributes, and edge relationships.
  • Data Cleaning: Handle missing values, noise, and inconsistencies in the graph data.
  • Feature Extraction: Extract relevant features or embeddings from the graph, considering node properties and connections.

Model Selection and Training

  • Model Architecture: Choose appropriate graph-based models like GNNs, graph embeddings, or algorithms based on the task.
  • Hyperparameter Tuning: Optimise model hyperparameters, considering graph size, complexity, and learning objectives.
  • Training Process: Train the selected model on graph data, leveraging techniques like mini-batch training for scalability.

Validation and Evaluation

  • Validation Splits: Divide the graph into training, validation, and test sets considering graph connectivity.
  • Evaluation Metrics: Use graph-specific metrics like accuracy, F1-score, AUC-ROC, or graph-based metrics such as centrality measures for evaluation.
  • Cross-validation: Employ cross-validation techniques suitable for graph-structured data.

Scalability and Efficiency

  • Batch Processing: Utilise mini-batch processing for large graphs to optimise memory and computation.
  • Parallelisation: Leverage parallel computing for scalability, especially in GNN training.
  • Graph Partitioning: Split large graphs into smaller components for distributed computing or parallel processing.

Visualisation and Interpretability

  • Graph Visualisation: Visualise graphs using tools like NetworkX, Gephi, or dedicated graph visualisation libraries to comprehend the graph’s structure.
  • Interpretability: Understand model decisions by analysing node importance, feature attribution, or activation patterns in GNN layers.
Gephi graph visualization of a social network that can be used for machine learning

Gephi graph visualization of a social network.

Continuous Learning and Improvement

  • Experimentation: Iteratively experiment with different models, features, and hyperparameters to enhance model performance.
  • Adaptation: Adapt models to evolving graph structures or new data using online learning techniques.

Implementing graph-based machine learning involves understanding the underlying data, choosing appropriate models, optimising performance, and extracting meaningful insights from the complex relationships encoded within graphs. By employing specialised tools and methodologies, you can harness the power of graph-based techniques to solve diverse and intricate real-world problems.

Challenges and Considerations

While graph-based machine learning holds immense potential, it comes with challenges and considerations that practitioners must navigate. Understanding these obstacles is crucial for developing robust solutions and effectively addressing the complexities of working with graph-structured data.

1. Scalability Issues with Large Graphs

  • Challenge: Processing and training on large graphs pose scalability challenges due to increased computational and memory requirements.
  • Considerations: Employ graph partitioning techniques, distributed computing, and parallelisation to handle large-scale graphs efficiently.

2. Overfitting and Underfitting Challenges

  • Challenge: Graph-based models may overfit on sparse graphs or underfit on dense graphs, impacting generalisation.
  • Considerations: Fine-tune model architectures, regularisation techniques, and hyperparameters to mitigate overfitting and underfitting issues.

3. Data Preprocessing and Cleaning in Graph-Based ML

  • Challenge: Graph data often requires intricate preprocessing, handling missing values noise, and addressing inconsistencies.
  • Considerations: Implement thorough data cleaning procedures, handle missing data appropriately, and ensure consistency in node and edge attributes.

4. Interpretability and Explainability

  • Challenge: Understanding the decisions made by graph-based models, especially Graph Neural Networks (GNNs), can be challenging.
  • Considerations: Explore interpretability techniques such as attention mechanisms, feature importance analysis, and visualisation tools to enhance model explainability.

5. Choice of Graph Representation

  • Challenge: Selecting the optimal graph representation method depends on the specific characteristics of the data and the task.
  • Considerations: Understand the properties of the graph (density, sparsity) and the computational demands to choose between adjacency matrices, adjacency lists, or other representations.

6. Handling Dynamic and Evolving Graphs

  • Challenge: Graph structures may evolve, requiring models to adapt to network configurations.
  • Considerations: Implement continuous learning techniques, update models incrementally, and consider temporal aspects in graph-based algorithms for dynamic graphs.

7. Computationally Intensive Algorithms

  • Challenge: Certain graph algorithms, especially those used in Graph Neural Networks, can be computationally intensive.
  • Considerations: Optimise algorithms, leverage hardware accelerators, and explore techniques like graph sampling to enhance computational efficiency.

8. Choice of Evaluation Metrics

  • Challenge: Traditional machine learning metrics may not fully capture the performance of graph-based models.
  • Considerations: Employ graph-specific metrics such as centrality measures graph connectivity metrics and evaluate based on the specific task requirements.

9. Privacy and Ethical Considerations

  • Challenge: Graph data often contains sensitive information, raising privacy concerns and ethical considerations.
  • Considerations: Implement privacy-preserving techniques, adhere to ethical guidelines, and ensure responsible data handling practices.

10. Complexity in Algorithm Implementation

  • Challenge: Implementing graph-based algorithms may require specialised knowledge and tools.
  • Considerations: Utilise established libraries and frameworks, collaborate with experts in graph theory, and leverage available resources and documentation.

Addressing these challenges and considerations is essential for successfully deploying graph-based machine learning solutions. By adopting thoughtful strategies and leveraging the appropriate tools, practitioners can unlock the full potential of graph-based approaches while navigating the intricacies of working with interconnected data structures.

Conclusion 

In the vast landscape of machine learning, the integration of graphs emerges as a transformative force, unlocking unprecedented capabilities in deciphering intricate relationships within complex datasets.

Graph-based machine learning is a versatile and powerful paradigm evidenced by diverse real-world applications, from social networks to biological systems, transportation, fraud detection, and beyond. Its ability to encapsulate interconnected data, predict behaviours, optimise designs, and reveal latent patterns empowers decision-making across industries.

Yet, this journey is not without challenges—scalability concerns, interpretability nuances, and the evolving nature of graph structures demand ongoing innovation and thoughtful consideration. However, the rewards are abundant. Graph-based methodologies offer a unique lens to navigate intricate data landscapes, fueling innovation and enabling more informed, data-driven decisions.

As we delve deeper into interconnected data, embracing the complexities and opportunities presented by graph-based machine learning, we embark on a journey of continued exploration and innovation. This transformative paradigm reshapes the boundaries of what’s possible, promising a future where the rich tapestry of interconnected data fuels groundbreaking advancements across diverse domains, shaping a world powered by informed insights and intelligent systems.

About the Author

Neri Van Otten

Neri Van Otten

Neri Van Otten is the founder of Spot Intelligence, a machine learning engineer with over 12 years of experience specialising in Natural Language Processing (NLP) and deep learning innovation. Dedicated to making your projects succeed.

Recent Articles

fact checking with large language models LLMs

Fact-Checking With Large Language Models (LLMs): Is It A Powerful NLP Verification Tool?

Can a Machine Tell a Lie? Picture this: you're scrolling through social media, bombarded by claims about the latest scientific breakthrough, political scandal, or...

key elements of cognitive computing

Cognitive Computing Made Simple: Powerful Artificial Intelligence (AI) Capabilities & Examples

What is Cognitive Computing? The term "cognitive computing" has become increasingly prominent in today's rapidly evolving technological landscape. As our society...

Multilayer Perceptron Architecture

Multilayer Perceptron Explained And How To Train & Optimise MLPs

What is a Multilayer perceptron (MLP)? In artificial intelligence and machine learning, the Multilayer Perceptron (MLP) stands as one of the foundational architectures,...

Left: Illustration of SGD optimization with a typical learning rate schedule. The model converges to a minimum at the end of training. Right: Illustration of Snapshot Ensembling. The model undergoes several learning rate annealing cycles, converging to and escaping from multiple local minima. We take a snapshot at each minimum for test-time ensembling

Learning Rate In Machine Learning And Deep Learning Made Simple

Machine learning algorithms are at the core of many modern technological advancements, powering everything from recommendation systems to autonomous vehicles....

What causes the cold-start problem?

The Cold-Start Problem In Machine Learning Explained & 6 Mitigating Strategies

What is the Cold-Start Problem in Machine Learning? The cold-start problem refers to a common challenge encountered in machine learning systems, particularly in...

Nodes and edges in a bayesian network

Bayesian Network Made Simple [How It Is Used In Artificial Intelligence & Machine Learning]

What is a Bayesian Network? Bayesian network, also known as belief networks or Bayes nets, are probabilistic graphical models representing random variables and their...

Query2vec is an example of knowledge graph reasoning. Conjunctive queries: Where did Canadian citizens with Turing Award Graduate?

Knowledge Graph Reasoning Made Simple [3 Technical Methods & How To Handle Uncertanty]

What is Knowledge Graph Reasoning? Knowledge Graph Reasoning refers to drawing logical inferences, making deductions, and uncovering implicit information within a...

the process of speech recognition

How To Implement Speech Recognition [3 Ways & 7 Machine Learning Models]

What is Speech Recognition? Speech recognition, also known as automatic speech recognition (ASR) or voice recognition, is a technology that converts spoken language...

Key components of conversational AI

Conversational AI Explained: Top 9 Tools & How To Guide [Including GPT]

What is Conversational AI? Conversational AI, short for Conversational Artificial Intelligence, refers to using artificial intelligence and natural language processing...

0 Comments

Submit a Comment

Your email address will not be published. Required fields are marked *

nlp trends

2024 NLP Expert Trend Predictions

Get a FREE PDF with expert predictions for 2024. How will natural language processing (NLP) impact businesses? What can we expect from the state-of-the-art models?

Find out this and more by subscribing* to our NLP newsletter.

You have Successfully Subscribed!