import streamlit as st from transformers import pipeline import re #strength_pipeline_tr = pipeline(task = "text-classification", model = "SoDehghan/test-strength") #strength_pipeline_tr = pipeline(task = "text-classification", model = "SoDehghan/BERTurk-hate-speech-strength-prediction") #target_pipeline_tr = pipeline(task = "text-classification", model = "SoDehghan/test-target") strength_pipeline_tr = pipeline(task = "text-classification", model = "SoDehghan/hs-tr-syn-4class-for-tool") #target_pipeline_tr = pipeline(task = "text-classification", model = "SoDehghan/targ-tr-syn-for-tool", return_all_scores=True) target_pipeline_tr = pipeline(task = "text-classification", model = "SoDehghan/test-push-to-hf", return_all_scores=True) degree_pipeline_tr = pipeline(task = "text-classification", model = "SoDehghan/reg-hs-tr-syn-for-tool", function_to_apply="none") group_pipeline_tr = pipeline(task = "text-classification", model = "SoDehghan/group-hs-tr-for-tool") TR_TWEETS_EXAMPLES = [ "Mülteciler ölsün istiyorum.", "Bütün mülteciler hırsızdır.", "Mültecilerden nefret ediyorum.", "Defolun gidin bizim ülkemizden.", "Suriyeli sürüleri ülkemize girmeye devam ediyor, bu işgalcilerin artık durması gerekiyor. ", "Kadınlar dizinizi kırıp evde oturun yoksa tacize uğrarsınız, demedi demeyein!", "Kadının yeri mutfaktır.", "Yunan haddını bilecek yoksa bir gece ansızın gelebiliriz!", "Suriyeliler oy kullanmasın.", "Gayrimüslimler milletvekili olmasın.", "Mülteciler oy kullanmasın.", "Mülteciler sgk'dan yararlanmasın.", "Kürtçe eğitim kabul edilemez.", "Mültecilerin de yaşamaya hakkı var.", "Terör örgütlerinin faaliyetlerini önlemek için hukuki çerçevede kapsamlı önlemler alınmaktadır.", "İsrail'de bu yıl düzenlenecek kültürel etkinliklerin tarihleri açıklandı", "Kadın girişimciler, hem Müslüman hem de diğer topluluklardan müşterilere hitap eden güzellik salonları açıyor.", "Suriye’deki pazarlarda Müslüman ve Hristiyan bayramları öncesinde hazırlıklar yapılıyor.", "Bazı köpeklerin kuduz ya da saldırgan olması, tüm köpeklerin öldürülmesi için haklı bir sebep midir? Yasayı geri çek.", "Kadınlar birbirlerine destek olmalı.", "Suriyelilerin yemekleri çok güzel.", "Suriye yemekleri çok lezzetli.", "Süriyelileri çok seviyorum, çok sempatik insanlar.", "Amerikalıları çok Seviyorum", "Ateistleri hiç sevmiyorum", "Ortodoksalar hrıstiyanlar", "Singapur çok güzel bir ülke dir", "Singapurlular çok çalışkan insanlar", "Pazardan elma aldim.", "Dün hastaneye gittim sonra da bir güzel yemek yedim, eve döndüm, kızımla oyun oynadım, Amerikan dizi izledim" ] NON_HATEFUL_RESPONSE = 'This content is classified as "non-hate" speech. ✅😊' HATEFUL_RESPONSE = 'This content is classified as "hate" speech. ❌😔' NON_HATEFUL_RESPONSE = '✅ Non-hateful 😊' HATEFUL_RESPONSE = '❌ Hateful 😔' strength_mapping = { 'LABEL_0': 'Severity Level: 0 - No Hate Detected', 'LABEL_1': 'Severity Level: 1 - Mild (Insult)', 'LABEL_2': 'Severity Level: 2 - Moderate (Exclusion)', 'LABEL_3': 'Severity Level: 3 - Severe (Wishing Harm)', 'LABEL_4': 'Severity Level: 4 - Extreme (Threatening Harm)' } strength_mapping = { 'LABEL_0': 'Severity Level: 0 - No Hate Detected', 'LABEL_1': 'Severity Level: 1 - Mild (Symbolization)', 'LABEL_2': 'Severity Level: 2 - Moderate (Exaggeration, Generalization, Attribution, Distortion)', 'LABEL_3': 'Severity Level: 3 - Severe (Swearing, Insult, Defamation, Dehumanization)', 'LABEL_4': 'Severity Level: 4 - Extreme (Threat of enmnity, war, attack, murder, harm)' } sentiment_mapping = { 'LABEL_0': NON_HATEFUL_RESPONSE, 'LABEL_1': HATEFUL_RESPONSE, 'LABEL_2': HATEFUL_RESPONSE, 'LABEL_3': HATEFUL_RESPONSE, 'LABEL_4': HATEFUL_RESPONSE } target_mapping ={ 'LABEL_0': 'Refugees/Immigrants', 'LABEL_1': 'Country/Nationality', 'LABEL_2': 'Gender (Women/LGBTQ+)' } sentiment_mapping = { 'LABEL_0': NON_HATEFUL_RESPONSE, 'LABEL_1': HATEFUL_RESPONSE, 'LABEL_2': HATEFUL_RESPONSE, 'LABEL_3': HATEFUL_RESPONSE } strength_mapping = { 'LABEL_0': 'Severity Level: 0 - No Hate Detected', 'LABEL_1': 'Severity Level: 1 - Mild (Discriminatory Discourse)', 'LABEL_2': 'Severity Level: 2 - Moderate (Exaggeration, Generalization, Attribution, Distortion, Symbolization)', 'LABEL_3': 'Severity Level: 3 - Severe (Swearing, Insult, Defamation, Dehumanization, Threat of Enmity/War/Attack/Murder/Harm)', } strength_mapping = { 'LABEL_0': 'No Hate Detected', 'LABEL_1': 'Mild Level \n(Discriminatory Discourse)', 'LABEL_2': 'Moderate Level \n (Exaggeration, Generalization, Attribution, Distortion, Symbolization)', 'LABEL_3': 'Severe Level \n (Swearing, Insult, Defamation, Dehumanization, Threat of Enmity/War/Attack/Murder/Harm)', } target_mapping ={ 'LABEL_0': 'Target group not specified or not present', 'LABEL_1': 'Country/Nationality/Race/Ethnicity', 'LABEL_2': 'Religion', 'LABEL_3': 'Gender/Sexual Orientation', 'LABEL_4': 'Specific Viewpoint/Status/Practice; Occupational Position Group' } group_mapping = { 'LABEL_0': 'No-group', 'LABEL_1': 'Refugees', 'LABEL_2': 'Israel-Jews', 'LABEL_3': 'Greeks', 'LABEL_4': 'Armenian', 'LABEL_5': 'Alevi', 'LABEL_6': 'Kurdish', 'LABEL_7': 'Arabian', 'LABEL_8': 'LGBTI+', 'LABEL_9': 'Women', 'LABEL_10': 'Other groups' } def remove_url(text): return ' '.join(re.sub("(\w+:\/\/\S+)"," ", text).split()) def remove_username(text): return ' '.join(re.sub("([@][A-Za-z0-9_]+)"," ", text).split()) def remove_at_mark(text): return re.sub(r'[@]', ' ', text) def remove_tag_mark(text): return re.sub(r'[#]', ' ', text) def remove_punctuation_marks(text): punc = '''!()-[]{};:'"\,<>./?$%^&_*~''' for i in text: if i in punc: text = text.replace(i, " ") return text def preprocess_text (text): s = text.lower() s = remove_username(s) s = remove_at_mark(s) s = remove_url(s) s = remove_tag_mark(s) s = remove_punctuation_marks(s) #s = replace_hashtags_with_segments(s) return s def multi_label_target_classification(tr_input): result = [] predictions = target_pipeline_tr(tr_input) prediction_result = predictions[0] #Filter predictions based on the sigmoid threshold filtered_predictions = [pred for pred in prediction_result if pred['score'] > 0.3] #Print all labels that meet the threshold if filtered_predictions: for item in filtered_predictions: #result.append(item) #result.append((item['label'], 'score:', item['score'])) result.append(item['label']) else: result.append("No Target") return result def regress_tweet(tr_input): prediction = [] prediction = (degree_pipeline_tr (tr_input)) prediction = prediction[0]["score"] return round(prediction) def sidebar_callback(): st.session_state['tr_input'] = st.session_state['sidebar'] def write(): if 'tr_input' not in st.session_state: st.session_state['tr_input'] = "" st.markdown( """ # Hate Speech Detection in Turkish tweets """ ) # st.markdown(""" # A brief description of the model and the task it was trained on. # """) tr_input = st.text_area("Enter text for analysis:", height=50, key="tr_input") # Examples dropdown on = st.toggle("Show predefined examples to test") if on: st.selectbox("Select a predefined example to test:", TR_TWEETS_EXAMPLES, key='sidebar', on_change=sidebar_callback) # Prediction button if st.button("Analyze Text", key="tr_predict"): st.write(" ") with st.spinner('Generating predictions...'): result_strength_tr = strength_pipeline_tr(preprocess_text(tr_input)) strength_tr = result_strength_tr[0]["label"] sentiment_tr = sentiment_mapping[strength_tr] strength_tr = strength_mapping[strength_tr] target_tr = multi_label_target_classification(preprocess_text(tr_input)) degree_tr = regress_tweet(preprocess_text(tr_input)) #if strength_tr == 'Severity Level: 0 - No Hate Detected': #target_tr = 'There is no hate speech against target groups' #else: #result_target_tr = target_pipeline_tr(tr_input) #target_tr = result_target_tr[0]["label"] #target_tr = target_mapping[target_tr] result_group_tr = group_pipeline_tr(preprocess_text(tr_input)) group_tr = result_group_tr[0]["label"] group_tr = group_mapping[group_tr] st.write(f" **Binary Classification:** {sentiment_tr}") st.write(f" **Multi-class Strength Classification:** {strength_tr}") st.write(f" **Degree of Hate Prediction (range [0-10]):** {degree_tr}") st.write(f" **Target Prediction:** {target_tr}") st.write(f" **Group Prediction:** {group_tr}")