GLiNER

1

I need GLiNER code to classify address into multiple parts like:

Street Name House No Suite No

I'll help you create a GLiNER (General Language Interface for Named Entity Recognition) implementation to parse addresses into their components.

import torch
from transformers import AutoTokenizer, AutoModelForTokenClassification
import numpy as np

class AddressGLiNER:
    def __init__(self, model_name="bert-base-uncased"):
        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
        self.model = AutoModelForTokenClassification.from_pretrained(
            model_name,
            num_labels=7  # O, B-STREET, I-STREET, B-HOUSE, I-HOUSE, B-SUITE, I-SUITE
        )
        
        # Define label mappings
        self.id2label = {
            0: "O",
            1: "B-STREET",
            2: "I-STREET",
            3: "B-HOUSE",
            4: "I-HOUSE",
            5: "B-SUITE",
            6: "I-SUITE"
        }
        self.label2id = {v: k for k, v in self.id2label.items()}
        
    def train(self, train_data, epochs=5):
        """
        Train the GLiNER model on address data
        
        Args:
            train_data: List of tuples (text, labels)
            epochs: Number of training epochs
        """
        self.model.train()
        optimizer = torch.optim.AdamW(self.model.parameters(), lr=2e-5)
        
        for epoch in range(epochs):
            total_loss = 0
            for text, labels in train_data:
                # Tokenize input text
                inputs = self.tokenizer(
                    text,
                    return_tensors="pt",
                    padding=True,
                    truncation=True
                )
                
                # Convert labels to tensor
                label_ids = torch.tensor([self.label2id[label] for label in labels])
                
                # Forward pass
                outputs = self.model(**inputs, labels=label_ids)
                loss = outputs.loss
                
                # Backward pass
                loss.backward()
                optimizer.step()
                optimizer.zero_grad()
                
                total_loss += loss.item()
                
            print(f"Epoch {epoch+1}/{epochs}, Loss: {total_loss/len(train_data):.4f}")
    
    def predict(self, text):
        """
        Predict address components from input text
        
        Args:
            text: Input address string
            
        Returns:
            Dictionary containing extracted components
        """
        self.model.eval()
        
        # Tokenize input
        inputs = self.tokenizer(
            text,
            return_tensors="pt",
            padding=True,
            truncation=True
        )
        
        # Get predictions
        with torch.no_grad():
            outputs = self.model(**inputs)
            predictions = outputs.logits.argmax(-1)[0]
        
        # Convert predictions to labels
        predicted_labels = [self.id2label[p.item()] for p in predictions]
        
        # Extract components
        tokens = self.tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
        components = {
            "street_name": "",
            "house_number": "",
            "suite_number": ""
        }
        
        current_label = None
        current_text = ""
        
        for token, label in zip(tokens, predicted_labels):
            if label.startswith("B-"):
                if current_label:
                    self._add_component(components, current_label, current_text.strip())
                current_label = label[2:]
                current_text = self.tokenizer.convert_tokens_to_string([token])
            elif label.startswith("I-"):
                current_text += " " + self.tokenizer.convert_tokens_to_string([token])
            elif label == "O" and current_label:
                self._add_component(components, current_label, current_text.strip())
                current_label = None
                current_text = ""
        
        if current_label:
            self._add_component(components, current_label, current_text.strip())
            
        return components
    
    def _add_component(self, components, label, text):
        """Helper method to add extracted components to the result dictionary"""
        if label == "STREET":
            components["street_name"] = text
        elif label == "HOUSE":
            components["house_number"] = text
        elif label == "SUITE":
            components["suite_number"] = text

# Example usage
def main():
    # Initialize model
    gliner = AddressGLiNER()
    
    # Example training data
    train_data = [
        (
            "123 Main Street Suite 45",
            ["B-HOUSE", "I-HOUSE", "B-STREET", "I-STREET", "B-SUITE", "I-SUITE"]
        ),
        # Add more training examples here
    ]
    
    # Train model
    gliner.train(train_data)
    
    # Example prediction
    address = "456 Oak Avenue Suite 789"
    result = gliner.predict(address)
    print("\nExtracted components:")
    print(f"Street Name: {result['street_name']}")
    print(f"House Number: {result['house_number']}")
    print(f"Suite Number: {result['suite_number']}")

if __name__ == "__main__":
    main()

I've created a comprehensive GLiNER implementation for address parsing. Here are the key features:

  1. The model uses BERT as the base architecture with a token classification head

  2. Supports BIO tagging scheme (Beginning, Inside, Outside) for each component

  3. Includes three main components:

    • Street Name

    • House Number

    • Suite Number

  4. Provides methods for both training and prediction

To use this code, you would need to:

  1. Install required dependencies:

  1. Prepare training data in the format shown in the example

  2. Initialize and train the model

  3. Use the predict method to extract components from new addresses

The model can be further improved by:

  • Adding more address components (city, state, zip code)

  • Implementing data preprocessing

  • Adding validation during training

  • Including confidence scores for predictions

Would you like me to modify any part of the implementation or add additional features?


2

Need GLiNER integration

You're absolutely right - I apologize for not using the actual GLiNER library. Let me create a correct implementation using the GLiNER library.

This implementation uses the actual GLiNER library and follows its conventions. Here are the key features:

  1. Uses GLiNER's native API for training and prediction

  2. Includes a schema defining the address components

  3. Properly formats training data with start and end offsets

  4. Handles three main components:

    • House Number

    • Street Name

    • Suite Number

To use this code:

  1. Install GLiNER:

  1. Either use the provided example training data or create your own in the same format

  2. Run the script to train the model and make predictions

The model can be improved by:

  • Adding more training examples

  • Including additional address components

  • Fine-tuning the training parameters

  • Adding validation data

  • Implementing error handling


3

Tell me more about GLiNER

Let me explain GLiNER (Grounded Language-model-based Interactive Named Entity Recognition).

GLiNER is an innovative tool developed for Named Entity Recognition (NER) that takes a different approach from traditional NER systems. Here are its key features and concepts:

  1. Interactive NER Approach

  • Unlike traditional NER systems that use predefined entity types, GLiNER allows users to define custom entity types on the fly

  • It uses natural language instructions to identify entities, making it more flexible and intuitive

  • Can adapt to new domains without requiring extensive retraining

  1. Key Components

  • Uses Large Language Models (LLMs) as its foundation

  • Employs natural language prompts and schemas

  • Supports zero-shot and few-shot learning capabilities

  • Enables interactive refinement of entity definitions

  1. Main Features:

  1. Advantages:

  • No need for large annotated datasets

  • Can handle complex entity definitions

  • Adaptable to different domains

  • More intuitive for non-technical users

  • Supports interactive refinement of results

  1. Use Cases:

  • Document processing

  • Information extraction

  • Custom entity recognition tasks

  • Domain-specific NER applications

  • Research and analysis

  1. Training Data Format:

  1. Best Practices:

  • Provide clear, specific descriptions in your schema

  • Start with a few examples and refine interactively

  • Use domain-specific language in descriptions

  • Test with various input formats

  • Iterate on the schema based on results

  1. Limitations:

  • Performance depends on the underlying language model

  • May require fine-tuning for specialized domains

  • Processing speed can vary based on model size

  • Requires careful schema design for optimal results

Would you like me to elaborate on any of these aspects or show you more specific examples of how to use GLiNER for particular use cases?


4

How GLiNER uses LLM

Let me explain how GLiNER leverages Large Language Models (LLMs) in its architecture.

Here's how GLiNER utilizes LLMs in its architecture:

  1. Prompt Construction

  • GLiNER dynamically constructs prompts using the schema definitions

  • Converts natural language descriptions into structured prompts for the LLM

  • Handles both zero-shot and few-shot scenarios

  1. Entity Recognition Process

  • The LLM processes the text based on natural language descriptions

  • Identifies entities according to the schema definitions

  • Returns structured output with entity positions and labels

  1. Key Integration Points

  • Schema Interpretation: LLM understands natural language descriptions in the schema

  • Zero-shot Learning: Can identify entities without training examples

  • Few-shot Learning: Uses examples to improve accuracy

  • Interactive Refinement: Incorporates feedback for better results

  1. LLM Interaction Flow:

  1. Advantages of LLM Integration:

  • Natural language understanding capabilities

  • Flexible entity definitions

  • Ability to handle context and nuance

  • Dynamic adaptation to new domains

  • Interactive refinement possibilities

  1. Key Features:

  • Dynamic prompt generation

  • Context-aware entity recognition

  • Confidence scoring

  • Error handling and validation

  • Interactive feedback incorporation


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


Last updated