gen-question / src /services /AI /sentence_generator.py
PhamHelga's picture
gen question type incorrect word, antonym, synonym, stress
342fe87
from .base import Model
from typing import List
import random
class SentenceGeneratorModel(Model):
"""
A wrapper around the base Model class to generate English sentences
that include given vocabulary words.
"""
_instance = None
def __new__(cls, model_name: str = "google/flan-t5-base"):
if cls._instance is None:
cls._instance = super(SentenceGeneratorModel, cls).__new__(cls)
cls._instance._initialized = False
return cls._instance
def __init__(self, model_name: str = "google/flan-t5-base"):
if self._initialized:
return
super().__init__(model_name)
self._initialized = True
def generate_sentence_from_words(
self,
vocab_list: List[str],
min_words: int = 2,
max_words: int = 5,
model_max_length: int = 64,
token_max_length: int = 64
) -> str:
"""
Generate a sentence that uses the given vocabulary words.
Args:
vocab_list (List[str]): The list of available vocabulary words.
min_words (int): Minimum number of words to include in sentence.
max_words (int): Maximum number of words to include.
model_max_length (int): Max length of generated sentence.
token_max_length (int): Max length for tokenization.
Returns:
str: A generated sentence using selected words.
"""
if not vocab_list:
raise ValueError("vocab_list cannot be empty.")
selected_words = random.sample(
vocab_list, k=min(len(vocab_list), random.randint(min_words, max_words))
)
prompt = f"Write an English sentence using the following words: {', '.join(selected_words)}."
sentence = self.inference(
model_max_length=model_max_length,
token_max_length=token_max_length,
task=prompt
)
return sentence