|
|
|
""" |
|
Complete Pipeline Demo for Integrated Crossword Generator |
|
|
|
Demonstrates the full capabilities of the integrated system combining: |
|
- UnifiedThematicWordGenerator: Smart word discovery with 100K+ vocabulary |
|
- APIClueGenerator: High-quality clue generation using multiple AI models |
|
|
|
Shows real crossword creation scenarios and advanced features. |
|
""" |
|
|
|
import sys |
|
import os |
|
import time |
|
import asyncio |
|
from pathlib import Path |
|
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent)) |
|
|
|
try: |
|
from integrated_crossword_generator import IntegratedCrosswordGenerator, CrosswordEntry |
|
INTEGRATED_AVAILABLE = True |
|
except ImportError as e: |
|
print(f"โ Integration import error: {e}") |
|
INTEGRATED_AVAILABLE = False |
|
|
|
|
|
def demo_basic_integration(): |
|
"""Demo basic integration functionality.""" |
|
print("๐ Demo 1: Basic Integration") |
|
print("=" * 50) |
|
|
|
generator = IntegratedCrosswordGenerator(vocab_size_limit=50000) |
|
generator.initialize() |
|
|
|
system_info = generator.get_system_info() |
|
print("๐ System Components:") |
|
for component, info in system_info['components'].items(): |
|
status = "โ
Ready" if info['ready'] else "โ Not Ready" |
|
details = "" |
|
if component == 'thematic_generator' and info['ready']: |
|
details = f" ({info['vocab_size']:,} words)" |
|
elif component == 'api_clue_generator' and info['ready']: |
|
details = f" ({len(info['models'])} models)" |
|
|
|
print(f" {component}: {status}{details}") |
|
|
|
|
|
print(f"\n๐ฏ Generating crossword entries for 'animals'...") |
|
start_time = time.time() |
|
|
|
entries = generator.generate_crossword_entries( |
|
topic="animals", |
|
num_words=5, |
|
difficulty="medium" |
|
) |
|
|
|
generation_time = time.time() - start_time |
|
|
|
if entries: |
|
print(f"โ
Generated {len(entries)} entries in {generation_time:.2f}s") |
|
print("\nResults:") |
|
for i, entry in enumerate(entries, 1): |
|
quality_icon = {"EXCELLENT": "๐", "GOOD": "โ
", "ACCEPTABLE": "๐", "POOR": "โ", "BASIC": "๐"}.get(entry.clue_quality, "?") |
|
print(f" {i}. {entry.word:<10} | {quality_icon} {entry.clue}") |
|
print(f" Similarity: {entry.similarity_score:.3f} | Model: {entry.clue_model}") |
|
else: |
|
print("โ No entries generated") |
|
|
|
return generator |
|
|
|
|
|
def demo_difficulty_levels(generator): |
|
"""Demo difficulty-based generation.""" |
|
print("\n๐๏ธ Demo 2: Difficulty Levels") |
|
print("=" * 50) |
|
|
|
topic = "technology" |
|
difficulties = ["easy", "medium", "hard"] |
|
|
|
for difficulty in difficulties: |
|
print(f"\n๐ {difficulty.upper()} difficulty:") |
|
print("-" * 25) |
|
|
|
try: |
|
entries = generator.generate_crossword_entries( |
|
topic=topic, |
|
num_words=4, |
|
difficulty=difficulty |
|
) |
|
|
|
if entries: |
|
for entry in entries: |
|
|
|
length_indicator = f"({len(entry.word)} letters)" |
|
tier_short = entry.frequency_tier.split('_')[1] if '_' in entry.frequency_tier else entry.frequency_tier |
|
|
|
print(f" {entry.word:<12} {length_indicator:<12} Tier {tier_short} | {entry.clue}") |
|
else: |
|
print(" No entries generated") |
|
|
|
except Exception as e: |
|
print(f" โ Error: {e}") |
|
|
|
|
|
def demo_multiple_topics(generator): |
|
"""Demo multi-topic crossword generation.""" |
|
print("\n๐ Demo 3: Multiple Topics") |
|
print("=" * 50) |
|
|
|
topics = ["science", "music", "sports", "food"] |
|
|
|
print(f"๐ฏ Generating entries for {len(topics)} topics...") |
|
|
|
start_time = time.time() |
|
results = generator.generate_by_multiple_topics( |
|
topics=topics, |
|
words_per_topic=3, |
|
difficulty="medium" |
|
) |
|
generation_time = time.time() - start_time |
|
|
|
print(f"โ
Generated entries for all topics in {generation_time:.2f}s") |
|
|
|
for topic, entries in results.items(): |
|
print(f"\n๐ {topic.upper()}:") |
|
print("-" * 20) |
|
|
|
if entries: |
|
for entry in entries: |
|
quality_icon = {"EXCELLENT": "๐", "GOOD": "โ
", "ACCEPTABLE": "๐"}.get(entry.clue_quality, "๐") |
|
print(f" {entry.word:<10} | {quality_icon} {entry.clue}") |
|
else: |
|
print(" No entries generated") |
|
|
|
return results |
|
|
|
|
|
def demo_advanced_filtering(generator): |
|
"""Demo advanced filtering and selection.""" |
|
print("\n๐ Demo 4: Advanced Filtering") |
|
print("=" * 50) |
|
|
|
|
|
print("๐ฏ Generating large set with filtering...") |
|
|
|
entries = generator.generate_crossword_entries( |
|
topic="nature", |
|
num_words=8, |
|
difficulty="medium", |
|
min_similarity=0.4 |
|
) |
|
|
|
if not entries: |
|
print("โ No entries generated") |
|
return |
|
|
|
|
|
quality_groups = {} |
|
for entry in entries: |
|
quality = entry.clue_quality |
|
if quality not in quality_groups: |
|
quality_groups[quality] = [] |
|
quality_groups[quality].append(entry) |
|
|
|
print(f"โ
Generated {len(entries)} entries, grouped by quality:") |
|
|
|
quality_order = ["EXCELLENT", "GOOD", "ACCEPTABLE", "POOR", "BASIC"] |
|
for quality in quality_order: |
|
if quality in quality_groups: |
|
group = quality_groups[quality] |
|
icon = {"EXCELLENT": "๐", "GOOD": "โ
", "ACCEPTABLE": "๐", "POOR": "โ", "BASIC": "๐"}[quality] |
|
print(f"\n{icon} {quality} ({len(group)} entries):") |
|
|
|
for entry in sorted(group, key=lambda x: x.similarity_score, reverse=True): |
|
print(f" {entry.word:<12} (sim: {entry.similarity_score:.3f}) | {entry.clue}") |
|
|
|
|
|
def demo_performance_analysis(generator): |
|
"""Demo performance analysis and statistics.""" |
|
print("\n๐ Demo 5: Performance Analysis") |
|
print("=" * 50) |
|
|
|
|
|
generator.stats = { |
|
'words_discovered': 0, |
|
'clues_generated': 0, |
|
'api_calls': 0, |
|
'cache_hits': 0, |
|
'total_time': 0.0 |
|
} |
|
|
|
|
|
scenarios = [ |
|
{"topic": "animals", "num_words": 3, "difficulty": "easy"}, |
|
{"topic": "technology", "num_words": 5, "difficulty": "medium"}, |
|
{"topic": "music", "num_words": 4, "difficulty": "hard"} |
|
] |
|
|
|
print("๐โโ๏ธ Running performance scenarios...") |
|
|
|
all_entries = [] |
|
scenario_times = [] |
|
|
|
for i, scenario in enumerate(scenarios, 1): |
|
print(f"\nScenario {i}: {scenario['topic']} ({scenario['difficulty']})") |
|
|
|
start_time = time.time() |
|
entries = generator.generate_crossword_entries(**scenario) |
|
scenario_time = time.time() - start_time |
|
|
|
scenario_times.append(scenario_time) |
|
all_entries.extend(entries) |
|
|
|
print(f" Time: {scenario_time:.2f}s | Entries: {len(entries)}") |
|
|
|
|
|
final_stats = generator.get_stats() |
|
|
|
print("\n๐ Performance Summary:") |
|
print(f" Total entries generated: {len(all_entries)}") |
|
print(f" Total words discovered: {final_stats['words_discovered']}") |
|
print(f" Total API calls: {final_stats['api_calls']}") |
|
print(f" Total time: {final_stats['total_time']:.2f}s") |
|
|
|
if len(all_entries) > 0: |
|
avg_time_per_entry = final_stats['total_time'] / len(all_entries) |
|
print(f" Avg time per entry: {avg_time_per_entry:.2f}s") |
|
|
|
|
|
quality_counts = {} |
|
for entry in all_entries: |
|
quality = entry.clue_quality |
|
quality_counts[quality] = quality_counts.get(quality, 0) + 1 |
|
|
|
print(f"\n๐ฏ Quality Distribution:") |
|
for quality, count in sorted(quality_counts.items()): |
|
percentage = (count / len(all_entries)) * 100 |
|
print(f" {quality}: {count} ({percentage:.1f}%)") |
|
|
|
|
|
def demo_educational_crossword(generator): |
|
"""Demo creating educational crossword content.""" |
|
print("\n๐ Demo 6: Educational Crossword Creation") |
|
print("=" * 50) |
|
|
|
|
|
educational_topics = { |
|
"Biology": "cellular biology", |
|
"Chemistry": "chemical elements", |
|
"Physics": "fundamental forces", |
|
"Mathematics": "algebra concepts" |
|
} |
|
|
|
print("๐ Creating educational crossword content...") |
|
|
|
educational_entries = {} |
|
|
|
for subject, specific_topic in educational_topics.items(): |
|
print(f"\n๐ฌ {subject} - {specific_topic}:") |
|
print("-" * 30) |
|
|
|
try: |
|
entries = generator.generate_crossword_entries( |
|
topic=specific_topic, |
|
num_words=3, |
|
difficulty="medium" |
|
) |
|
|
|
educational_entries[subject] = entries |
|
|
|
if entries: |
|
for entry in entries: |
|
|
|
tier_level = entry.frequency_tier.split('_')[1] if '_' in entry.frequency_tier else "unknown" |
|
print(f" {entry.word:<15} | {entry.clue}") |
|
print(f" โโ Difficulty tier: {tier_level}, Model: {entry.clue_model}") |
|
print() |
|
else: |
|
print(" No suitable educational terms found") |
|
|
|
except Exception as e: |
|
print(f" โ Error generating {subject} content: {e}") |
|
|
|
|
|
total_educational = sum(len(entries) for entries in educational_entries.values()) |
|
print(f"โ
Created {total_educational} educational crossword entries across {len(educational_topics)} subjects") |
|
|
|
|
|
def demo_interactive_generation(): |
|
"""Demo interactive generation mode.""" |
|
print("\n๐ฎ Demo 7: Interactive Generation") |
|
print("=" * 50) |
|
|
|
generator = IntegratedCrosswordGenerator(vocab_size_limit=25000) |
|
generator.initialize() |
|
|
|
if not (generator.thematic_ready or generator.api_ready): |
|
print("โ System not ready for interactive demo") |
|
return |
|
|
|
print("๐ฏ Interactive Crossword Generator") |
|
print("Enter topics to generate crossword entries (or 'quit' to exit)") |
|
print("Format: <topic> [num_words] [difficulty]") |
|
print("Example: animals 5 medium") |
|
print() |
|
|
|
while True: |
|
try: |
|
user_input = input("๐ Enter topic (or 'quit'): ").strip() |
|
|
|
if user_input.lower() in ['quit', 'exit', 'q']: |
|
break |
|
|
|
if not user_input: |
|
continue |
|
|
|
|
|
parts = user_input.split() |
|
topic = parts[0] |
|
num_words = int(parts[1]) if len(parts) > 1 and parts[1].isdigit() else 4 |
|
difficulty = parts[2] if len(parts) > 2 and parts[2] in ['easy', 'medium', 'hard'] else 'medium' |
|
|
|
print(f"\n๐ Generating {num_words} {difficulty} entries for '{topic}'...") |
|
|
|
start_time = time.time() |
|
entries = generator.generate_crossword_entries( |
|
topic=topic, |
|
num_words=num_words, |
|
difficulty=difficulty |
|
) |
|
generation_time = time.time() - start_time |
|
|
|
if entries: |
|
print(f"โ
Generated {len(entries)} entries in {generation_time:.2f}s:") |
|
print() |
|
|
|
for i, entry in enumerate(entries, 1): |
|
quality_icon = {"EXCELLENT": "๐", "GOOD": "โ
", "ACCEPTABLE": "๐", "POOR": "โ", "BASIC": "๐"}.get(entry.clue_quality, "?") |
|
print(f" {i}. {entry.word:<12} | {quality_icon} {entry.clue}") |
|
print(f" Similarity: {entry.similarity_score:.3f} | {entry.tier_description}") |
|
print() |
|
else: |
|
print("โ No entries generated. Try a different topic.") |
|
|
|
except KeyboardInterrupt: |
|
print("\n\n๐ Exiting interactive mode") |
|
break |
|
except Exception as e: |
|
print(f"โ Error: {e}") |
|
|
|
|
|
final_stats = generator.get_stats() |
|
print("\n๐ Interactive Session Stats:") |
|
print(f" Words discovered: {final_stats['words_discovered']}") |
|
print(f" Clues generated: {final_stats['clues_generated']}") |
|
print(f" Total time: {final_stats['total_time']:.2f}s") |
|
|
|
|
|
def main(): |
|
"""Run complete pipeline demonstration.""" |
|
if not INTEGRATED_AVAILABLE: |
|
print("โ Integrated crossword generator not available") |
|
print("Please check that all dependencies are installed:") |
|
print(" - thematic_word_generator.py") |
|
print(" - api_clue_generator.py") |
|
print(" - All required Python packages") |
|
return |
|
|
|
|
|
hf_token = os.getenv('HF_TOKEN') |
|
if not hf_token: |
|
print("โ HF_TOKEN environment variable not set") |
|
print("Set your token: export HF_TOKEN='your_token_here'") |
|
print("Some features will be limited without API access") |
|
print() |
|
|
|
print("๐ Complete Pipeline Demo: Integrated Crossword Generator") |
|
print("=" * 70) |
|
print("Demonstrating the integration of:") |
|
print(" ๐ Smart Word Discovery (Thematic Generator)") |
|
print(" ๐ค High-Quality Clue Generation (API Models)") |
|
print(" ๐ Difficulty Control (Frequency Tiers)") |
|
print(" ๐ฏ Topic-Focused Generation") |
|
print() |
|
|
|
try: |
|
|
|
generator = demo_basic_integration() |
|
|
|
if generator and generator.is_initialized: |
|
demo_difficulty_levels(generator) |
|
demo_multiple_topics(generator) |
|
demo_advanced_filtering(generator) |
|
demo_performance_analysis(generator) |
|
demo_educational_crossword(generator) |
|
|
|
|
|
print("\n" + "=" * 70) |
|
choice = input("๐ฎ Run interactive demo? (y/n): ").strip().lower() |
|
if choice in ['y', 'yes']: |
|
demo_interactive_generation() |
|
|
|
print("\n" + "=" * 70) |
|
print("โ
COMPLETE PIPELINE DEMO FINISHED") |
|
print("=" * 70) |
|
print("๐ Successfully demonstrated integrated crossword generation!") |
|
print("\n๐ก This system combines the best of both worlds:") |
|
print(" ๐ Intelligent word discovery with 100K+ vocabulary") |
|
print(" ๐ค AI-powered clue generation using multiple models") |
|
print(" ๐ Difficulty control using frequency analysis") |
|
print(" ๐ฏ Theme-focused content generation") |
|
print(" โก Efficient caching and batch processing") |
|
|
|
print(f"\n๐ Key files created:") |
|
print(f" โข integrated_crossword_generator.py - Main integration class") |
|
print(f" โข test_integrated_system.py - Comprehensive tests") |
|
print(f" โข demo_complete_pipeline.py - This demonstration") |
|
|
|
print(f"\n๐ Ready for production use in crossword applications!") |
|
|
|
except KeyboardInterrupt: |
|
print("\n\n๐ Demo interrupted by user") |
|
except Exception as e: |
|
print(f"\nโ Demo error: {e}") |
|
print("Check system dependencies and configuration") |
|
|
|
|
|
if __name__ == "__main__": |
|
main() |
|
|