shujath000/stack_overflow
0
1import os2import streamlit as st3import pandas as pd4import joblib5import numpy as np6import string7import nltk8from nltk.corpus import stopwords as stp9from nltk import pos_tag, word_tokenize as w, sent_tokenize as s10from nltk.stem import WordNetLemmatizer as wl11NLTK_DATA_PATH = "/app/nltk_data"12os.makedirs(NLTK_DATA_PATH, exist_ok=True)13os.environ["NLTK_DATA"] = NLTK_DATA_PATH14nltk.download('punkt_tab', quiet=True)15nltk.download('punkt_tab', download_dir=NLTK_DATA_PATH, quiet=True)16nltk.download('punkt', download_dir=NLTK_DATA_PATH, quiet=True)17nltk.download('averaged_perceptron_tagger', download_dir=NLTK_DATA_PATH, quiet=True)18nltk.download('wordnet', download_dir=NLTK_DATA_PATH, quiet=True)19nltk.download('stopwords', download_dir=NLTK_DATA_PATH, quiet=True)20# Download necessary NLTK data21#nltk.download('punkt', quiet=True)22#nltk.download('averaged_perceptron_tagger', quiet=True)23#nltk.download('wordnet', quiet=True)24#nltk.download('stopwords', quiet=True)25nltk.download('punkt', download_dir=NLTK_DATA_PATH, quiet=True)26nltk.download('averaged_perceptron_tagger_eng', download_dir=NLTK_DATA_PATH, quiet=True)27nltk.download('wordnet', download_dir=NLTK_DATA_PATH, quiet=True)28nltk.download('stopwords', download_dir=NLTK_DATA_PATH, quiet=True)29 30# === Cleaning Function ===31def sahi_karneka_function(x):32 nouns=[]33 li=[]34 lem=wl()35 l=s(x) 36 for i in l:37 d=w(i.lower())38 for k in d:39 li.append(k)40 lw=len(li)41 j=042 while j<lw:43 if li[j] in string.punctuation:44 li.remove(li[j])45 lw=len(li)46 j=047 elif li[j] in stp.words("english"):48 li.remove(li[j])49 lw=len(li)50 j=051 else:52 j=j+153 tags=pos_tag(li)54 for word,tag in tags:55 if tag.startswith("NN") or tag.startswith("V"):56 nouns.append(word)57 semi_final_words=[lem.lemmatize(m,pos="n") if tagg.startswith("NN") else lem.lemmatize(m,pos="v") for m,tagg in pos_tag(nouns)]58 final_sentence=" ".join(semi_final_words)59 return final_sentence60 61# === Load Data and Models ===62df = pd.read_csv(r"src/c_d.csv")63model = joblib.load("src/logistic_models.pkl")64tfidf = joblib.load("src/tfidf.pkl")65ml = joblib.load("src/multilabels.pkl")66 67# === Streamlit UI ===68st.title("๐ง Multi-Label Question Tag Predictor")69 70# --- Select a URL for context ---71selected_url = st.selectbox("Select a question URL (for context):", df['questions_url'])72st.markdown(f"๐ [Open selected question]({selected_url})")73 74# --- Session State ---75if "user_input" not in st.session_state:76 st.session_state["user_input"] = ""77if "clear_input" not in st.session_state:78 st.session_state["clear_input"] = False79 80# --- Clear input if flagged (AFTER rerun) ---81if st.session_state.clear_input:82 st.session_state.user_input = ""83 st.session_state.clear_input = False84 85# --- Input box ---86st.text_area("โ๏ธ Type your question here:", key="user_input", height=150)87 88# --- Predict button ---89if st.button("Predict Tags"):90 final_question = st.session_state.user_input.strip()91 92 if not final_question:93 st.warning("โ ๏ธ Please enter a question.")94 else:95 with st.spinner("๐ Predicting tags..."):96 # Step 1: Clean input97 cleaned = sahi_karneka_function(final_question)98 99 # Step 2: TF-IDF100 f=[]101 f.append(cleaned)102 x_tfidf = tfidf.transform(f)103 104 # Step 3: Predict105 y_probs = model.predict_proba(x_tfidf)106 threshold = 0.55107 y_predd=model.predict(x_tfidf)108 probs_column1 = np.array([i[:, 1] for i in y_probs]).T109 y_pred = (probs_column1 >= threshold).astype(int)110 111 # Step 4: Decode112 predicted_tags = ml.inverse_transform(y_predd)113 114 # Step 5: Display results115 st.success("โ
Predicted Tags:")116 if predicted_tags and predicted_tags[0]:117 for tag in predicted_tags[0]:118 st.markdown(f"๐น **`{tag}`**")119 else:120 st.info("No tags matched the threshold.")121 122 # Step 6: Show a "Clear" button123 if st.button("Clear Input"):124 st.session_state.user_input = ""125 