Source code for cursus.processing.text.cs_format_processor

import re
from typing import List, Union, Optional, Dict

from ..processors import Processor


[docs] class CSChatSplitterProcessor(Processor): def __init__(self): super().__init__() self.processor_name = "cs_chat_splitter_processor"
[docs] def process(self, input_text: str) -> List[Dict[str, str]]: """Split chat into individual messages with roles.""" messages = [] # Use regex to find all role markers and their positions pattern = r"\[(bot|customer|agent)\]:" markers = list(re.finditer(pattern, input_text)) # Process each message segment for i in range(len(markers)): current_match = markers[i] next_match = markers[i + 1] if i < len(markers) - 1 else None # Get current message boundaries start_pos = current_match.end() end_pos = next_match.start() if next_match else len(input_text) # Extract role and content role = current_match.group(1) content = input_text[start_pos:end_pos].strip() # Check for embedded messages in content embedded_messages = self._extract_embedded_messages(content) if embedded_messages: # Add the main message (content before first embedded) main_content = content[: content.find("[")].strip() if main_content: messages.append({"role": role, "content": main_content}) # Add all embedded messages messages.extend(embedded_messages) else: if content: messages.append({"role": role, "content": content}) return messages
def _extract_embedded_messages(self, content: str) -> List[Dict[str, str]]: """Extract any embedded messages from content.""" embedded = [] pattern = r"\[(bot|customer|agent)\]:([^[]+)(?=\[|$)" matches = re.finditer(pattern, content) for match in matches: role = match.group(1) message_content = match.group(2).strip() if message_content: embedded.append({"role": role, "content": message_content}) return embedded def _clean_content(self, content: str) -> str: """Clean message content.""" # Remove extra whitespace content = re.sub(r"\s+", " ", content.strip()) # Remove any remaining role markers content = re.sub(r"\[(bot|customer|agent)\]:", "", content) return content.strip()
[docs] class CSAdapter(Processor): def __init__(self): super().__init__() self.processor_name = "cs_adapter_processor"
[docs] def process(self, chat_messages: List[Dict[str, str]]) -> List[str]: """ Converts the output of ChatSplitterProcessor to a format suitable for DialogueChunkerProcessor. Args: chat_messages (List[Dict[str, str]]): List of dictionaries, each containing 'role' and 'content' keys. Returns: List[str]: List of formatted message strings. """ formatted_messages = [] for message in chat_messages: role = message["role"] content = message["content"] formatted_message = f"[{role}]: {content}" formatted_messages.append(formatted_message) return formatted_messages