|
|
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'}]**.") |
|
|
|