Spaces:
Configuration error
Configuration error
File size: 3,165 Bytes
d53b325 d33239b e53cc7e d53b325 aae0d96 d53b325 d33239b d53b325 c0a5ec1 d53b325 c0a5ec1 d53b325 aae0d96 c0a5ec1 d53b325 e53cc7e d53b325 c0a5ec1 d53b325 e53cc7e d53b325 e53cc7e d53b325 e53cc7e d53b325 c0a5ec1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
from smolagents.tools import Tool
import string
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'}, 'word_list_str': {'type': 'string', 'description': 'JSON string of word list (e.g. \'["word1", "word2"]\')'}, 'min_similarity': {'type': 'string', 'description': 'Minimum similarity threshold (0.0-1.0)', 'nullable': True}}
output_type = "string"
def forward(self, target: str, word_list_str: str, min_similarity: str = "0.7") -> str:
"""Get phonetically similar funny word suggestions."""
import pronouncing
import string
import json
target = target.lower().strip(string.punctuation)
min_similarity = float(min_similarity)
suggestions = []
# Parse JSON string to list
try:
words = json.loads(word_list_str)
except json.JSONDecodeError:
return json.dumps({
"error": "Invalid JSON string for word_list_str",
"suggestions": []
}, indent=2)
# 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] # Change: Don't split here
# Check each word
for word in words:
phones = pronouncing.phones_for_word(word)
if phones: # Only process if word is in dictionary
phones = phones[0] # Change: Don't split this either
# Calculate similarity using overlap (modifying to work with full phone strings)
overlap = len(set(phones.split()) & set(target_phones.split()))
total = min(len(phones.split()), len(target_phones.split()))
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) # This should work now as phones is a string
})
# 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)
def __init__(self, *args, **kwargs):
self.is_initialized = False
|