web / example_sentences.py
idildogaturkmen's picture
Upload 8 files
5f694cd verified
Raw
History Blame Contribute Delete
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}]"