import os import re import sys import requests import pandas as pd from datasets import load_dataset from sklearn .model_selection import train_test_split DATA_DIR =os .path .dirname (os .path .abspath (__file__ )) def separator (title ): print ("\n"+"="*60 ) print (f" {title }") print ("="*60 ) def clean_text (text ): if not isinstance (text ,str ): return "" text =re .sub (r'http\S+','',text ) text =re .sub (r'@\w+','',text ) text =re .sub (r'#\w+','',text ) text =re .sub (r'\s+',' ',text ) return text .strip () def split_and_save (df ,name ,text_col ,label_col ): df =df [[text_col ,label_col ]].rename (columns ={text_col :'text',label_col :'label'}) df =df .dropna (subset =['text','label']) df ['text']=df ['text'].apply (clean_text ) df =df [df ['text'].str .len ()>2 ].reset_index (drop =True ) train ,temp =train_test_split (df ,test_size =0.20 ,random_state =42 ,stratify =df ['label']) val ,test =train_test_split (temp ,test_size =0.50 ,random_state =42 ,stratify =temp ['label']) for split ,data in [('train',train ),('val',val ),('test',test )]: path =os .path .join (DATA_DIR ,f'{name }_{split }.csv') data .to_csv (path ,index =False ,encoding ='utf-8-sig') print (f" Saved {path } ({len (data )} rows)") return train ,val ,test separator ("DATASET 1: Roman Urdu Sentiment (HuggingFace)") try : ds1 =load_dataset ('community-datasets/roman_urdu',trust_remote_code =True ) print ("Available splits:",list (ds1 .keys ())) df1 =ds1 ['train'].to_pandas () print (f"Columns : {df1 .columns .tolist ()}") print (f"Shape : {df1 .shape }") print (f"Sample row :\n{df1 .iloc [0 ]}") print (f"\nLabel dist. :\n{df1 .iloc [:,-1 ].value_counts ()}") text_col =df1 .columns [0 ] label_col =df1 .columns [-1 ] print (f"\nUsing text='{text_col }' label='{label_col }'") split_and_save (df1 ,'roman_urdu_sentiment',text_col ,label_col ) print ("Dataset 1 DONE") except Exception as e : print (f"ERROR loading Dataset 1: {e }") separator ("DATASET 2: SemEval 2018 Task 1 - Emotion (HuggingFace)") try : ds2 =load_dataset ('SemEvalWorkshop/sem_eval_2018_task_1','subtask5.english',trust_remote_code =True ) print ("Available splits:",list (ds2 .keys ())) frames =[] for split_name in ds2 .keys (): tmp =ds2 [split_name ].to_pandas () frames .append (tmp ) df2_all =pd .concat (frames ,ignore_index =True ) print (f"Columns : {df2_all .columns .tolist ()}") print (f"Shape : {df2_all .shape }") print (f"Sample :\n{df2_all .iloc [0 ]}") emotion_cols =['anger','anticipation','disgust','fear','joy', 'love','optimism','pessimism','sadness','surprise','trust'] target_emotions =['joy','anger','fear','sadness'] available =[c for c in target_emotions if c in df2_all .columns ] if available : df2_all ['label']=df2_all [available ].idxmax (axis =1 ) df2_all ['max_score']=df2_all [available ].max (axis =1 ) df2_all =df2_all [df2_all ['max_score']>0 ] text_col2 ='Tweet'if 'Tweet'in df2_all .columns else df2_all .columns [0 ] print (f"\nEmotion dist.:\n{df2_all ['label'].value_counts ()}") split_and_save (df2_all ,'semeval_emotion',text_col2 ,'label') print ("Dataset 2 DONE") else : print (f"Emotion columns not found. Available: {df2_all .columns .tolist ()}") except Exception as e : print (f"ERROR loading Dataset 2: {e }") print ("Trying alternate config...") try : print ("Available configs:") from datasets import get_dataset_config_names configs =get_dataset_config_names ('SemEvalWorkshop/sem_eval_2018_task_1') print (configs ) except Exception as e2 : print (f"Could not list configs: {e2 }") separator ("DATASET 3: mirfan899 Urdu Sentiment TSV (GitHub Download)") tar_path =os .path .join (DATA_DIR ,'urdu.tsv.tar.gz') tsv_path =os .path .join (DATA_DIR ,'urdu_v1.tsv') try : if not os .path .exists (tsv_path ): url ='https://raw.githubusercontent.com/mirfan899/Urdu/master/sentiment/urdu.tsv.tar.gz' print (f"Downloading from: {url }") r =requests .get (url ,timeout =30 ) r .raise_for_status () with open (tar_path ,'wb')as f : f .write (r .content ) print (f"Downloaded successfully ({len (r .content )} bytes)") import tarfile with tarfile .open (tar_path ,"r:gz")as tar : tar .extractall (path =DATA_DIR ) print ("Extracted urdu_v1.tsv") for sep in ['\t',',',';']: try : df3 =pd .read_csv (tsv_path ,sep =sep ,header =0 ,encoding ='utf-8') if df3 .shape [1 ]>=2 : break except : continue print (f"Columns : {df3 .columns .tolist ()}") print (f"Shape : {df3 .shape }") print (f"\nLabel dist.:\n{df3 .iloc [:,-1 ].value_counts ()}") split_and_save (df3 ,'mirfan_urdu_sentiment',df3 .columns [0 ],df3 .columns [-1 ]) print ("Dataset 3 DONE") except Exception as e : print (f"ERROR loading Dataset 3: {e }") separator ("DATASET 4: Urdu Sentiment Corpus (GitHub Download)") tsv4_path =os .path .join (DATA_DIR ,'urdu-sentiment-corpus-v1.tsv') try : if not os .path .exists (tsv4_path ): url4 ='https://raw.githubusercontent.com/MuhammadYaseenKhan/Urdu-Sentiment-Corpus/master/urdu-sentiment-corpus-v1.tsv' print (f"Downloading from: {url4 }") r4 =requests .get (url4 ,timeout =30 ) r4 .raise_for_status () with open (tsv4_path ,'wb')as f : f .write (r4 .content ) print (f"Downloaded successfully ({len (r4 .content )} bytes)") for enc in ['utf-8','utf-8-sig','cp1252','latin-1']: try : df4 =pd .read_csv (tsv4_path ,sep ='\t',encoding =enc ) break except : continue print (f"Columns : {df4 .columns .tolist ()}") print (f"Shape : {df4 .shape }") text_col4 =df4 .columns [0 ] label_col4 =df4 .columns [-1 ] print (f"\nLabel dist.:\n{df4 [label_col4 ].value_counts ()}") split_and_save (df4 ,'urdu_sentiment_corpus',text_col4 ,label_col4 ) print ("Dataset 4 DONE") except Exception as e : print (f"ERROR loading Dataset 4: {e }") separator ("PHASE 2 COMPLETE — Summary of saved files") all_files =[f for f in os .listdir (DATA_DIR )if f .endswith ('.csv')] print (f"{'File':<45} {'Rows':>6}") print ("-"*55 ) for f in sorted (all_files ): path =os .path .join (DATA_DIR ,f ) try : n =len (pd .read_csv (path ,encoding ='utf-8-sig')) print (f"{f :<45} {n :>6}") except : print (f"{f :<45} (error reading)") print ("\nAll datasets collected, cleaned, and split. Ready for Phase 3.")