File size: 2,656 Bytes
b30f068 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | """
Base parser interface for query processing.
"""
from abc import ABC, abstractmethod
from typing import Dict, List, Any, Optional
from pydantic import BaseModel
class ParsedQuery(BaseModel):
"""Structured representation of a parsed query."""
original_query: str
keywords: List[str]
entities: List[Dict[str, Any]]
intent: Optional[str] = None
confidence: float = 0.0
metadata: Dict[str, Any] = {}
class BaseParser(ABC):
"""Abstract base class for query parsers."""
def __init__(self, config: Optional[Dict[str, Any]] = None):
"""
Initialize the parser with configuration.
Args:
config: Parser configuration dictionary
"""
self.config = config or {}
self._initialize()
@abstractmethod
def _initialize(self) -> None:
"""Initialize parser-specific components."""
pass
@abstractmethod
def parse(self, query: str) -> ParsedQuery:
"""
Parse a natural language query.
Args:
query: Input query string
Returns:
ParsedQuery object with extracted information
"""
pass
@abstractmethod
def extract_keywords(self, query: str) -> List[str]:
"""
Extract keywords from a query.
Args:
query: Input query string
Returns:
List of extracted keywords
"""
pass
def preprocess_query(self, query: str) -> str:
"""
Preprocess the query before parsing.
Args:
query: Raw input query
Returns:
Preprocessed query string
"""
# Basic preprocessing
query = query.strip()
query = ' '.join(query.split()) # Normalize whitespace
return query
def postprocess_results(self, parsed_query: ParsedQuery) -> ParsedQuery:
"""
Postprocess parsing results.
Args:
parsed_query: Initial parsing results
Returns:
Postprocessed ParsedQuery
"""
# Remove duplicate keywords while preserving order
seen = set()
unique_keywords = []
for keyword in parsed_query.keywords:
if keyword.lower() not in seen:
seen.add(keyword.lower())
unique_keywords.append(keyword)
parsed_query.keywords = unique_keywords
return parsed_query
|