| from packages import *
|
|
|
| def download_blog_dataset():
|
| url= "https://huggingface.co/datasets/RohanAiLab/persian_blog/resolve/main/blogs.zip"
|
| output_path= "blogs.zip"
|
| extract_folder= "blogs"
|
|
|
| if not os.path.exists(output_path):
|
| print("Downloading blogs.zip...")
|
| r= requests.get(url, stream= True)
|
| with open(output_path, "wb") as f:
|
| for chunk in r.iter_content(chunk_size=8192):
|
| if chunk:
|
| f.write(chunk)
|
| print("Download completed.")
|
|
|
| if not os.path.exists(extract_folder):
|
| print("Extracting blogs.zip...")
|
| with ZipFile(output_path, 'r') as zip_ref:
|
| zip_ref.extractall(extract_folder)
|
| print("Extraction completed.")
|
|
|
|
|
| def eda_dataset(df, name):
|
| text_column= "text"
|
| print(f"--- EDA for {name} ---")
|
| print(f"تعداد نمونهها: {len(df)}")
|
| print(f"تعداد نمونههای خالی: {df[text_column].isna().sum() + (df[text_column].str.strip() == '').sum()}")
|
| print(f"میانگین طول متن: {df[text_column].str.len().mean():.2f}")
|
| print(f"حداکثر طول متن: {df[text_column].str.len().max()}")
|
| print(f"حداقل طول متن: {df[text_column].str.len().min()}")
|
|
|
|
|
| print("\n")
|
|
|
|
|
| def show_short_samples(df, dataset_name, max_length= 1000, num_samples= 5):
|
| print(f"--- نمونههای با طول کمتر از {max_length} کاراکتر برای {dataset_name} ---")
|
| short_samples = df[df['text'].str.len() < max_length]
|
| print(f"تعداد نمونههای با طول کمتر از {max_length} کاراکتر: {len(short_samples)}")
|
| if len(short_samples) > 0:
|
| for i, text in enumerate(short_samples['text'].head(num_samples)):
|
| print(f"نمونه {i+1}: {text[:100]} (طول: {len(text)} کاراکتر)")
|
| else:
|
| print("هیچ نمونهای با طول کمتر از {max_length} کاراکتر یافت نشد.")
|
| print("\n")
|
|
|
|
|
| def evaluation_fn(tokenizer: Tokenizer, dataset:pd.DataFrame, samples_number= 10000):
|
| dataset= dataset['text'].sample(n= samples_number).to_list()
|
| unk_count= sum(text.count("[UNK]") for text in [tokenizer.encode(t).tokens for t in dataset])
|
| total_tokens= sum(len(tokenizer.encode(t).tokens) for t in dataset)
|
| unk_rate= (unk_count / total_tokens) * 100
|
|
|
| char_counts= [len(t) for t in dataset]
|
| token_counts= [len(tokenizer.encode(t).tokens) for t in dataset]
|
| compression_ratio= sum(char_counts) / sum(token_counts)
|
|
|
| return unk_rate, compression_ratio |