| |
| """ |
| 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() |
|
|