patruff's picture
Upload tool
2279511 verified
raw
history blame
3.3 kB
from smolagents.tools import Tool
import json
import pronouncing
class ParodyWordSuggestionTool(Tool):
name = "parody_word_suggester"
description = """Suggests phonetically similar funny words using CMU dictionary pronunciations.
Returns similar words from a curated list of funny words, along with their similarity scores."""
inputs = {'target': {'type': 'string', 'description': 'The word you want to find funny alternatives for'}, 'min_similarity': {'type': 'string', 'description': 'Minimum similarity threshold (0.0-1.0)', 'nullable': True}}
output_type = "string"
def __init__(self):
# Initialize with funny word list
self.funny_words = [
# Original words
"poop", "loop", "soup", "boop", "dupe", "goop",
"scoop", "whoop", "droop", "snoop", "coop",
"fart", "toot", "burp", "squish", "squash",
"wiggle", "jiggle", "wobble", "nincompoop", "dingleberry",
# Additional middle school humor words
"stinky", "booboo", "smelly", "goo", "turd", "pee", "peepee",
"potty", "butt", "tooty", "booger", "snot", "doody", "doodoo",
"weewee", "wedgie", "undies", "fartface", "poopyhead",
"butthead", "stinkbomb", "stinkface", "dork", "nerd",
"goober", "doofus", "dingus", "yahoo", "weirdo",
"stinkypants", "bubblebutt", "zonked", "zoop", "zoinks"
]
def forward(self, target: str, min_similarity: str = "0.7") -> str:
"""Get phonetically similar funny word suggestions."""
import pronouncing
import json
target = target.lower().strip()
min_similarity = float(min_similarity)
suggestions = []
# Get target pronunciation
target_phones = pronouncing.phones_for_word(target)
if not target_phones:
return json.dumps({
"error": f"'{target}' not found in CMU dictionary",
"suggestions": []
}, indent=2)
target_phones = target_phones[0].split()
# Check each funny word
for word in self.funny_words:
phones = pronouncing.phones_for_word(word)
if phones: # Only process if word is in dictionary
phones = phones[0].split()
# Calculate similarity using overlap
overlap = len(set(phones) & set(target_phones))
total = min(len(phones), len(target_phones))
similarity = overlap / total if total > 0 else 0.0
if similarity >= min_similarity:
suggestions.append({
"word": word,
"similarity": round(similarity, 3),
"syllables": pronouncing.syllable_count(phones)
})
# Sort by similarity score descending
suggestions.sort(key=lambda x: x["similarity"], reverse=True)
result = {
"target": target,
"target_syllables": pronouncing.syllable_count(target_phones),
"suggestions": suggestions
}
return json.dumps(result, indent=2)