| import json |
| import random |
| import time |
|
|
| import streamlit as st |
|
|
| from categories.accuracy import * |
| from categories.fluency import * |
| from categories.style import * |
| from modules.nav import Navbar |
|
|
| Navbar() |
|
|
|
|
| |
| def load_translations(): |
| try: |
| with open("./data/translations.json", "r") as f: |
| return json.loads(f.read()) |
| except Exception as e: |
| print(e) |
| return None |
|
|
|
|
| def score(score): |
| if score > 90: |
| return "excellent!" |
| elif score > 70: |
| return "good." |
| elif score > 50: |
| return "fair." |
| else: |
| return "poor." |
|
|
|
|
| if "translations" not in st.session_state: |
| st.session_state.translations = load_translations() |
|
|
|
|
| def response_generator(prompt): |
| source = st.session_state.german |
| acc = accuracy(source, prompt) |
| ppl = pseudo_perplexity(prompt) |
| gre = grammar_errors(prompt) |
| frm = formality(source, prompt) |
|
|
| total_score = ( |
| 0.5 * acc["score"] |
| + 0.2 * gre["score"] |
| + 0.3 * ppl["score"] |
| + 0.005 * frm["normalized"] |
| ) |
|
|
| if "scores" not in st.session_state: |
| st.session_state.scores = [] |
| st.session_state.scores.append(total_score) |
|
|
| response = f"Your translation quality was {score(total_score)}\n\n" |
|
|
| acc_s = acc["score"] |
| response += f"\nYour accuracy score is {score(acc_s)}\n" |
|
|
| for error in acc["errors"]: |
| response += f" - {error['message']}\n" |
|
|
| gre_s = gre["score"] |
| ppl_s = ppl["score"] |
| response += f"\nYour fluency score is {score(0.4 * gre_s + 0.6 * ppl_s)}\n" |
|
|
| for error in gre["errors"]: |
| response += f" - {error['message']}\n" |
|
|
| for error in ppl["errors"]: |
| response += f" - {error['message']}\n" |
|
|
| frm_s = frm["normalized"] |
| response += f"\nYour formality score is {score(frm_s)}\n" |
|
|
| if frm["src_label"] != frm["trg_label"]: |
| response += ( |
| f"\n - Tone mismatch: " |
| f"your translation is “{frm['trg_label']}”\n" |
| f"but likely should be “{frm['src_label']}”. " |
| ) |
|
|
| lines = response.split("\n") |
| for line in lines: |
| for word in line.split(): |
| yield word + " " |
| time.sleep(0.05) |
| |
| yield "\n" |
|
|
|
|
| def translation_generator(): |
| |
| if st.session_state.translations: |
| |
| st.session_state.german = random.choice(st.session_state.translations)["german"] |
| else: |
| st.error("No translations available.") |
| return |
|
|
| message = ( |
| f"Please translate the following sentence into English:" |
| f" {st.session_state.german}" |
| ) |
|
|
| lines = message.split("\n") |
| for line in lines: |
| for word in line.split(): |
| yield word + " " |
| time.sleep(0.05) |
| |
| yield "\n" |
|
|
|
|
| |
| if "messages" not in st.session_state: |
| st.session_state.messages = [ |
| { |
| "role": "assistant", |
| "content": ( |
| "Hello! I am a translation bot. Please translate the following" |
| " sentence into English: 'Das ist ein Test.'" |
| ), |
| } |
| ] |
| st.session_state.german = "Das ist ein Test." |
|
|
| if "translations" not in st.session_state: |
| try: |
| with open("translations.json", "r") as f: |
| st.session_state.translations = json.loads(f.read()) |
| print(st.session_state.translations) |
| except (FileNotFoundError, json.JSONDecodeError): |
| st.session_state.translations = None |
| |
| st.error( |
| "No previous translations found. Starting with an empty translation history." |
| ) |
|
|
| |
| for message in st.session_state.messages: |
| with st.chat_message(message["role"]): |
| st.markdown(message["content"]) |
|
|
| |
| if prompt := st.chat_input("What is up?"): |
| |
| st.session_state.messages.append({"role": "user", "content": prompt}) |
| |
| with st.chat_message("user"): |
| st.markdown(prompt) |
|
|
| |
| with st.chat_message("assistant"): |
| response = st.write_stream(response_generator(prompt)) |
|
|
| st.session_state.messages.append({"role": "assistant", "content": response}) |
|
|
| with st.chat_message("assistant"): |
| message = st.write_stream(translation_generator()) |
|
|
| st.session_state.messages.append({"role": "assistant", "content": message}) |
| |
|
|