Download example_sentences.py from vocam/web: direct link, hf CLI and curl.
- Browser
- Download file 72.7 kB
-
https://huggingface.co/spaces/vocam/web/resolve/main/example_sentences.py
- Command line
-
hf download hf://spaces/vocam/web/example_sentences.py
-
curl -L -o example_sentences.py https://huggingface.co/spaces/vocam/web/resolve/main/example_sentences.py
72.7 kB
| """ | |
| Enhanced Example Sentence Generator | |
| ------------------------------------------ | |
| A sophisticated approach to generating diverse, natural example sentences | |
| """ | |
| import requests | |
| import os | |
| import random | |
| import re | |
| import time | |
| import json | |
| from functools import lru_cache | |
| class ExampleSentenceGenerator: | |
| def __init__(self, translate_func=None, debug=False): | |
| """Initialize the generator with a multi-stage filter pipeline and diverse templates.""" | |
| print("\n>>> ENHANCED SENTENCE GENERATOR LOADED <<<\n") | |
| self.translate_func = translate_func | |
| self.debug = debug # Set to True to see detailed rejection reasons | |
| self.setup_cache_dir() | |
| self._initialize_templates() | |
| self.recent_templates = {} # Store recently used templates to avoid repetition | |
| self.max_recent_templates = 10 # How many recent templates to remember per category | |
| def setup_cache_dir(self): | |
| """Create cache directory if it doesn't exist.""" | |
| self.cache_dir = "sentence_cache" | |
| os.makedirs(self.cache_dir, exist_ok=True) | |
| def _initialize_templates(self): | |
| """Initialize extensive template library with varied sentence structures.""" | |
| # CORE TEMPLATES | |
| # NOUN TEMPLATES - Basic, Intermediate, Advanced | |
| self.templates = { | |
| # NOUN TEMPLATES - Various complexity levels and contexts | |
| "noun": { | |
| "basic": [ | |
| "The {word} is on the table.", | |
| "I can see a {word} in the room.", | |
| "She bought a new {word} yesterday.", | |
| "This {word} is very useful.", | |
| "Do you have a {word}?", | |
| "Where is my {word}?", | |
| "I need to buy a {word}.", | |
| "That {word} belongs to me.", | |
| "His {word} is very old.", | |
| "Can I borrow your {word}?" | |
| ], | |
| "intermediate": [ | |
| "I've been looking for a {word} like this for months.", | |
| "She inherited an antique {word} from her grandmother.", | |
| "The {word} was displayed prominently in the center of the room.", | |
| "My brother accidentally broke my favorite {word} last week.", | |
| "We should consider getting a different {word} for this purpose.", | |
| "They sell handmade {word}s at that store downtown.", | |
| "The museum has a rare {word} from the 16th century.", | |
| "I'm thinking about replacing my {word} soon.", | |
| "That {word} reminds me of my childhood home.", | |
| "Would you mind passing me that {word} on the shelf?" | |
| ], | |
| "advanced": [ | |
| "The antique {word} that I found at the flea market turned out to be quite valuable.", | |
| "She explained that the unusual {word} had been in her family for generations.", | |
| "Despite its age, the {word} functions perfectly after the restoration.", | |
| "The artist incorporated a {word} into his latest sculpture, giving it an unexpected twist.", | |
| "After searching through numerous stores, I finally found a {word} that matched my requirements.", | |
| "The {word} caught my attention because of its unique design and craftsmanship.", | |
| "They discussed replacing the old {word} with something more modern and practical.", | |
| "I was surprised to discover that the {word} was actually made in my hometown.", | |
| "The {word} would be perfect for our new apartment, if only it weren't so expensive.", | |
| "When traveling abroad, he always brings back a traditional {word} as a souvenir." | |
| ] | |
| }, | |
| # CLOTHING TEMPLATES - With proper context for clothing items | |
| "clothing": { | |
| "basic": [ | |
| "I like your {word}.", | |
| "This {word} is too small.", | |
| "She bought a new {word}.", | |
| "The {word} is blue.", | |
| "Can I borrow your {word}?", | |
| "I need a warm {word}.", | |
| "That {word} looks great on you.", | |
| "My {word} is too big.", | |
| "Where did you get that {word}?", | |
| "He lost his favorite {word}." | |
| ], | |
| "intermediate": [ | |
| "She wore her favorite {word} to the dinner party last night.", | |
| "This {word} would look perfect with your new jeans.", | |
| "I bought this {word} on sale last weekend.", | |
| "The designer creates unique {word}s for celebrities.", | |
| "I need to iron my {word} before the interview tomorrow.", | |
| "This {word} is made of high-quality cotton.", | |
| "That {word} really brings out the color of your eyes.", | |
| "He spilled coffee on his new {word} this morning.", | |
| "My mother gave me this {word} for my birthday.", | |
| "Do you think this {word} is appropriate for a formal event?" | |
| ], | |
| "advanced": [ | |
| "The intricate embroidery on her {word} caught everyone's attention at the gallery opening.", | |
| "I've been searching for a {word} in this particular shade of blue for months.", | |
| "The vintage {word} I found at the thrift store needed just minor alterations to fit perfectly.", | |
| "She designs and sews her own {word}s using sustainable fabrics and traditional techniques.", | |
| "After the washing machine incident, my favorite {word} was never quite the same.", | |
| "When traveling to colder climates, I always pack my warmest {word} just in case.", | |
| "The designer's latest collection features {word}s with bold geometric patterns and vibrant colors.", | |
| "The celebrity was photographed wearing a custom-made {word} at the awards ceremony.", | |
| "I've had this {word} for years, and it still remains one of my favorite pieces in my wardrobe.", | |
| "The tailor suggested a different style of {word} that would better complement my body type." | |
| ] | |
| }, | |
| # UNCOUNTABLE CLOTHING TEMPLATES - No articles | |
| "uncountable_clothing": { | |
| "basic": [ | |
| "The {word} feels very soft.", | |
| "I need new {word} for winter.", | |
| "This {word} is expensive.", | |
| "She likes wearing {word} from that brand.", | |
| "Where did you buy this {word}?", | |
| "The {word} is made in Italy.", | |
| "I prefer cotton {word}.", | |
| "This {word} is too warm for summer.", | |
| "The store sells {word} for all seasons.", | |
| "That {word} looks comfortable." | |
| ], | |
| "intermediate": [ | |
| "She designs {word} for a high-end fashion label in Milan.", | |
| "I'm looking for {word} that's both stylish and comfortable.", | |
| "The {word} she wore to the event received many compliments.", | |
| "This brand specializes in {word} for outdoor activities.", | |
| "The {word} in the display window caught my attention immediately.", | |
| "Quality {word} is worth the investment in the long run.", | |
| "They import {word} from several European countries.", | |
| "The {word} feels incredibly soft and lightweight.", | |
| "We need to buy warmer {word} before our trip to Norway.", | |
| "The latest {word} collection features bold patterns and colors." | |
| ], | |
| "advanced": [ | |
| "The designer's new collection features {word} made entirely from sustainable and recycled materials.", | |
| "She has a keen eye for quality {word} that will last for many seasons.", | |
| "The boutique specializes in handcrafted {word} using traditional techniques passed down for generations.", | |
| "When traveling to varied climates, I always pack versatile {word} that can be layered as needed.", | |
| "The exhibition showcased how {word} has evolved through different cultural contexts over the centuries.", | |
| "The company has revolutionized athletic {word} with their innovative moisture-wicking fabrics.", | |
| "After studying fashion design, she launched her own line of {word} inspired by architectural elements.", | |
| "The {word} displayed in the museum demonstrates the craftsmanship of that historical period.", | |
| "I prefer investing in timeless {word} rather than following fast-fashion trends.", | |
| "The documentary explores how modern {word} production impacts environmental sustainability." | |
| ] | |
| }, | |
| # PERSON TEMPLATES - For words describing people | |
| "person": { | |
| "basic": [ | |
| "The {word} is waiting outside.", | |
| "I met a friendly {word} today.", | |
| "She is a {word} at the university.", | |
| "My neighbor is a {word}.", | |
| "A {word} helped me find my way.", | |
| "The {word} waved hello.", | |
| "I saw a {word} at the store.", | |
| "The {word} was very kind.", | |
| "Do you know that {word}?", | |
| "The {word} is reading a book." | |
| ], | |
| "intermediate": [ | |
| "The {word} I met at the conference gave an interesting presentation about climate change.", | |
| "My cousin recently became a {word} at the new hospital downtown.", | |
| "The {word} who lives next door often helps me with my gardening questions.", | |
| "We interviewed several {word}s for the position, but none had the right qualifications.", | |
| "The {word} who wrote this article has a unique perspective on the issue.", | |
| "A {word} approached me in the park asking for directions to the museum.", | |
| "The community center needs more volunteer {word}s to help with the after-school program.", | |
| "The {word} who served us at the restaurant was very attentive and friendly.", | |
| "My daughter wants to become a {word} when she grows up.", | |
| "The {word} standing by the entrance seemed to be waiting for someone." | |
| ], | |
| "advanced": [ | |
| "The {word} who mentored me during my early career had a profound influence on my professional development.", | |
| "After twenty years as a dedicated {word}, she decided to pursue a completely different career path.", | |
| "The documentary features interviews with {word}s from diverse backgrounds sharing their unique experiences.", | |
| "The renowned {word} delivered a compelling speech about the importance of community engagement.", | |
| "The organization provides resources and support to {word}s who are navigating challenging circumstances.", | |
| "My grandparent was a {word} during a pivotal time in our country's history.", | |
| "Research suggests that {word}s who maintain strong social connections tend to live longer, healthier lives.", | |
| "The book chronicles the journey of a {word} who overcame significant obstacles to achieve their dreams.", | |
| "The panel discussion included perspectives from {word}s representing various fields and specialties.", | |
| "As an experienced {word}, she offers valuable insights that only come with years of practice." | |
| ] | |
| }, | |
| # ANIMAL TEMPLATES - For animal words (more natural, everyday examples) | |
| "animal": { | |
| "basic": [ | |
| "The {word} is sleeping.", | |
| "I saw a {word} at the zoo.", | |
| "My friend has a pet {word}.", | |
| "The {word} runs very fast.", | |
| "The {word} has beautiful fur.", | |
| "I like watching {word}s.", | |
| "The {word} is eating.", | |
| "That {word} is very large.", | |
| "The {word} lives in the forest.", | |
| "Can you see the {word}?" | |
| ], | |
| "intermediate": [ | |
| "We saw a {word} during our visit to the wildlife park.", | |
| "My daughter loves learning about {word}s in her science class.", | |
| "The TV show featured baby {word}s playing with their mother.", | |
| "The zoo has three new {word}s in their collection this year.", | |
| "Be careful if you see a wild {word} while hiking in the mountains.", | |
| "The {word} we spotted on our hike was with its young.", | |
| "My son has a book with beautiful pictures of {word}s.", | |
| "The {word} at the zoo gets fed twice a day.", | |
| "My neighbor's pet {word} escaped from their yard yesterday.", | |
| "The children were excited to see the {word} at the zoo." | |
| ], | |
| "advanced": [ | |
| "The documentary showed how {word}s care for their young in the wild.", | |
| "Our safari guide pointed out a family of {word}s near the watering hole.", | |
| "The {word} at the wildlife sanctuary has been trained to perform simple tricks.", | |
| "My favorite exhibit at the natural history museum features a giant {word}.", | |
| "We learned that {word}s are most active during the early morning hours.", | |
| "In many stories and fables, the {word} is portrayed as clever and cunning.", | |
| "The zoo provides special enrichment activities to keep their {word}s healthy and happy.", | |
| "The wildlife photographer showed us amazing close-up photos of a {word} in its natural habitat.", | |
| "She's studying to become a veterinarian specializing in treating {word}s and similar species.", | |
| "The nature park has created a special protected area for the local {word} population." | |
| ] | |
| }, | |
| # EYEWEAR TEMPLATES - For glasses, sunglasses, etc. | |
| "eyewear": { | |
| "basic": [ | |
| "I need my {word} to read.", | |
| "She wears {word} all the time.", | |
| "These {word} are new.", | |
| "My {word} are broken.", | |
| "Where are my {word}?", | |
| "I lost my {word} yesterday.", | |
| "These {word} help me see better.", | |
| "The {word} are on the table.", | |
| "His {word} have blue frames.", | |
| "I need to clean my {word}." | |
| ], | |
| "intermediate": [ | |
| "I finally found a pair of {word} that fit comfortably on my face.", | |
| "She needs to wear prescription {word} while driving.", | |
| "The optometrist recommended these {word} for reading and computer work.", | |
| "My {word} have transition lenses that darken in the sunlight.", | |
| "He's been wearing the same style of {word} for over twenty years.", | |
| "I keep forgetting where I put my {word} down around the house.", | |
| "These designer {word} were quite expensive but should last for years.", | |
| "My new {word} have anti-glare coating which helps reduce eye strain.", | |
| "She has several pairs of {word} that she coordinates with different outfits.", | |
| "The {word} case protects them when I'm not wearing them." | |
| ], | |
| "advanced": [ | |
| "After trying countless styles, I finally found {word} that complement my face shape and personal style.", | |
| "The optometrist explained that my progressive {word} would take some time to adjust to, but would ultimately be more convenient.", | |
| "She collects vintage {word} from the 1960s and has an impressive display of unique frames.", | |
| "The technology behind these specialized {word} allows people with color blindness to perceive a wider range of colors.", | |
| "My grandfather has worn the same tortoiseshell {word} for decades, refusing all suggestions to update his style.", | |
| "The museum exhibition featured {word} worn by famous historical figures, showing how eyewear fashion has evolved.", | |
| "Modern {word} manufacturing combines traditional craftsmanship with innovative materials for both durability and comfort.", | |
| "The ophthalmologist suggested I try computer {word} specifically designed to filter blue light and reduce digital eye strain.", | |
| "After laser surgery, she only needs to wear {word} occasionally for night driving or extended reading sessions.", | |
| "The artisan creates custom {word} using sustainable materials and traditional techniques passed down for generations." | |
| ] | |
| }, | |
| # JEWELRY TEMPLATES - For necklaces, rings, bracelets, etc. | |
| "jewelry": { | |
| "basic": [ | |
| "She wears a beautiful {word}.", | |
| "The {word} is made of gold.", | |
| "I lost my {word} yesterday.", | |
| "This {word} was a gift.", | |
| "The {word} has a diamond.", | |
| "I like your {word}.", | |
| "That {word} looks expensive.", | |
| "My grandmother gave me this {word}.", | |
| "She never takes off her {word}.", | |
| "Where did you buy that {word}?" | |
| ], | |
| "intermediate": [ | |
| "She wore her grandmother's antique {word} to the wedding ceremony.", | |
| "The handcrafted {word} features stones collected from the local riverbed.", | |
| "I had my {word} repaired at a specialty shop downtown.", | |
| "He surprised her with a {word} for their anniversary celebration.", | |
| "The museum displays {word}s from various historical periods and cultures.", | |
| "She designs custom {word}s using traditional techniques she learned as an apprentice.", | |
| "The {word} catches the light beautifully when she moves.", | |
| "This {word} has been passed down through four generations of my family.", | |
| "I'm looking for a {word} that I can wear with both casual and formal outfits.", | |
| "The artisan market had a vendor selling handmade {word}s from recycled materials." | |
| ], | |
| "advanced": [ | |
| "The intricate {word} she wore to the gala featured rare gemstones arranged in a pattern inspired by celestial constellations.", | |
| "Archaeological discoveries revealed that ancient civilizations crafted {word}s using techniques that still challenge modern artisans.", | |
| "The exhibition showcased how {word} designs have evolved across cultures while maintaining symbolic significance.", | |
| "After studying under master craftspeople, she now creates custom {word}s that blend traditional methods with contemporary aesthetics.", | |
| "The family heirloom {word} not only holds sentimental value but has been appraised as a rare historical piece.", | |
| "The artisan's {word} collection features materials sourced ethically from sustainable mines and workshops.", | |
| "Cultural traditions surrounding the gifting of {word}s reveal fascinating insights about historical social structures.", | |
| "The delicate balance between craftsmanship and wearability is evident in every {word} the designer creates.", | |
| "Her travels around the world have inspired a unique collection of {word}s that incorporate diverse cultural elements.", | |
| "The restoration of the antique {word} required specialized techniques to preserve its original character and value." | |
| ] | |
| }, | |
| # TOOLS TEMPLATES - For scissors, hammers, etc. | |
| "tools": { | |
| "basic": [ | |
| "I need the {word} to finish this.", | |
| "The {word} is in the toolbox.", | |
| "Can you pass me the {word}?", | |
| "This {word} is very sharp.", | |
| "Where are the {word}?", | |
| "I bought a new {word} yesterday.", | |
| "These {word} are old but work well.", | |
| "Be careful with the {word}.", | |
| "The {word} is broken.", | |
| "I can't find my {word}." | |
| ], | |
| "intermediate": [ | |
| "I need a specific type of {word} for this delicate repair work.", | |
| "My grandfather's {word} has lasted for decades because of its quality craftsmanship.", | |
| "The workshop has a specialized {word} that makes this process much easier.", | |
| "She keeps her {word} organized in a custom-built storage system.", | |
| "The artisan demonstrated how to properly use the {word} for best results.", | |
| "I borrowed my neighbor's {word} to finish the project yesterday.", | |
| "These professional-grade {word}s cost more but will last much longer.", | |
| "The {word} needs to be sharpened before we continue with the project.", | |
| "You'll need a different {word} for working with that material.", | |
| "The antique {word} is still perfectly functional despite its age." | |
| ], | |
| "advanced": [ | |
| "The craftsman hand-forges each {word} using techniques that have been passed down for generations.", | |
| "Modern manufacturing has changed the design of the {word}, but professional artisans often prefer traditional models.", | |
| "The museum's collection includes {word}s dating back to the industrial revolution, showing the evolution of tool design.", | |
| "After apprenticing with a master, she developed her own modified {word} that addresses common issues with the standard design.", | |
| "The specialized {word} was developed specifically for this type of precision work and requires significant training to use properly.", | |
| "Restoring antique furniture requires period-appropriate {word}s to maintain historical accuracy and preservation standards.", | |
| "Different regions developed unique variations of the {word} based on local materials and specific cultural needs.", | |
| "The ergonomic design of this modern {word} reduces strain during extended periods of use.", | |
| "The documentary explores how the invention of the {word} revolutionized this particular craft and industry.", | |
| "Professional artisans often modify their {word}s to suit their specific working style and the unique demands of their specialty." | |
| ] | |
| }, | |
| # TOYS TEMPLATES - For toys, games, etc. (more natural, child-focused examples) | |
| "toys": { | |
| "basic": [ | |
| "The child loves playing with the {word}.", | |
| "This {word} is my favorite toy.", | |
| "She sleeps with her {word} every night.", | |
| "The {word} is sitting on the shelf.", | |
| "He got a new {word} for his birthday.", | |
| "This {word} is so soft and cuddly.", | |
| "My daughter won't go anywhere without her {word}.", | |
| "The {word} has a button that makes sounds.", | |
| "We bought a new {word} at the toy store.", | |
| "The children share their {word} with each other." | |
| ], | |
| "intermediate": [ | |
| "My daughter takes her {word} with her everywhere she goes.", | |
| "The child's {word} was a gift from her grandparents last Christmas.", | |
| "When he can't find his {word}, he gets very upset at bedtime.", | |
| "The little boy dragged his {word} behind him as he walked through the store.", | |
| "She has a collection of {word}s displayed on her bedroom shelf.", | |
| "His favorite {word} is getting worn out from being hugged so much.", | |
| "The twins each have their own {word} that they take to preschool.", | |
| "We had to go back to the hotel to get her {word} before bedtime.", | |
| "The {word} has become his comfort object when he's feeling sad.", | |
| "You can see how much she loves her {word} by how well she takes care of it." | |
| ], | |
| "advanced": [ | |
| "The hospital gives each child a {word} to help them feel more comfortable during their stay.", | |
| "My son still keeps his childhood {word} even though he's now in college.", | |
| "The store specializes in handmade {word}s that are passed down through generations.", | |
| "The family tradition involves giving each newborn child a special {word} on their first birthday.", | |
| "The charity collects gently used {word}s to donate to children in need during the holidays.", | |
| "The display case holds her collection of vintage {word}s from around the world.", | |
| "Therapists often use {word}s to help children express their feelings during counseling sessions.", | |
| "When we moved to a new country, his familiar {word} helped him adjust to all the changes.", | |
| "The company designs {word}s specifically for children with sensory processing challenges.", | |
| "My grandmother kept her childhood {word} for over seventy years before passing it on to me." | |
| ] | |
| }, | |
| # VERB TEMPLATES - For action words | |
| "verb": { | |
| "basic": [ | |
| "I {word} every morning.", | |
| "She {word}s regularly.", | |
| "They {word} on weekends.", | |
| "Do you {word} often?", | |
| "He doesn't {word}.", | |
| "We {word}ed yesterday.", | |
| "I will {word} tomorrow.", | |
| "She is {word}ing now.", | |
| "Have you ever {word}ed?", | |
| "They are {word}ing." | |
| ], | |
| "intermediate": [ | |
| "I try to {word} at least three times a week for my health.", | |
| "She {word}s whenever she has a free moment in her busy schedule.", | |
| "The instructor taught us the proper technique to {word} effectively.", | |
| "After the accident, he couldn't {word} for several months during recovery.", | |
| "We {word} together every Saturday as part of our weekend routine.", | |
| "The guidelines recommend that beginners {word} no more than twice weekly.", | |
| "I've been {word}ing regularly since January and have noticed significant improvements.", | |
| "Children naturally learn to {word} through observation and practice.", | |
| "The app helps you track how often you {word} and measures your progress.", | |
| "They {word} competitively at the national level." | |
| ], | |
| "advanced": [ | |
| "Research indicates that those who {word} consistently throughout their lives maintain better cognitive function as they age.", | |
| "After decades of {word}ing professionally, she now teaches advanced techniques to dedicated students.", | |
| "The documentary explores how cultural differences influence the way people {word} across various societies.", | |
| "The ancient practice of {word}ing has evolved considerably but maintains its core principles and benefits.", | |
| "His innovative method of {word}ing challenged conventional wisdom and eventually transformed the entire field.", | |
| "The rehabilitation program incorporates modified ways to {word} that accommodate various physical limitations.", | |
| "Neuroscience research reveals that {word}ing activates multiple brain regions simultaneously, creating new neural pathways.", | |
| "The philosophy behind this approach suggests that how you {word} reflects fundamental aspects of your worldview.", | |
| "Traditional communities have {word}ed as part of seasonal rituals for countless generations.", | |
| "The longitudinal study tracked participants who {word} regularly, finding significant long-term health benefits." | |
| ] | |
| }, | |
| # ADJECTIVE TEMPLATES - For descriptive words | |
| "adjective": { | |
| "basic": [ | |
| "The sky is {word} today.", | |
| "She looks very {word}.", | |
| "That is a {word} book.", | |
| "The food tastes {word}.", | |
| "I feel {word} this morning.", | |
| "The music sounds {word}.", | |
| "What a {word} day!", | |
| "The water is {word}.", | |
| "His house is very {word}.", | |
| "The flowers smell {word}." | |
| ], | |
| "intermediate": [ | |
| "The critics described the film as surprisingly {word} despite its low budget.", | |
| "After the renovation, the room feels much more {word} and welcoming.", | |
| "The chef is known for creating {word} dishes that combine unexpected flavors.", | |
| "The {word} atmosphere of the café makes it perfect for quiet conversation.", | |
| "Her writing style is refreshingly {word} compared to other authors in the genre.", | |
| "The landscape becomes increasingly {word} as you travel further north.", | |
| "We were impressed by the {word} performance of the young musician.", | |
| "The weather turned unexpectedly {word} during our vacation.", | |
| "She chose a more {word} approach to solving the complex problem.", | |
| "The {word} quality of the light at sunset inspired many of his paintings." | |
| ], | |
| "advanced": [ | |
| "The architectural design achieves a harmonious balance between {word} elements and practical functionality.", | |
| "The region's cuisine is characterized by {word} flavors that reflect its unique cultural heritage and local ingredients.", | |
| "Critics have noted the increasingly {word} tone of the author's work as it evolved over decades.", | |
| "The exhibition juxtaposes {word} contemporary pieces with classical works to create thought-provoking contrasts.", | |
| "Researchers documented the {word} conditions that contribute to this rare ecological phenomenon.", | |
| "The performance was notable for its {word} interpretation of the traditional composition.", | |
| "The memoir reveals the {word} complexity of relationships formed during periods of historical upheaval.", | |
| "Urban planners aim to create more {word} community spaces that encourage diverse interactions.", | |
| "The documentary captures the {word} beauty of remote landscapes rarely witnessed by human eyes.", | |
| "Medical researchers have identified several {word} biomarkers associated with early stages of the condition." | |
| ] | |
| }, | |
| # GENERAL TEMPLATES - Fallback for everything else | |
| "general": { | |
| "basic": [ | |
| "Let's talk about {word}.", | |
| "I'm interested in {word}.", | |
| "Do you know about {word}?", | |
| "{word} is important.", | |
| "I learned about {word} yesterday.", | |
| "She mentioned {word}.", | |
| "They're studying {word}.", | |
| "What do you think about {word}?", | |
| "{word} has changed over time.", | |
| "The book explains {word}." | |
| ], | |
| "intermediate": [ | |
| "We discussed the implications of {word} during yesterday's meeting.", | |
| "The article explores different perspectives on {word} in modern society.", | |
| "She's been researching {word} for her upcoming paper.", | |
| "Recent developments in {word} have changed our understanding of the field.", | |
| "The podcast featured experts discussing the future of {word}.", | |
| "Understanding {word} requires knowledge of several related concepts.", | |
| "The course offers an introduction to the basics of {word}.", | |
| "There are various approaches to addressing issues related to {word}.", | |
| "The conference will focus on recent advances in {word}.", | |
| "They published a comprehensive study about {word} last year." | |
| ], | |
| "advanced": [ | |
| "The interdisciplinary approach to {word} reveals connections that weren't apparent within traditional academic frameworks.", | |
| "Historical perspectives on {word} provide valuable context for understanding contemporary challenges in the field.", | |
| "The symposium brought together experts from diverse backgrounds to address emerging questions about {word}.", | |
| "Technological innovations have fundamentally transformed how researchers approach the study of {word}.", | |
| "Cultural attitudes toward {word} vary significantly across different societies and historical periods.", | |
| "The foundation funds projects that explore ethical implications of {word} in various contexts.", | |
| "Policymakers must consider multiple stakeholder perspectives when developing regulations related to {word}.", | |
| "The textbook presents a comprehensive framework for analyzing {word} across different scenarios.", | |
| "Ongoing debates about {word} reflect deeper philosophical questions about our societal values.", | |
| "The documentary examines how public understanding of {word} has evolved over the past century." | |
| ] | |
| } | |
| } | |
| # Common words in each category | |
| self.category_words = { | |
| "person": [ | |
| "person", "man", "woman", "boy", "girl", "child", "teacher", "doctor", | |
| "student", "friend", "neighbor", "parent", "employee", "worker", "artist", | |
| "musician", "writer", "chef", "athlete", "scientist", "engineer", "nurse" | |
| ], | |
| "animal": [ | |
| "dog", "cat", "bird", "fish", "horse", "cow", "elephant", "lion", | |
| "tiger", "bear", "rabbit", "monkey", "mouse", "frog", "snake", "wolf", | |
| "fox", "deer", "giraffe", "zebra", "penguin", "eagle", "owl", "turtle" | |
| ], | |
| "clothing": [ | |
| "shirt", "pants", "dress", "jacket", "coat", "hat", "gloves", "socks", | |
| "shoes", "boots", "sweater", "skirt", "jeans", "top", "scarf", "tie", | |
| "blouse", "suit", "belt", "vest", "hoodie", "shorts", "pajamas", "uniform" | |
| ], | |
| "uncountable_clothing": [ | |
| "clothing", "outerwear", "underwear", "sportswear", "footwear", "swimwear", | |
| "knitwear", "loungewear", "sleepwear", "activewear", "winterwear", "beachwear" | |
| ], | |
| "eyewear": [ | |
| "glasses", "sunglasses", "contacts", "goggles", "spectacles", "eyeglasses", | |
| "shades", "reading glasses", "bifocals", "prescription glasses" | |
| ], | |
| "jewelry": [ | |
| "necklace", "ring", "bracelet", "earrings", "watch", "pendant", | |
| "brooch", "pin", "chain", "locket", "anklet", "cufflinks", "tiara", | |
| "crown", "medallion", "choker", "bangle", "charm bracelet" | |
| ], | |
| "tools": [ | |
| "scissors", "knife", "hammer", "screwdriver", "wrench", "pliers", | |
| "saw", "drill", "tape measure", "level", "chisel", "clamp", "ruler", | |
| "axe", "shovel", "rake", "trowel", "sander", "nail gun", "paintbrush" | |
| ], | |
| "toys": [ | |
| "teddy bear", "doll", "ball", "blocks", "action figure", "puzzle", | |
| "toy car", "stuffed animal", "plush toy", "game", "toy", "robot", | |
| "kite", "yo-yo", "train set", "board game", "video game", "rattle", | |
| "building set", "puppet", "play set", "model kit" | |
| ] | |
| } | |
| # Words that are typically used in plural form | |
| self.plural_words = [ | |
| "glasses", "pants", "shorts", "jeans", "scissors", "trousers", "sunglasses", | |
| "goggles", "spectacles", "eyeglasses", "headphones", "tights", "leggings", | |
| "pliers", "binoculars", "tweezers", "pajamas", "shorts", "overalls", "trunks", | |
| "boxers", "briefs", "clippers", "shears", "earrings", "earbuds", "headphones" | |
| ] | |
| # Special cases that need specific handling | |
| self.special_cases = { | |
| "top": "clothing", | |
| "glasses": "eyewear", | |
| "teddy bear": "toys", | |
| "teddy": "toys", | |
| "clothing": "uncountable_clothing", | |
| "bear": "animal", | |
| "watch": "jewelry" | |
| } | |
| # Initialize the history of used templates | |
| self.template_history = {} | |
| def get_example_sentence(self, word, target_language, category=None): | |
| """Get an example sentence for a word using the enhanced algorithm.""" | |
| try: | |
| # Normalize word | |
| original_word = word | |
| word = word.strip().lower() | |
| if self.debug: | |
| print(f"\n>>> Getting example for: '{word}' <<<\n") | |
| # Try to get example from API with filter pipeline | |
| examples = self._get_api_examples_with_pipeline(word, category) | |
| # If we have valid examples, choose one randomly and return | |
| if examples: | |
| example = self._select_diverse_example(examples, word) | |
| if self.debug: | |
| print(f">>> Selected API example: '{example}'") | |
| # Clean up the example | |
| example = self._clean_sentence(example) | |
| # Translate | |
| translated = self._translate(example, target_language) | |
| return { | |
| "english": example, | |
| "translated": translated, | |
| "source": "filtered_api" | |
| } | |
| # If no valid API examples, use templates with complex selection | |
| if self.debug: | |
| print(f">>> No valid API examples found, using enhanced templates") | |
| # Use category if provided, otherwise determine category | |
| word_category = category if category else self._get_word_category(word) | |
| if self.debug: | |
| print(f">>> Word category: {word_category}") | |
| # Get appropriate templates and select a diverse one | |
| template, complexity = self._select_diverse_template(word, word_category) | |
| # Create example from template with appropriate handling | |
| example = self._create_example_from_template(template, word, word_category) | |
| # Translate the example | |
| translated = self._translate(example, target_language) | |
| return { | |
| "english": example, | |
| "translated": translated, | |
| "source": f"template_{word_category}_{complexity}" | |
| } | |
| except Exception as e: | |
| if self.debug: | |
| print(f">>> Error: {e}") | |
| # Ultimate fallback | |
| fallback = f"This is a {word}." | |
| return { | |
| "english": fallback, | |
| "translated": self._translate(fallback, target_language), | |
| "source": "error_fallback" | |
| } | |
| def _get_api_examples_with_pipeline(self, word, category=None): | |
| """Get examples from APIs and run them through the enhanced filter pipeline.""" | |
| # Get raw examples from all API sources | |
| raw_examples = [] | |
| # Try Free Dictionary API | |
| dict_examples = self._get_free_dictionary_examples(word) | |
| if dict_examples: | |
| raw_examples.extend(dict_examples) | |
| # Try Wordnik API | |
| wordnik_examples = self._get_wordnik_examples(word) | |
| if wordnik_examples: | |
| raw_examples.extend(wordnik_examples) | |
| if not raw_examples: | |
| if self.debug: | |
| print(">>> No examples found from APIs") | |
| return [] | |
| # Apply enhanced filter pipeline to raw examples | |
| filtered_examples = [] | |
| for example in raw_examples: | |
| # Run through all filters | |
| if self._enhanced_filter_pipeline(example, word, category): | |
| filtered_examples.append(example) | |
| return filtered_examples | |
| def _enhanced_filter_pipeline(self, example, word, category=None): | |
| """ | |
| Enhanced filter pipeline with improved context awareness. | |
| Returns True if the example passes all filters, False otherwise. | |
| """ | |
| # Filter 1: Basic quality check | |
| if not self._basic_quality_check(example): | |
| if self.debug: | |
| print(f">>> Rejected (Basic quality): '{example}'") | |
| return False | |
| # Filter 2: Exact word match | |
| if not self._contains_exact_word(example, word): | |
| if self.debug: | |
| print(f">>> Rejected (No exact word match): '{example}'") | |
| return False | |
| # Filter 3: Compound word check | |
| if self._contains_compound_words(example, word): | |
| if self.debug: | |
| print(f">>> Rejected (Contains compound word): '{example}'") | |
| return False | |
| # Filter 4: Variant form check | |
| if self._contains_variant_forms(example, word): | |
| if self.debug: | |
| print(f">>> Rejected (Contains variant form): '{example}'") | |
| return False | |
| # Filter 5: Context appropriateness check based on category | |
| identified_category = category if category else self._get_word_category(word) | |
| if not self._check_advanced_context(example, word, identified_category): | |
| if self.debug: | |
| print(f">>> Rejected (Inappropriate context for {identified_category}): '{example}'") | |
| return False | |
| # Filter 6: Complexity and educational value check | |
| if not self._check_complexity_value(example, word): | |
| if self.debug: | |
| print(f">>> Rejected (Not suitable complexity/value): '{example}'") | |
| return False | |
| # All filters passed | |
| if self.debug: | |
| print(f">>> Accepted: '{example}'") | |
| return True | |
| def _basic_quality_check(self, text): | |
| """Check if a sentence meets basic quality standards.""" | |
| # Must be a reasonable length | |
| words = text.split() | |
| if len(words) < 3 or len(words) > 25: | |
| return False | |
| # Shouldn't contain semicolons (often indicates a list, not a sentence) | |
| if ';' in text: | |
| return False | |
| # Shouldn't be metadata | |
| if "example of" in text.lower() or "examples of" in text.lower() or "example:" in text.lower(): | |
| return False | |
| # Check if it has a proper end punctuation | |
| if not text.strip().endswith(('.', '!', '?')): | |
| return False | |
| # Shouldn't contain inappropriate language | |
| inappropriate_terms = ["kill", "die", "death", "murder", "suicide", "sex", "porn", "explicit", "violent"] | |
| if any(term in text.lower() for term in inappropriate_terms): | |
| return False | |
| return True | |
| def _contains_exact_word(self, text, word): | |
| """Check if text contains the exact word with proper word boundaries.""" | |
| pattern = r'\b' + re.escape(word) + r'\b' | |
| return re.search(pattern, text.lower()) is not None | |
| def _contains_compound_words(self, text, word): | |
| """Check if text contains compound words that include the target word.""" | |
| # Skip for very short words (2 chars or less) to avoid too many false positives | |
| if len(word) <= 2: | |
| return False | |
| # Find all words in the text | |
| all_words = re.findall(r'\b\w+\b', text.lower()) | |
| for text_word in all_words: | |
| # Skip exact match | |
| if text_word == word: | |
| continue | |
| # Check if the word is part of a longer word | |
| if word in text_word: | |
| # Check for special cases where it's ok | |
| if word == "glass" and text_word == "glasses" and re.search(r'\b(eye|read|see|vision)', text.lower()): | |
| continue | |
| # It's a compound word | |
| return True | |
| return False | |
| def _contains_variant_forms(self, text, word): | |
| """Check if text contains variant forms of the word.""" | |
| # Common variant forms for different word types | |
| variants = set() | |
| # Plural forms (for nouns) | |
| if word.endswith('s'): | |
| # If word ends with 's', consider singular form as variant | |
| singular = word[:-1] | |
| if len(singular) > 2: # Only add if meaningful | |
| variants.add(singular) | |
| else: | |
| # Add potential plural forms | |
| variants.add(word + "s") | |
| if word.endswith('y'): | |
| variants.add(word[:-1] + "ies") | |
| elif word.endswith(('ch', 'sh', 'x', 'z', 's')): | |
| variants.add(word + "es") | |
| # Verb forms | |
| variants.add(word + "ing") | |
| variants.add(word + "ed") | |
| if word.endswith('e'): | |
| variants.add(word[:-1] + "ing") | |
| variants.add(word + "d") | |
| elif word.endswith(('y')): | |
| variants.add(word[:-1] + "ied") | |
| elif len(word) > 3 and word[-1] not in 'aeiou' and word[-2] in 'aeiou' and word[-3] not in 'aeiou': | |
| variants.add(word + word[-1] + "ing") | |
| variants.add(word + word[-1] + "ed") | |
| # Adjective forms | |
| variants.add(word + "er") | |
| variants.add(word + "est") | |
| if word.endswith('e'): | |
| variants.add(word + "r") | |
| variants.add(word + "st") | |
| elif word.endswith('y'): | |
| variants.add(word[:-1] + "ier") | |
| variants.add(word[:-1] + "iest") | |
| elif len(word) > 3 and word[-1] not in 'aeiou' and word[-2] in 'aeiou' and word[-3] not in 'aeiou': | |
| variants.add(word + word[-1] + "er") | |
| variants.add(word + word[-1] + "est") | |
| # Special case handling for certain words | |
| if word == "bear": | |
| variants.update(["bore", "bearing", "bearable", "unbearable"]) | |
| elif word == "glasses": | |
| variants.update(["glass", "eyeglass", "fiberglass", "fibreglass"]) | |
| elif word == "glass": | |
| variants.update(["glasses", "fiberglass", "fibreglass"]) | |
| elif word == "top": | |
| variants.update(["topping", "topped", "topmost"]) | |
| # Check for special case exceptions | |
| if word == "glasses" and "eyeglasses" in text.lower(): | |
| return False | |
| # Check if text contains any variants | |
| for variant in variants: | |
| if len(variant) <= 2: | |
| continue # Skip very short variants | |
| if self._contains_exact_word(text, variant): | |
| if self.debug: | |
| print(f">>> Found variant form: '{variant}'") | |
| return True | |
| return False | |
| def _check_advanced_context(self, text, word, category): | |
| """Enhanced context check that considers word category and typical usage patterns.""" | |
| text_lower = text.lower() | |
| # Special case for "bear" and other animals | |
| if word == "bear" or category == "animal" and word == "bear": | |
| # Check for animal context | |
| animal_contexts = ["zoo", "animal", "wild", "fur", "cub", "paw", "den", "forest", | |
| "grizzly", "polar", "pet", "wildlife", "nature", "animals"] | |
| verb_contexts = ["burden", "weight", "load", "responsibility", "stand", "support", | |
| "carry", "bore", "market", "stock", "bear with", "bear in mind"] | |
| academic_contexts = ["research", "scientific", "theory", "journal", "symposium", | |
| "academia", "philosophical", "evolution", "publication", "dissertation"] | |
| has_animal_context = any(context in text_lower for context in animal_contexts) | |
| has_verb_context = any(context in text_lower for context in verb_contexts) | |
| has_academic_context = any(context in text_lower for context in academic_contexts) | |
| # Prefer animal context, reject verb context and academic contexts | |
| return has_animal_context and not has_verb_context and not has_academic_context | |
| # Special case for teddy bear - ensure child-friendly context | |
| elif "teddy" in word or word == "teddy bear": | |
| child_contexts = ["child", "play", "toy", "soft", "cuddly", "sleep", "bed", "hug", | |
| "stuffed", "plush", "gift", "favorite", "baby", "kid", "comfort"] | |
| academic_contexts = ["research", "academic", "philosophical", "theory", "values", | |
| "societal", "education", "cognitive", "development", "scholarly"] | |
| has_child_context = any(context in text_lower for context in child_contexts) | |
| has_academic_context = any(context in text_lower for context in academic_contexts) | |
| # Strongly prefer child context for teddy bears, reject academic contexts | |
| return has_child_context and not has_academic_context | |
| # Special case for "top" (clothing vs. position) | |
| elif word == "top" or category == "clothing" and word == "top": | |
| # Check for clothing context | |
| clothing_contexts = ["wear", "shirt", "outfit", "fashion", "dress", "color", "colour", | |
| "style", "clothes", "wardrobe", "buy", "bought", "new", "fabric", | |
| "cotton", "silk", "button", "sleeve", "collar", "blouse"] | |
| position_contexts = ["mountain", "hill", "climb", "reached", "leadership", "ranked", | |
| "ceiling", "position", "over", "above", "surface", "highest", | |
| "best", "leading", "foremost", "premier", "superior", "chief"] | |
| has_clothing_context = any(context in text_lower for context in clothing_contexts) | |
| has_position_context = any(context in text_lower for context in position_contexts) | |
| # For "top", strongly prefer clothing context for a language learning app | |
| return has_clothing_context and not has_position_context | |
| # For person words, check that context is not objectifying or inappropriate | |
| elif category == "person": | |
| objectifying_contexts = ["use", "using", "used", "utilize", "buy", "bought", "sell", | |
| "sold", "cost", "price", "cheap", "expensive", "owned"] | |
| # Check proximity of objectifying words to the person word | |
| for context in objectifying_contexts: | |
| if context in text_lower: | |
| # Check if the objectifying word is close to the person word | |
| context_index = text_lower.find(context) | |
| word_index = text_lower.find(word) | |
| if abs(context_index - word_index) < 15: # Within ~3-4 words | |
| return False | |
| # Special case for tools | |
| elif category == "tools" and word == "scissors": | |
| wrong_contexts = ["executed", "perfect", "jump", "kick", "position", "technique", "sports"] | |
| tool_contexts = ["cut", "cutting", "paper", "fabric", "hair", "sharp", "blade", "trim"] | |
| has_wrong_context = any(context in text_lower for context in wrong_contexts) | |
| has_tool_context = any(context in text_lower for context in tool_contexts) | |
| return has_tool_context or not has_wrong_context | |
| # Special case for eyewear "glasses" | |
| elif category == "eyewear": | |
| # Check if it has eyewear context | |
| eyewear_contexts = ["see", "vision", "read", "eye", "wear", "sight", "prescription", | |
| "lens", "optician", "frame", "vision", "optometrist", "sunglasses"] | |
| wrong_contexts = ["fill", "empty", "drink", "beverage", "water", "wine", "window", | |
| "fiber", "fibre", "cup", "mug", "liquid", "pour"] | |
| # Must have at least one eyewear context word or phrase | |
| has_eyewear_context = any(context in text_lower for context in eyewear_contexts) | |
| # Must not have conflicting contexts | |
| has_wrong_context = any(context in text_lower for context in wrong_contexts) | |
| return has_eyewear_context or not has_wrong_context | |
| # Special case for jewelry | |
| elif category == "jewelry": | |
| jewelry_contexts = ["wear", "gold", "silver", "diamond", "gem", "stone", "gift", | |
| "beautiful", "elegant", "accessory", "decorated", "adorned"] | |
| has_jewelry_context = any(context in text_lower for context in jewelry_contexts) | |
| return has_jewelry_context | |
| # Clothing checks | |
| elif category in ["clothing", "uncountable_clothing"]: | |
| clothing_contexts = ["wear", "fashion", "style", "outfit", "dressed", "clothes", | |
| "wardrobe", "fabric", "color", "comfortable", "fit", "size"] | |
| has_clothing_context = any(context in text_lower for context in clothing_contexts) | |
| return has_clothing_context | |
| # For most words, more relaxed context check | |
| return True | |
| def _check_complexity_value(self, text, word): | |
| """Check if the example has appropriate complexity and educational value.""" | |
| # Count words for basic complexity check | |
| word_count = len(text.split()) | |
| # Very short examples may not provide enough context | |
| if word_count < 5: | |
| return False | |
| # Very long examples might be too complex for beginners | |
| if word_count > 20: | |
| return False | |
| # Check for overly complex words that might be difficult for language learners | |
| complex_words = 0 | |
| for w in text.split(): | |
| w = w.lower().strip('.,!?":;()') | |
| if len(w) > 8 and w != word.lower(): # Don't count the target word as complex | |
| complex_words += 1 | |
| # If more than 20% of words are complex, maybe too difficult | |
| if complex_words / word_count > 0.2: | |
| return False | |
| # Prefer examples where the target word appears near the beginning or middle | |
| # for better context understanding | |
| word_position = text.lower().find(word.lower()) | |
| if word_position > len(text) * 0.7: # If word appears only near the end | |
| return False | |
| return True | |
| def _get_word_category(self, word): | |
| """Determine the most appropriate category for a word with enhanced detection.""" | |
| # Check special cases first | |
| if word in self.special_cases: | |
| return self.special_cases[word] | |
| # Check predefined categories | |
| for category, words in self.category_words.items(): | |
| if word in words: | |
| return category | |
| # Handle compound words | |
| if "teddy bear" in word or "teddy" in word: | |
| return "toys" | |
| # Check word endings and patterns | |
| if word in self.plural_words: | |
| # Check specific types of plurals | |
| if word in ["scissors", "pliers", "clippers", "shears"]: | |
| return "tools" | |
| elif word in ["glasses", "sunglasses", "spectacles", "eyeglasses"]: | |
| return "eyewear" | |
| elif word in ["pants", "shorts", "jeans", "trousers", "tights", "leggings"]: | |
| return "clothing" | |
| else: | |
| return "noun" | |
| elif word.endswith('ing') and len(word) > 5: | |
| if word in ["clothing"]: | |
| return "uncountable_clothing" | |
| return "verb" | |
| elif word.endswith(('er', 'est')) and len(word) > 4: | |
| # Check if it's actually a comparative/superlative adjective | |
| # or a noun ending in 'er' (like "computer") | |
| if word.endswith('er') and word[:-2] + 'e' in self.category_words.get("verb", []): | |
| return "person" # Like "teacher" from "teach" | |
| return "adjective" | |
| # Default to noun for most words | |
| return "noun" | |
| def _select_diverse_example(self, examples, word): | |
| """Select a diverse example, avoiding recent patterns if possible.""" | |
| if not examples: | |
| return None | |
| # If only one example, return it | |
| if len(examples) == 1: | |
| return examples[0] | |
| # Analyze examples for diversity factors | |
| analyzed_examples = [] | |
| for example in examples: | |
| # Calculate distance from word to beginning | |
| word_pos = example.lower().find(word.lower()) | |
| total_length = len(example) | |
| position_ratio = word_pos / total_length if total_length > 0 else 0 | |
| # Count sentence complexity (length, word variety) | |
| words = example.split() | |
| sentence_length = len(words) | |
| unique_words = len(set([w.lower() for w in words])) | |
| word_variety = unique_words / sentence_length if sentence_length > 0 else 0 | |
| # Detect sentence structure | |
| has_question = example.endswith('?') | |
| has_dialogue = '"' in example or "'" in example and "said" in example.lower() | |
| has_conjunction = any(conj in example.lower() for conj in [" and ", " but ", " or ", " because ", " however "]) | |
| # Create a feature vector for this example | |
| features = { | |
| "position_ratio": position_ratio, | |
| "sentence_length": sentence_length, | |
| "word_variety": word_variety, | |
| "has_question": has_question, | |
| "has_dialogue": has_dialogue, | |
| "has_conjunction": has_conjunction | |
| } | |
| analyzed_examples.append((example, features)) | |
| # Get previously used patterns if available | |
| prev_patterns = self.recent_templates.get(word, []) | |
| # Score examples based on diversity from previous patterns | |
| scored_examples = [] | |
| for example, features in analyzed_examples: | |
| # Start with base score | |
| score = 10 | |
| # Prefer moderate length sentences (not too short, not too long) | |
| length_score = 0 | |
| if 7 <= features["sentence_length"] <= 15: | |
| length_score = 5 | |
| elif 5 <= features["sentence_length"] < 7 or 15 < features["sentence_length"] <= 20: | |
| length_score = 3 | |
| score += length_score | |
| # Prefer good word variety | |
| if features["word_variety"] > 0.8: | |
| score += 3 | |
| elif features["word_variety"] > 0.6: | |
| score += 2 | |
| # Slight bonus for different sentence structures | |
| if features["has_question"]: | |
| score += 1 | |
| if features["has_dialogue"]: | |
| score += 1 | |
| if features["has_conjunction"]: | |
| score += 2 | |
| # Major bonus for differing from recent patterns | |
| for prev_pattern in prev_patterns: | |
| # Compare this example to previous patterns | |
| pattern_similarity = 0 | |
| # Position similarity | |
| if abs(features["position_ratio"] - prev_pattern.get("position_ratio", 0)) < 0.2: | |
| pattern_similarity += 1 | |
| # Length similarity | |
| if abs(features["sentence_length"] - prev_pattern.get("sentence_length", 0)) < 3: | |
| pattern_similarity += 1 | |
| # Structure similarity | |
| if features["has_question"] == prev_pattern.get("has_question", False): | |
| pattern_similarity += 1 | |
| if features["has_dialogue"] == prev_pattern.get("has_dialogue", False): | |
| pattern_similarity += 1 | |
| if features["has_conjunction"] == prev_pattern.get("has_conjunction", False): | |
| pattern_similarity += 1 | |
| # Penalize similarity to recent patterns | |
| score -= pattern_similarity | |
| scored_examples.append((example, features, score)) | |
| # Sort by score (highest first) | |
| scored_examples.sort(key=lambda x: x[2], reverse=True) | |
| # Get the highest scored example | |
| best_example = scored_examples[0][0] | |
| best_features = scored_examples[0][1] | |
| # Update recent patterns | |
| if word not in self.recent_templates: | |
| self.recent_templates[word] = [] | |
| self.recent_templates[word].append(best_features) | |
| # Keep only the most recent patterns | |
| if len(self.recent_templates[word]) > self.max_recent_templates: | |
| self.recent_templates[word] = self.recent_templates[word][-self.max_recent_templates:] | |
| return best_example | |
| def _select_diverse_template(self, word, category): | |
| """Select a diverse template based on complexity and avoiding recent patterns.""" | |
| # Determine appropriate template category | |
| template_category = category | |
| # If no templates for this category, use general | |
| if template_category not in self.templates: | |
| template_category = "noun" if category in ["clothing", "tools", "jewelry", "eyewear"] else "general" | |
| # Get template subcategories for this type (basic, intermediate, advanced) | |
| if template_category in self.templates: | |
| subcats = list(self.templates[template_category].keys()) | |
| else: | |
| subcats = ["basic", "intermediate", "advanced"] | |
| # Adjust weights for specific categories to prefer simpler examples | |
| # For common everyday objects, animals and toys, prefer simpler examples | |
| if category in ["animal", "toys"] or word in ["bear", "teddy bear"]: | |
| # 60% basic, 30% intermediate, 10% advanced | |
| weights = [0.6, 0.3, 0.1] | |
| elif word in self.plural_words or len(word) <= 4: | |
| # For simple or plural words, prefer simpler examples | |
| # 60% basic, 30% intermediate, 10% advanced | |
| weights = [0.6, 0.3, 0.1] | |
| else: | |
| # Default weights: 50% basic, 30% intermediate, 20% advanced | |
| weights = [0.5, 0.3, 0.2] | |
| complexity = random.choices(subcats, weights=weights[:len(subcats)])[0] | |
| # Get templates for this category and complexity | |
| templates = self.templates.get(template_category, self.templates["general"]).get(complexity, self.templates["general"]["basic"]) | |
| # Initialize template history for this word if not exists | |
| word_key = f"{word}_{template_category}" | |
| if word_key not in self.template_history: | |
| self.template_history[word_key] = [] | |
| # Try to find a template that hasn't been used recently | |
| available_templates = [t for t in templates if t not in self.template_history[word_key]] | |
| # If all templates have been used, reset history | |
| if not available_templates: | |
| available_templates = templates | |
| self.template_history[word_key] = [] | |
| # Select a template | |
| template = random.choice(available_templates) | |
| # Update history | |
| self.template_history[word_key].append(template) | |
| if len(self.template_history[word_key]) > min(5, len(templates)): | |
| self.template_history[word_key] = self.template_history[word_key][-5:] | |
| return template, complexity | |
| def _create_example_from_template(self, template, word, category): | |
| """Create an example from a template with proper handling of word forms.""" | |
| # Special handling for plural words | |
| if word in self.plural_words: | |
| # Replace articles appropriately for plurals | |
| example = template.replace("a {word}", "{word}").replace("an {word}", "{word}") | |
| example = example.replace("the {word} is", "the {word} are") | |
| example = example.replace("This {word} is", "These {word} are") | |
| example = example.replace("this {word} is", "these {word} are") | |
| # Special handling for uncountable nouns | |
| elif category == "uncountable_clothing": | |
| # Remove articles for uncountable nouns | |
| example = template.replace("a {word}", "{word}").replace("an {word}", "{word}") | |
| # Regular handling for other words | |
| else: | |
| example = template | |
| # Insert word into template | |
| example = example.format(word=word) | |
| # Ensure first letter is capitalized | |
| if example and not example[0].isupper(): | |
| example = example[0].upper() + example[1:] | |
| # Ensure ending punctuation | |
| if example and not example[-1] in '.!?': | |
| example += '.' | |
| return example | |
| def _get_free_dictionary_examples(self, word): | |
| """Get all examples from Free Dictionary API.""" | |
| try: | |
| cache_path = os.path.join(self.cache_dir, f"freedict_{word}.json") | |
| # Try to load from cache first | |
| if os.path.exists(cache_path): | |
| with open(cache_path, 'r') as f: | |
| cached_data = json.load(f) | |
| if cached_data.get('examples'): | |
| return cached_data['examples'] | |
| # If not in cache, fetch from API | |
| url = f"https://api.dictionaryapi.dev/api/v2/entries/en/{word}" | |
| response = requests.get(url, timeout=5) | |
| if response.status_code != 200: | |
| return [] | |
| data = response.json() | |
| # Extract example sentences | |
| examples = [] | |
| if isinstance(data, list) and len(data) > 0: | |
| for meaning in data[0].get('meanings', []): | |
| for definition in meaning.get('definitions', []): | |
| if 'example' in definition and definition['example']: | |
| examples.append(definition['example']) | |
| # Cache results | |
| if examples: | |
| with open(cache_path, 'w') as f: | |
| json.dump({'examples': examples}, f) | |
| return examples | |
| except Exception as e: | |
| if self.debug: | |
| print(f">>> Free Dictionary API error: {e}") | |
| return [] | |
| def _get_wordnik_examples(self, word): | |
| """Get all examples from Wordnik API.""" | |
| try: | |
| cache_path = os.path.join(self.cache_dir, f"wordnik_{word}.json") | |
| # Try to load from cache first | |
| if os.path.exists(cache_path): | |
| with open(cache_path, 'r') as f: | |
| cached_data = json.load(f) | |
| if cached_data.get('examples'): | |
| return cached_data['examples'] | |
| # If not in cache, fetch from API | |
| # Note: This API might need an API key in practice | |
| url = f"https://api.wordnik.com/v4/word.json/{word}/examples" | |
| response = requests.get(url, timeout=5) | |
| if response.status_code != 200: | |
| return [] | |
| data = response.json() | |
| examples = [] | |
| for example in data.get('examples', []): | |
| if 'text' in example and example['text']: | |
| examples.append(example['text']) | |
| # Cache results | |
| if examples: | |
| with open(cache_path, 'w') as f: | |
| json.dump({'examples': examples}, f) | |
| return examples | |
| except Exception as e: | |
| if self.debug: | |
| print(f">>> Wordnik API error: {e}") | |
| return [] | |
| def _clean_sentence(self, sentence): | |
| """Clean and format a sentence.""" | |
| # Remove quotes, extra spaces, etc. | |
| sentence = sentence.strip() | |
| sentence = re.sub(r'\s+', ' ', sentence) | |
| # Remove metadata markers | |
| sentence = re.sub(r'\[.*?\]', '', sentence) | |
| # Capitalize first letter | |
| if sentence and not sentence[0].isupper(): | |
| sentence = sentence[0].upper() + sentence[1:] | |
| # Ensure ending punctuation | |
| if sentence and not sentence[-1] in '.!?': | |
| sentence += '.' | |
| return sentence | |
| def _translate(self, text, target_language): | |
| """Translate text using the provided translation function.""" | |
| if self.translate_func: | |
| try: | |
| return self.translate_func(text, target_language) | |
| except Exception as e: | |
| if self.debug: | |
| print(f">>> Translation error: {e}") | |
| return "" | |
| else: | |
| return f"[Translation to {target_language}]" |