hanifekaptan's picture
Rename src/app.py to app.py
94ed155 verified
import streamlit as st
import tensorflow as tf
import numpy as np
import pandas as pd
from transformers import AutoTokenizer
from src.cross_encoder_model import CrossEncoderTF
from src.mixed_cross_encoder_model import MixedDataCrossEncoderTF
MODEL_NAME = "dbmdz/bert-base-turkish-cased"
SAVED_CROSS_ENCODER_MODEL_PATH = "src/v2_cross_encoder.keras"
SAVED_MIXED_CROSS_ENCODER_MODEL_PATH = "src/v2_mixed_data_cross_encoder.keras"
MAX_TOKEN_LEN = 32
DATA_FILE_PATH = "src/model_0_data.csv"
TEXT_COLS = ['STRA', 'STRB']
LABEL_COL = 'DISTANCE'
EXCLUDE_COLS = TEXT_COLS + [LABEL_COL, 'FILLER']
NUMERICAL_FEATURE_DIM = 5132
CACHE_DIR = "./.cache"
@st.cache_data
def load_data():
try:
df = pd.read_csv(DATA_FILE_PATH, decimal=',', low_memory=False)
except FileNotFoundError:
st.error(f"Veri dosyası bulunamadı: {DATA_FILE_PATH}. Lütfen dosyanın uygulamanın çalıştığı dizinde olduğundan emin olun.")
st.stop()
return df
@st.cache_resource
def load_models_and_tokenizer():
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, cache_dir=CACHE_DIR)
cross_encoder_model = tf.keras.models.load_model(
SAVED_CROSS_ENCODER_MODEL_PATH,
custom_objects={'CrossEncoderTF': CrossEncoderTF}
)
mixed_cross_encoder_model = tf.keras.models.load_model(
SAVED_MIXED_CROSS_ENCODER_MODEL_PATH,
custom_objects={'MixedDataCrossEncoderTF': MixedDataCrossEncoderTF,
'numerical_feature_dim': NUMERICAL_FEATURE_DIM}
)
return tokenizer, cross_encoder_model, mixed_cross_encoder_model
try:
df_data = load_data()
numerical_feature_cols = df_data.columns.drop(EXCLUDE_COLS).tolist()
NUMERICAL_FEATURE_DIM = len(numerical_feature_cols)
tokenizer, cross_encoder_model, mixed_cross_encoder_model = load_models_and_tokenizer()
except Exception as e:
st.error(f"Yüklenirken bir hata oluştu: {e}")
st.stop()
def predict(model, tokenizer, str_a, str_b, numerical_features=None):
tokenized = tokenizer(
str_a, str_b,
max_length=MAX_TOKEN_LEN,
padding='max_length',
truncation=True,
return_tensors='np'
)
model_input = {
'input_ids': tokenized['input_ids'],
'attention_mask': tokenized['attention_mask'],
}
if numerical_features is not None:
model_input['numerical_features'] = numerical_features.reshape(1, -1).astype('float32')
prediction = model.predict(model_input)
score = prediction[0][0]
return float(score)
st.set_page_config(page_title="Varlık Benzerlik Testi", layout="centered")
st.title("İki Model Karşılaştırmalı Varlık Benzerlik Test Arayüzü")
st.info(
"Bu uygulama, metinsel verileri kullanarak iki varlığın "
"benzerlik olasılığını tahmin eder ve iki farklı modelin sonuçlarını karşılaştırır."
"(henüz bi-encoder mimarisi eklenmemiştir, sadece cross-encoder modeli kullanılıyor)"
"\n\n**Cross-encoder mimarisi:** yalnızca metin1, metin2 ve distance özellikleri ile eğitilmiştir."
"\n\n**Mixed-cross-encoder mimarisi:** metin1, metin2, distance ve numerik özellikler ile eğitilmiştir."
)
st.image("src/encoder_algorithm.png", caption="Encoder Algoritma Akışı", use_container_width=True)
st.header("Girdi String'leri")
stra_options = df_data['STRA'].unique()
str_a_input = st.selectbox("String A (STRA)", stra_options)
filtered_strb_options = df_data[df_data['STRA'] == str_a_input]['STRB'].unique()
str_b_input = st.selectbox("String B (STRB)", filtered_strb_options)
if st.button("Benzerliği Hesapla", type="primary"):
if not str_a_input or not str_b_input:
st.error("Lütfen her iki string alanını da seçin.")
else:
with st.spinner("Tahminler yapılıyor..."):
selected_row = df_data[(df_data['STRA'] == str_a_input) & (df_data['STRB'] == str_b_input)]
if not selected_row.empty:
numerical_features_for_prediction = selected_row[numerical_feature_cols].iloc[0].values
else:
st.error("Seçilen string'lere ait veri bulunamadı. Lütfen farklı seçimler yapın.")
st.stop()
cross_encoder_distance_score = predict(cross_encoder_model, tokenizer, str_a_input, str_b_input)
cross_encoder_similarity_score = 1 - cross_encoder_distance_score
mixed_cross_encoder_distance_score = predict(mixed_cross_encoder_model, tokenizer, str_a_input, str_b_input, numerical_features_for_prediction)
mixed_cross_encoder_similarity_score = 1 - mixed_cross_encoder_distance_score
actual_row = df_data[(df_data['STRA'] == str_a_input) & (df_data['STRB'] == str_b_input)]
if not actual_row.empty:
actual_distance = actual_row[LABEL_COL].iloc[0]
actual_similarity = 1 - actual_distance
else:
actual_distance = np.nan
actual_similarity = np.nan
st.subheader("Karşılaştırmalı Sonuçlar")
results_data = {
"Özellik": ["Tahmin Edilen Benzerlik", "Gerçek Benzerlik", "Tahmin Edilen Mesafe", "Gerçek Mesafe", "Karar"],
"Cross-Encoder Model": [
f"{cross_encoder_similarity_score:.4f}",
f"{actual_similarity:.4f}" if not np.isnan(actual_similarity) else "N/A",
f"{cross_encoder_distance_score:.4f}",
f"{actual_distance:.4f}" if not np.isnan(actual_distance) else "N/A",
"BENZER" if cross_encoder_similarity_score > 0.5 else "BENZER DEĞİL"
],
"Mixed Cross-Encoder Model": [
f"{mixed_cross_encoder_similarity_score:.4f}",
f"{actual_similarity:.4f}" if not np.isnan(actual_similarity) else "N/A",
f"{mixed_cross_encoder_distance_score:.4f}",
f"{actual_distance:.4f}" if not np.isnan(actual_distance) else "N/A",
"BENZER" if mixed_cross_encoder_similarity_score > 0.5 else "BENZER DEĞİL"
]
}
results_df = pd.DataFrame(results_data).set_index("Özellik")
st.dataframe(results_df)
st.markdown("---")
st.markdown(f"**Cross-Encoder Model Kararı:** `{str_a_input}` ve `{str_b_input}` kelimeleri **:{'blue' if cross_encoder_similarity_score > 0.5 else 'red'}[{'BENZER' if cross_encoder_similarity_score > 0.5 else 'BENZER DEĞİL'}]**.")
st.markdown(f"**Mixed Cross-Encoder Model Kararı:** `{str_a_input}` ve `{str_b_input}` kelimeleri **:{'blue' if mixed_cross_encoder_similarity_score > 0.5 else 'red'}[{'BENZER' if mixed_cross_encoder_similarity_score > 0.5 else 'BENZER DEĞİL'}]**.")