Spaces:
Build error
Build error
import functools | |
import random | |
from typing import List, Optional | |
import requests | |
from gazpacho import Soup, get | |
from rhyme_with_ai.utils import find_last_word | |
def query_rhyme_words(sentence: str, n_rhymes: int, language:str="english") -> List[str]: | |
"""Returns a list of rhyme words for a sentence. | |
Parameters | |
---------- | |
sentence : Sentence that may end with punctuation | |
n_rhymes : Maximum number of rhymes to return | |
Returns | |
------- | |
List[str] -- List of words that rhyme with the final word | |
""" | |
last_word = find_last_word(sentence) | |
if language == "english": | |
return query_datamuse_api(last_word, n_rhymes) | |
elif language == "dutch": | |
return mick_rijmwoordenboek(last_word, n_rhymes) | |
else: | |
raise NotImplementedError(f"Unsupported language ({language}) expected 'english' or 'dutch'.") | |
def query_datamuse_api(word: str, n_rhymes: Optional[int] = None) -> List[str]: | |
"""Query the DataMuse API. | |
Parameters | |
---------- | |
word : Word to rhyme with | |
n_rhymes : Max rhymes to return | |
Returns | |
------- | |
Rhyme words | |
""" | |
out = requests.get( | |
"https://api.datamuse.com/words", params={"rel_rhy": word} | |
).json() | |
words = [_["word"] for _ in out] | |
if n_rhymes is None: | |
return words | |
return words[:n_rhymes] | |
def mick_rijmwoordenboek(word: str, n_words: int): | |
url = f"https://rijmwoordenboek.nl/rijm/{word}" | |
html = get(url) | |
soup = Soup(html) | |
results = soup.find("div", {"id": "rhymeResultsWords"}).html.split("<br />") | |
# clean up | |
results = [r.replace("\n", "").replace(" ", "") for r in results] | |
# filter html and empty strings | |
results = [r for r in results if ("<" not in r) and (len(r) > 0)] | |
return random.sample(results, min(len(results), n_words)) |