|
import streamlit as st |
|
from streamlit_option_menu import option_menu |
|
from word2vec import * |
|
import pandas as pd |
|
from autocomplete import * |
|
from vector_graph import * |
|
from plots import * |
|
from lsj_dict import * |
|
import json |
|
from streamlit_tags import st_tags, st_tags_sidebar |
|
|
|
|
|
st.set_page_config(page_title="Ancient Greek Word2Vec", layout="centered") |
|
|
|
|
|
active_tab = option_menu(None, ["Nearest neighbours", "Cosine similarity", "3D graph", 'Dictionary'], |
|
menu_icon="cast", default_index=0, orientation="horizontal") |
|
|
|
|
|
lemma_dict = json.load(open('lsj_dict.json', 'r')) |
|
|
|
|
|
if active_tab == "Nearest neighbours": |
|
st.write("### TO DO: add description of function") |
|
col1, col2 = st.columns(2) |
|
|
|
|
|
compressed_word_list_filename = 'corpora/compass_filtered.pkl.gz' |
|
all_words = load_compressed_word_list(compressed_word_list_filename) |
|
|
|
with st.container(): |
|
with col1: |
|
word = st.multiselect("Enter a word", all_words, max_selections=1) |
|
if len(word) > 0: |
|
word = word[0] |
|
|
|
with col2: |
|
time_slice = st.selectbox("Time slice", ["Archaic", "Classical", "Hellenistic", "Early Roman", "Late Roman"]) |
|
|
|
models = st.multiselect( |
|
"Select models to search for neighbours", |
|
["Archaic", "Classical", "Hellenistic", "Early Roman", "Late Roman"] |
|
) |
|
n = st.slider("Number of neighbours", 1, 50, 15) |
|
|
|
nearest_neighbours_button = st.button("Find nearest neighbours") |
|
|
|
|
|
if nearest_neighbours_button: |
|
|
|
|
|
if time_slice == 'Hellenistic': |
|
time_slice = 'hellen' |
|
elif time_slice == 'Early Roman': |
|
time_slice = 'early_roman' |
|
elif time_slice == 'Late Roman': |
|
time_slice = 'late_roman' |
|
|
|
time_slice = time_slice.lower() + "_cbow" |
|
|
|
|
|
|
|
if validate_nearest_neighbours(word, time_slice, n, models) == False: |
|
st.error('Please fill in all fields') |
|
else: |
|
|
|
models = load_selected_models(models) |
|
|
|
nearest_neighbours = get_nearest_neighbours(word, time_slice, n, models) |
|
|
|
df = pd.DataFrame( |
|
nearest_neighbours, |
|
columns=["Word", "Time slice", "Similarity"], |
|
index = range(1, len(nearest_neighbours) + 1) |
|
) |
|
st.table(df) |
|
|
|
|
|
|
|
tmp_file = store_df_in_temp_file(df) |
|
|
|
|
|
with open(tmp_file, "rb") as file: |
|
file_byte = file.read() |
|
|
|
|
|
st.download_button( |
|
"Download results", |
|
data=file_byte, |
|
file_name = f'nearest_neighbours_{word}_{time_slice}.xlsx', |
|
mime='application/octet-stream' |
|
) |
|
|
|
|
|
|
|
|
|
elif active_tab == "Cosine similarity": |
|
col1, col2 = st.columns(2) |
|
col3, col4 = st.columns(2) |
|
with st.container(): |
|
with col1: |
|
word_1 = st.text_input("Enter a word", placeholder="πατήρ") |
|
|
|
with col2: |
|
time_slice_1 = st.selectbox("Time slice word 1", ["Archaic", "Classical", "Hellenistic", "Early Roman", "Late Roman"]) |
|
|
|
with st.container(): |
|
with col3: |
|
word_2 = st.text_input("Enter a word", placeholder="μήτηρ") |
|
|
|
with col4: |
|
time_slice_2 = st.selectbox("Time slice word 2", ["Archaic", "Classical", "Hellenistic", "Early Roman", "Late Roman"]) |
|
|
|
|
|
cosine_similarity_button = st.button("Calculate cosine similarity") |
|
|
|
|
|
if cosine_similarity_button: |
|
cosine_simularity_score = get_cosine_similarity(word_1, time_slice_1, word_2, time_slice_2) |
|
st.write(cosine_simularity_score) |
|
|
|
|
|
elif active_tab == "3D graph": |
|
col1, col2 = st.columns(2) |
|
|
|
|
|
compressed_word_list_filename = 'corpora/compass_filtered.pkl.gz' |
|
all_words = load_compressed_word_list(compressed_word_list_filename) |
|
|
|
with st.container(): |
|
with col1: |
|
word = st.multiselect("Enter a word", all_words, max_selections=1) |
|
if len(word) > 0: |
|
word = word[0] |
|
|
|
with col2: |
|
time_slice = st.selectbox("Time slice", ["Archaic", "Classical", "Hellenistic", "Early Roman", "Late Roman"]) |
|
|
|
n = st.slider("Number of words", 1, 50, 15) |
|
|
|
graph_button = st.button("Create 3D graph") |
|
|
|
if graph_button: |
|
time_slice_model = convert_time_name_to_model(time_slice) |
|
nearest_neighbours_vectors = get_nearest_neighbours_vectors(word, time_slice_model, n) |
|
|
|
st.dataframe(nearest_neighbours_vectors) |
|
|
|
|
|
|
|
|
|
fig, df = make_3d_plot4(nearest_neighbours_vectors, word, time_slice_model) |
|
|
|
st.dataframe(df) |
|
|
|
st.plotly_chart(fig) |
|
|
|
|
|
|
|
|
|
|
|
elif active_tab == "Dictionary": |
|
|
|
with st.container(): |
|
all_lemmas = load_compressed_word_list('all_lemmas.pkl.gz') |
|
|
|
|
|
|
|
query_tag = st_tags(label = 'Search a word in the LSJ dictionary', |
|
text = '', |
|
value = [], |
|
suggestions = all_lemmas, |
|
maxtags = 1, |
|
key = '1' |
|
) |
|
|
|
|
|
if query_tag: |
|
st.write(f"### {query_tag[0]}") |
|
|
|
|
|
if query_tag[0] in lemma_dict: |
|
data = lemma_dict[query_tag[0]] |
|
elif query_tag[0].capitalize() in lemma_dict: |
|
data = lemma_dict[query_tag[0].capitalize()] |
|
else: |
|
st.error("Word not found in dictionary") |
|
|
|
|
|
text = format_text(data) |
|
|
|
st.markdown(text) |
|
|
|
|
|
|
|
|
|
|
|
|