from bert_similarity import get_similarity from text_generator import get_gpt_response from textstat import flesch_reading_ease def generate_user_prompt(prompt_type, base_text): prompts = { "too_simple": f""" Convert this text to a higher reading level of the original text. The higher reading level text should have more syllables per word and more words per sentence. It should retain the core meaning of the original text. Here is the text: {base_text} """, "too_complex": f""" Convert this text to a simpler version of the original text. The simpler versions of text have fewer syllables per word and fewer words per sentence. It should retain the core meaning of the original text. Here is the text: {base_text} """ } return prompts[prompt_type].format(base_text=base_text) def generate_similar_sentence(input_text, min_reading_level, max_reading_level, min_entailment, system_prompt, max_iter): i = 0 completed = False user_prompt = "" curr_reading_level = flesch_reading_ease(input_text) input_reading_level = flesch_reading_ease(input_text) curr_text = input_text response = None similarity = 0 reading_level = 0 print(f"Current reading level is: {curr_reading_level}") if curr_reading_level > min_reading_level and curr_reading_level < max_reading_level: return input_text, 1, curr_reading_level, input_reading_level, "Input text was already within the target reading level!" else: while i < max_iter and not completed: if curr_reading_level > max_reading_level: print(f"Too simple, current reading level is {curr_reading_level}") user_prompt = generate_user_prompt("too_simple", curr_text) elif curr_reading_level < min_reading_level: print(f"Too complex, current reading level is {curr_reading_level}") user_prompt = generate_user_prompt("too_complex", curr_text) elif similarity < min_entailment: print(f"Entailment level is too low: {similarity}") user_prompt = f"Can you convert this text '{input_text}' to a grade level more similar to this text '{curr_text}'" response = get_gpt_response(user_prompt, system_prompt) similarity = get_similarity(response, input_text) reading_level = flesch_reading_ease(response) if similarity >= min_entailment and min_reading_level <= reading_level <= max_reading_level: completed = True curr_text = response curr_reading_level = reading_level print(response) i += 1 if completed: return response, similarity, reading_level, input_reading_level, "Success! Please see the converted text at your target reading level." else: return response, similarity, reading_level, input_reading_level, "Failed. We could not reach the target reading level while maintaining the text meaning."