Spaces:
Sleeping
Sleeping
| import parser | |
| import requests | |
| import re | |
| def zephyr_score(sentence): | |
| prompt = f"""<|user|> | |
| You are an assistant helping with paper reviews. | |
| You will be tasked to classify sentences as 'J' or 'V' | |
| 'J' is positive or 'J' is encouraging. | |
| 'J' has a neutral tone or 'J' is professional. | |
| 'V' is overly blunt or 'V' contains excessive negativity and no constructive feedback. | |
| 'V' contains an accusatory tone or 'V' contains sweeping generalizations or 'V' contains personal attacks. | |
| Text: "{sentence}" | |
| Please classify this text as either 'J' or 'V'. Only output 'J' or 'V' with no additional explanation.<|endoftext|> | |
| <|assistant|> | |
| """ | |
| return prompt | |
| def zephyr_revise(sentence): | |
| prompt = f"""<|user|> | |
| You are an assistant that helps users revise Paper Reviews. | |
| Paper reviews exist to provide authors of academic research papers constructive critism. | |
| This is text found in a review. | |
| This text was classified as 'toxic': | |
| Text: "{sentence}" | |
| Please revise this text such that it maintains the criticism in the original text and delivers it in a friendly but professional manner. Make minimal changes to the original text.<|endoftext|> | |
| <|assistant|> | |
| """ | |
| return prompt | |
| def mistral_score(sentence): | |
| prompt = f"""<s>[INST] | |
| You are an assistant helping with paper reviews. | |
| You will be tasked to classify sentences as 'J' or 'V' | |
| 'J' is positive or 'J' is encouraging. | |
| 'J' has a neutral tone or 'J' is professional. | |
| 'V' is overly blunt or 'V' contains excessive negativity and no constructive feedback. | |
| 'V' contains an accusatory tone or 'V' contains sweeping generalizations or 'V' contains personal attacks. | |
| Text: "{sentence}" | |
| Please classify this text as either 'J' or 'V'. Only output 'J' or 'V' with no additional explanation. [/INST]""" | |
| return prompt | |
| def mistral_revise(sentence): | |
| prompt = f"""<s>[INST] | |
| You are an assistant that helps users revise Paper Reviews. | |
| Paper reviews exist to provide authors of academic research papers constructive critism. | |
| This is text found in a review. | |
| This text was classified as 'toxic': | |
| Text: "{sentence}" | |
| Please revise this text such that it maintains the criticism in the original text and delivers it in a friendly but professional manner. Make minimal changes to the original text. [/INST] Revised Text: """ | |
| return prompt | |
| def phi_score(sentence): | |
| prompt = f"""<|system|> | |
| You are an assistant helping with paper reviews. | |
| You will be tasked to classify sentences as 'J' or 'V' | |
| 'J' is positive or 'J' is encouraging. | |
| 'J' has a neutral tone or 'J' is not discouraging and not encouraging. | |
| 'V' is overly blunt or 'V' contains excessive negativity and no constructive feedback. | |
| 'V' contains an accusatory tone or 'V' contains sweeping generalizations or 'V' contains personal attacks.<|end|> | |
| <|user|> | |
| Text: "{sentence}" | |
| Please classify this text as either 'J' or 'V'. Only output 'J' or 'V' with no additional explanation.<|end|> | |
| <|assistant|> | |
| """ | |
| return prompt | |
| def phi_revise(sentence): | |
| prompt = f"""<|system|> | |
| You are an assistant that helps users revise Paper Reviews. | |
| Paper reviews exist to provide authors of academic research papers constructive critism.<|end|> | |
| <|user|> | |
| This is text found in a review. | |
| This text was classified as 'toxic' | |
| Text: "{sentence}" | |
| Please revise this text such that it maintains the criticism in the original text and delivers it in a friendly but professional manner. Make minimal changes to the original text.<|end|> | |
| <|assistant|> | |
| """ | |
| return prompt | |
| def query_model_score(sentence, api_key, model_id, prompt_fun): | |
| API_URL = f"https://api-inference.huggingface.co/models/{model_id}" | |
| headers = {"Authorization": f"Bearer {api_key}"} | |
| prompt = prompt_fun(sentence) | |
| def query(payload): | |
| response = requests.post(API_URL, headers=headers, json=payload) | |
| return response.json() | |
| parameters = {"max_new_tokens" : 5, "temperature": 0.1, "return_full_text": False} | |
| options = {"wait_for_model": True} | |
| data = query({"inputs": f"{prompt}", "parameters": parameters, "options": options}) | |
| score = data[0]['generated_text'] | |
| if 'v' in score.lower(): | |
| return 1 | |
| else: | |
| return 0 | |
| def query_model_revise(sentence, api_key, model_id, prompt_fun): | |
| API_URL = f"https://api-inference.huggingface.co/models/{model_id}" | |
| headers = {"Authorization": f"Bearer {api_key}"} | |
| prompt = prompt_fun(sentence) | |
| def query(payload): | |
| response = requests.post(API_URL, headers=headers, json=payload) | |
| return response.json() | |
| parameters = {"max_new_tokens" : 200, "temperature": 0.1, "return_full_text": False} | |
| options = {"wait_for_model": True} | |
| data = query({"inputs": f"{prompt}", "parameters": parameters, "options": options}) | |
| revision = data[0]['generated_text'] | |
| return revision | |
| def extract_quotes(text): | |
| pattern = r'"([^"]*)"' | |
| matches = re.findall(pattern, text) | |
| if matches: | |
| return ' '.join(matches) | |
| else: | |
| return text | |
| def revise_review(review, api_key, model_id, highlight_color): | |
| result = { | |
| "success": False, | |
| "data": { | |
| "revision": "", | |
| "score": "", | |
| "sentence_count": "", | |
| "revised_sentences": "" | |
| }, | |
| "message": "" | |
| } | |
| if 'zephyr' in model_id.lower(): | |
| revision_prompt = zephyr_revise | |
| score_prompt = zephyr_score | |
| elif 'mistral' in model_id.lower(): | |
| revision_prompt = mistral_revise | |
| score_prompt = mistral_score | |
| elif 'phi' in model_id.lower(): | |
| revision_prompt = phi_revise | |
| score_prompt = phi_score | |
| try: | |
| review = review.replace('"', "'") | |
| sentences = parser.parse_sentences(review) | |
| review_score = 0 | |
| revision_count = 0 | |
| review_revision = "" | |
| for sentence in sentences: | |
| if len(sentence) > 10: | |
| score = query_model_score(sentence, api_key, model_id, score_prompt) | |
| if score == 0: | |
| review_revision += " " + sentence | |
| else: | |
| review_score = 1 | |
| revision_count +=1 | |
| revision = query_model_revise(sentence, api_key, model_id, revision_prompt) | |
| revision = extract_quotes(revision) | |
| revision = revision.strip().strip('"') | |
| review_revision += f" <div style='background-color: {highlight_color}; display: inline;'>{revision}</div>" | |
| else: | |
| review_revision += " " + sentence | |
| # end revision/prepare return json | |
| result["success"] = True | |
| result["message"] = "Review successfully revised!" | |
| result["data"]["revision"] = review_revision | |
| result["data"]["score"] = review_score | |
| result["data"]["sentence_count"] = sum(1 for sentence in sentences if len(sentence) > 20) | |
| result["data"]["revised_sentences"] = revision_count | |
| except Exception as e: | |
| result["message"] = str(e) | |
| return result | |