From 1dc796b59e24952a2d37f224a6da3ffc8cc2f233 Mon Sep 17 00:00:00 2001 From: Andrew Trieu Date: Wed, 26 Mar 2025 17:49:39 +0200 Subject: [PATCH] Add data processing and sampling for fake news dataset --- .gitignore | 2 + archives/fnc1a.log | 452 +++++++++++++++++++++++++++++++++++++++ archives/fnc1a.png | Bin 0 -> 124514 bytes archives/fnc1b.log | 6 + src/fnc1a.py | 214 ++++++++++++++++-- src/fnc1b.py | 231 ++++++-------------- src/parquet_validator.py | 19 ++ 7 files changed, 737 insertions(+), 187 deletions(-) create mode 100644 .gitignore create mode 100644 archives/fnc1a.log create mode 100644 archives/fnc1a.png create mode 100644 archives/fnc1b.log create mode 100644 src/parquet_validator.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b820773 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +pyenv +data diff --git a/archives/fnc1a.log b/archives/fnc1a.log new file mode 100644 index 0000000..436b05a --- /dev/null +++ b/archives/fnc1a.log @@ -0,0 +1,452 @@ +[nltk_data] Downloading package stopwords to +[nltk_data] /home/andrewtrieu/nltk_data... +[nltk_data] Package stopwords is already up-to-date! +[2025-03-26 13:12:19] 📚 Loading spaCy model... +[2025-03-26 13:12:20] 📖 spaCy model loaded. +INFO: Pandarallel will run on 6 workers. +INFO: Pandarallel will use Memory file system to transfer data between the main process and workers. +[2025-03-26 13:12:20] 🧮 Processing text in batches... +[2025-03-26 13:12:21] 🔢 Processing batch 1... +[2025-03-26 13:12:22] 🪙 Tokenizing text... +[2025-03-26 13:12:41] 🚫 Removing stopwords... +[2025-03-26 13:13:09] 🌱 Applying stemming... +[2025-03-26 13:15:28] 📝 Joining tokens back to text... +[2025-03-26 13:15:38] 🔢 Processing batch 2... +[2025-03-26 13:15:39] 🪙 Tokenizing text... +[2025-03-26 13:16:00] 🚫 Removing stopwords... +[2025-03-26 13:16:23] 🌱 Applying stemming... +[2025-03-26 13:18:24] 📝 Joining tokens back to text... +[2025-03-26 13:18:33] 🔢 Processing batch 3... +[2025-03-26 13:18:34] 🪙 Tokenizing text... +[2025-03-26 13:18:55] 🚫 Removing stopwords... +[2025-03-26 13:19:21] 🌱 Applying stemming... +[2025-03-26 13:21:19] 📝 Joining tokens back to text... +[2025-03-26 13:21:27] 🔢 Processing batch 4... +[2025-03-26 13:21:28] 🪙 Tokenizing text... +[2025-03-26 13:21:45] 🚫 Removing stopwords... +[2025-03-26 13:22:08] 🌱 Applying stemming... +[2025-03-26 13:23:58] 📝 Joining tokens back to text... +[2025-03-26 13:24:06] 🔢 Processing batch 5... +[2025-03-26 13:24:07] 🪙 Tokenizing text... +[2025-03-26 13:24:28] 🚫 Removing stopwords... +[2025-03-26 13:24:54] 🌱 Applying stemming... +[2025-03-26 13:26:58] 📝 Joining tokens back to text... +[2025-03-26 13:27:09] 🔢 Processing batch 6... +[2025-03-26 13:27:10] 🪙 Tokenizing text... +[2025-03-26 13:27:31] 🚫 Removing stopwords... +[2025-03-26 13:27:57] 🌱 Applying stemming... +[2025-03-26 13:29:57] 📝 Joining tokens back to text... +[2025-03-26 13:30:07] 🔢 Processing batch 7... +[2025-03-26 13:30:07] 🪙 Tokenizing text... +[2025-03-26 13:30:28] 🚫 Removing stopwords... +[2025-03-26 13:30:55] 🌱 Applying stemming... +[2025-03-26 13:32:51] 📝 Joining tokens back to text... +[2025-03-26 13:33:00] 🔢 Processing batch 8... +[2025-03-26 13:33:00] 🪙 Tokenizing text... +[2025-03-26 13:33:23] 🚫 Removing stopwords... +[2025-03-26 13:33:53] 🌱 Applying stemming... +[2025-03-26 13:36:08] 📝 Joining tokens back to text... +[2025-03-26 13:36:18] 🔢 Processing batch 9... +[2025-03-26 13:36:18] 🪙 Tokenizing text... +[2025-03-26 13:36:40] 🚫 Removing stopwords... +[2025-03-26 13:36:59] 🌱 Applying stemming... +[2025-03-26 13:38:31] 📝 Joining tokens back to text... +[2025-03-26 13:38:38] 🔢 Processing batch 10... +[2025-03-26 13:38:38] 🪙 Tokenizing text... +[2025-03-26 13:38:51] 🚫 Removing stopwords... +[2025-03-26 13:39:06] 🌱 Applying stemming... +[2025-03-26 13:40:20] 📝 Joining tokens back to text... +[2025-03-26 13:40:26] 🔢 Processing batch 11... +[2025-03-26 13:40:26] 🪙 Tokenizing text... +[2025-03-26 13:40:42] 🚫 Removing stopwords... +[2025-03-26 13:41:02] 🌱 Applying stemming... +[2025-03-26 13:42:38] 📝 Joining tokens back to text... +[2025-03-26 13:42:46] 🔢 Processing batch 12... +[2025-03-26 13:42:46] 🪙 Tokenizing text... +[2025-03-26 13:43:05] 🚫 Removing stopwords... +[2025-03-26 13:43:30] 🌱 Applying stemming... +[2025-03-26 13:45:27] 📝 Joining tokens back to text... +[2025-03-26 13:45:36] 🔢 Processing batch 13... +[2025-03-26 13:45:36] 🪙 Tokenizing text... +[2025-03-26 13:45:50] 🚫 Removing stopwords... +[2025-03-26 13:46:07] 🌱 Applying stemming... +[2025-03-26 13:47:20] 📝 Joining tokens back to text... +[2025-03-26 13:47:26] 🔢 Processing batch 14... +[2025-03-26 13:47:27] 🪙 Tokenizing text... +[2025-03-26 13:47:40] 🚫 Removing stopwords... +[2025-03-26 13:47:58] 🌱 Applying stemming... +[2025-03-26 13:49:14] 📝 Joining tokens back to text... +[2025-03-26 13:49:22] 🔢 Processing batch 15... +[2025-03-26 13:49:22] 🪙 Tokenizing text... +[2025-03-26 13:49:43] 🚫 Removing stopwords... +[2025-03-26 13:50:06] 🌱 Applying stemming... +[2025-03-26 13:51:52] 📝 Joining tokens back to text... +[2025-03-26 13:52:00] 🔢 Processing batch 16... +[2025-03-26 13:52:01] 🪙 Tokenizing text... +[2025-03-26 13:52:18] 🚫 Removing stopwords... +[2025-03-26 13:52:39] 🌱 Applying stemming... +[2025-03-26 13:54:14] 📝 Joining tokens back to text... +[2025-03-26 13:54:23] 🔢 Processing batch 17... +[2025-03-26 13:54:23] 🪙 Tokenizing text... +[2025-03-26 13:54:45] 🚫 Removing stopwords... +[2025-03-26 13:55:14] 🌱 Applying stemming... +[2025-03-26 13:57:21] 📝 Joining tokens back to text... +[2025-03-26 13:57:33] 🔢 Processing batch 18... +[2025-03-26 13:57:33] 🪙 Tokenizing text... +[2025-03-26 13:57:56] 🚫 Removing stopwords... +[2025-03-26 13:58:22] 🌱 Applying stemming... +[2025-03-26 14:00:39] 📝 Joining tokens back to text... +[2025-03-26 14:00:49] 🔢 Processing batch 19... +[2025-03-26 14:00:49] 🪙 Tokenizing text... +[2025-03-26 14:01:10] 🚫 Removing stopwords... +[2025-03-26 14:01:34] 🌱 Applying stemming... +[2025-03-26 14:03:27] 📝 Joining tokens back to text... +[2025-03-26 14:03:36] 🔢 Processing batch 20... +[2025-03-26 14:03:36] 🪙 Tokenizing text... +[2025-03-26 14:03:59] 🚫 Removing stopwords... +[2025-03-26 14:04:25] 🌱 Applying stemming... +[2025-03-26 14:06:22] 📝 Joining tokens back to text... +[2025-03-26 14:06:31] 🔢 Processing batch 21... +[2025-03-26 14:06:31] 🪙 Tokenizing text... +[2025-03-26 14:06:53] 🚫 Removing stopwords... +[2025-03-26 14:07:19] 🌱 Applying stemming... +[2025-03-26 14:09:41] 📝 Joining tokens back to text... +[2025-03-26 14:09:51] 🔢 Processing batch 22... +[2025-03-26 14:09:52] 🪙 Tokenizing text... +[2025-03-26 14:10:15] 🚫 Removing stopwords... +[2025-03-26 14:10:45] 🌱 Applying stemming... +[2025-03-26 14:13:15] 📝 Joining tokens back to text... +[2025-03-26 14:13:25] 🔢 Processing batch 23... +[2025-03-26 14:13:25] 🪙 Tokenizing text... +[2025-03-26 14:13:46] 🚫 Removing stopwords... +[2025-03-26 14:14:13] 🌱 Applying stemming... +[2025-03-26 14:16:16] 📝 Joining tokens back to text... +[2025-03-26 14:16:27] 🔢 Processing batch 24... +[2025-03-26 14:16:28] 🪙 Tokenizing text... +[2025-03-26 14:16:56] 🚫 Removing stopwords... +[2025-03-26 14:17:30] 🌱 Applying stemming... +[2025-03-26 14:20:45] 📝 Joining tokens back to text... +[2025-03-26 14:21:00] 🔢 Processing batch 25... +[2025-03-26 14:21:01] 🪙 Tokenizing text... +[2025-03-26 14:21:22] 🚫 Removing stopwords... +[2025-03-26 14:21:49] 🌱 Applying stemming... +[2025-03-26 14:23:36] 📝 Joining tokens back to text... +[2025-03-26 14:23:45] 🔢 Processing batch 26... +[2025-03-26 14:23:46] 🪙 Tokenizing text... +[2025-03-26 14:24:12] 🚫 Removing stopwords... +[2025-03-26 14:24:44] 🌱 Applying stemming... +[2025-03-26 14:26:49] 📝 Joining tokens back to text... +[2025-03-26 14:26:59] 🔢 Processing batch 27... +[2025-03-26 14:27:00] 🪙 Tokenizing text... +[2025-03-26 14:27:25] 🚫 Removing stopwords... +[2025-03-26 14:27:54] 🌱 Applying stemming... +[2025-03-26 14:29:55] 📝 Joining tokens back to text... +[2025-03-26 14:30:06] 🔢 Processing batch 28... +[2025-03-26 14:30:06] 🪙 Tokenizing text... +[2025-03-26 14:30:28] 🚫 Removing stopwords... +[2025-03-26 14:30:54] 🌱 Applying stemming... +[2025-03-26 14:32:39] 📝 Joining tokens back to text... +[2025-03-26 14:32:49] 🔢 Processing batch 29... +[2025-03-26 14:32:49] 🪙 Tokenizing text... +[2025-03-26 14:33:14] 🚫 Removing stopwords... +[2025-03-26 14:33:44] 🌱 Applying stemming... +[2025-03-26 14:36:18] 📝 Joining tokens back to text... +[2025-03-26 14:36:29] 🔢 Processing batch 30... +[2025-03-26 14:36:29] 🪙 Tokenizing text... +[2025-03-26 14:36:52] 🚫 Removing stopwords... +[2025-03-26 14:37:21] 🌱 Applying stemming... +[2025-03-26 14:39:37] 📝 Joining tokens back to text... +[2025-03-26 14:39:47] 🔢 Processing batch 31... +[2025-03-26 14:39:48] 🪙 Tokenizing text... +[2025-03-26 14:40:09] 🚫 Removing stopwords... +[2025-03-26 14:40:37] 🌱 Applying stemming... +[2025-03-26 14:42:33] 📝 Joining tokens back to text... +[2025-03-26 14:42:43] 🔢 Processing batch 32... +[2025-03-26 14:42:44] 🪙 Tokenizing text... +[2025-03-26 14:43:08] 🚫 Removing stopwords... +[2025-03-26 14:43:33] 🌱 Applying stemming... +[2025-03-26 14:45:06] 📝 Joining tokens back to text... +[2025-03-26 14:45:15] 🔢 Processing batch 33... +[2025-03-26 14:45:15] 🪙 Tokenizing text... +[2025-03-26 14:45:36] 🚫 Removing stopwords... +[2025-03-26 14:45:58] 🌱 Applying stemming... +[2025-03-26 14:47:41] 📝 Joining tokens back to text... +[2025-03-26 14:47:50] 🔢 Processing batch 34... +[2025-03-26 14:47:51] 🪙 Tokenizing text... +[2025-03-26 14:48:12] 🚫 Removing stopwords... +[2025-03-26 14:48:39] 🌱 Applying stemming... +[2025-03-26 14:50:40] 📝 Joining tokens back to text... +[2025-03-26 14:50:50] 🔢 Processing batch 35... +[2025-03-26 14:50:50] 🪙 Tokenizing text... +[2025-03-26 14:51:12] 🚫 Removing stopwords... +[2025-03-26 14:51:41] 🌱 Applying stemming... +[2025-03-26 14:53:41] 📝 Joining tokens back to text... +[2025-03-26 14:53:51] 🔢 Processing batch 36... +[2025-03-26 14:53:52] 🪙 Tokenizing text... +[2025-03-26 14:54:10] 🚫 Removing stopwords... +[2025-03-26 14:54:33] 🌱 Applying stemming... +[2025-03-26 14:56:06] 📝 Joining tokens back to text... +[2025-03-26 14:56:15] 🔢 Processing batch 37... +[2025-03-26 14:56:16] 🪙 Tokenizing text... +[2025-03-26 14:56:36] 🚫 Removing stopwords... +[2025-03-26 14:57:03] 🌱 Applying stemming... +[2025-03-26 14:58:44] 📝 Joining tokens back to text... +[2025-03-26 14:58:54] 🔢 Processing batch 38... +[2025-03-26 14:58:55] 🪙 Tokenizing text... +[2025-03-26 14:59:29] 🚫 Removing stopwords... +[2025-03-26 14:59:59] 🌱 Applying stemming... +[2025-03-26 15:02:26] 📝 Joining tokens back to text... +[2025-03-26 15:02:39] 🔢 Processing batch 39... +[2025-03-26 15:02:40] 🪙 Tokenizing text... +[2025-03-26 15:03:07] 🚫 Removing stopwords... +[2025-03-26 15:03:40] 🌱 Applying stemming... +[2025-03-26 15:06:16] 📝 Joining tokens back to text... +[2025-03-26 15:06:27] 🔢 Processing batch 40... +[2025-03-26 15:06:28] 🪙 Tokenizing text... +[2025-03-26 15:06:49] 🚫 Removing stopwords... +[2025-03-26 15:07:14] 🌱 Applying stemming... +[2025-03-26 15:09:02] 📝 Joining tokens back to text... +[2025-03-26 15:09:12] 🔢 Processing batch 41... +[2025-03-26 15:09:13] 🪙 Tokenizing text... +[2025-03-26 15:09:37] 🚫 Removing stopwords... +[2025-03-26 15:10:05] 🌱 Applying stemming... +[2025-03-26 15:12:15] 📝 Joining tokens back to text... +[2025-03-26 15:12:26] 🔢 Processing batch 42... +[2025-03-26 15:12:27] 🪙 Tokenizing text... +[2025-03-26 15:12:50] 🚫 Removing stopwords... +[2025-03-26 15:13:20] 🌱 Applying stemming... +[2025-03-26 15:15:29] 📝 Joining tokens back to text... +[2025-03-26 15:15:40] 🔢 Processing batch 43... +[2025-03-26 15:15:41] 🪙 Tokenizing text... +[2025-03-26 15:16:08] 🚫 Removing stopwords... +[2025-03-26 15:16:39] 🌱 Applying stemming... +[2025-03-26 15:18:47] 📝 Joining tokens back to text... +[2025-03-26 15:19:01] 🔢 Processing batch 44... +[2025-03-26 15:19:02] 🪙 Tokenizing text... +[2025-03-26 15:19:28] 🚫 Removing stopwords... +[2025-03-26 15:19:57] 🌱 Applying stemming... +[2025-03-26 15:21:44] 📝 Joining tokens back to text... +[2025-03-26 15:21:54] 🔢 Processing batch 45... +[2025-03-26 15:21:54] 🪙 Tokenizing text... +[2025-03-26 15:22:14] 🚫 Removing stopwords... +[2025-03-26 15:22:36] 🌱 Applying stemming... +[2025-03-26 15:24:15] 📝 Joining tokens back to text... +[2025-03-26 15:24:28] 🔢 Processing batch 46... +[2025-03-26 15:24:28] 🪙 Tokenizing text... +[2025-03-26 15:24:54] 🚫 Removing stopwords... +[2025-03-26 15:25:24] 🌱 Applying stemming... +[2025-03-26 15:27:19] 📝 Joining tokens back to text... +[2025-03-26 15:27:29] 🔢 Processing batch 47... +[2025-03-26 15:27:29] 🪙 Tokenizing text... +[2025-03-26 15:27:51] 🚫 Removing stopwords... +[2025-03-26 15:28:16] 🌱 Applying stemming... +[2025-03-26 15:29:54] 📝 Joining tokens back to text... +[2025-03-26 15:30:06] 🔢 Processing batch 48... +[2025-03-26 15:30:06] 🪙 Tokenizing text... +[2025-03-26 15:30:28] 🚫 Removing stopwords... +[2025-03-26 15:30:56] 🌱 Applying stemming... +[2025-03-26 15:32:48] 📝 Joining tokens back to text... +[2025-03-26 15:32:59] 🔢 Processing batch 49... +[2025-03-26 15:33:00] 🪙 Tokenizing text... +[2025-03-26 15:33:25] 🚫 Removing stopwords... +[2025-03-26 15:33:52] 🌱 Applying stemming... +[2025-03-26 15:35:40] 📝 Joining tokens back to text... +[2025-03-26 15:35:49] 🔢 Processing batch 50... +[2025-03-26 15:35:49] 🪙 Tokenizing text... +[2025-03-26 15:36:09] 🚫 Removing stopwords... +[2025-03-26 15:36:33] 🌱 Applying stemming... +[2025-03-26 15:38:12] 📝 Joining tokens back to text... +[2025-03-26 15:38:22] 🔢 Processing batch 51... +[2025-03-26 15:38:22] 🪙 Tokenizing text... +[2025-03-26 15:38:42] 🚫 Removing stopwords... +[2025-03-26 15:39:09] 🌱 Applying stemming... +[2025-03-26 15:40:52] 📝 Joining tokens back to text... +[2025-03-26 15:41:02] 🔢 Processing batch 52... +[2025-03-26 15:41:03] 🪙 Tokenizing text... +[2025-03-26 15:41:23] 🚫 Removing stopwords... +[2025-03-26 15:41:49] 🌱 Applying stemming... +[2025-03-26 15:43:36] 📝 Joining tokens back to text... +[2025-03-26 15:43:46] 🔢 Processing batch 53... +[2025-03-26 15:43:47] 🪙 Tokenizing text... +[2025-03-26 15:44:08] 🚫 Removing stopwords... +[2025-03-26 15:44:37] 🌱 Applying stemming... +[2025-03-26 15:46:41] 📝 Joining tokens back to text... +[2025-03-26 15:46:52] 🔢 Processing batch 54... +[2025-03-26 15:46:52] 🪙 Tokenizing text... +[2025-03-26 15:47:14] 🚫 Removing stopwords... +[2025-03-26 15:47:41] 🌱 Applying stemming... +[2025-03-26 15:49:43] 📝 Joining tokens back to text... +[2025-03-26 15:49:54] 🔢 Processing batch 55... +[2025-03-26 15:49:54] 🪙 Tokenizing text... +[2025-03-26 15:50:18] 🚫 Removing stopwords... +[2025-03-26 15:50:48] 🌱 Applying stemming... +[2025-03-26 15:52:41] 📝 Joining tokens back to text... +[2025-03-26 15:52:51] 🔢 Processing batch 56... +[2025-03-26 15:52:51] 🪙 Tokenizing text... +[2025-03-26 15:53:14] 🚫 Removing stopwords... +[2025-03-26 15:53:40] 🌱 Applying stemming... +[2025-03-26 15:55:33] 📝 Joining tokens back to text... +[2025-03-26 15:55:44] 🔢 Processing batch 57... +[2025-03-26 15:55:44] 🪙 Tokenizing text... +[2025-03-26 15:56:07] 🚫 Removing stopwords... +[2025-03-26 15:56:36] 🌱 Applying stemming... +[2025-03-26 15:58:33] 📝 Joining tokens back to text... +[2025-03-26 15:58:44] 🔢 Processing batch 58... +[2025-03-26 15:58:45] 🪙 Tokenizing text... +[2025-03-26 15:59:08] 🚫 Removing stopwords... +[2025-03-26 15:59:38] 🌱 Applying stemming... +[2025-03-26 16:01:33] 📝 Joining tokens back to text... +[2025-03-26 16:01:43] 🔢 Processing batch 59... +[2025-03-26 16:01:43] 🪙 Tokenizing text... +[2025-03-26 16:02:07] 🚫 Removing stopwords... +[2025-03-26 16:02:35] 🌱 Applying stemming... +[2025-03-26 16:04:53] 📝 Joining tokens back to text... +[2025-03-26 16:05:05] 🔢 Processing batch 60... +[2025-03-26 16:05:05] 🪙 Tokenizing text... +[2025-03-26 16:05:23] 🚫 Removing stopwords... +[2025-03-26 16:05:47] 🌱 Applying stemming... +[2025-03-26 16:07:20] 📝 Joining tokens back to text... +[2025-03-26 16:07:29] 🔢 Processing batch 61... +[2025-03-26 16:07:29] 🪙 Tokenizing text... +[2025-03-26 16:07:52] 🚫 Removing stopwords... +[2025-03-26 16:08:12] 🌱 Applying stemming... +[2025-03-26 16:09:52] 📝 Joining tokens back to text... +[2025-03-26 16:10:01] 🔢 Processing batch 62... +[2025-03-26 16:10:01] 🪙 Tokenizing text... +[2025-03-26 16:10:19] 🚫 Removing stopwords... +[2025-03-26 16:10:40] 🌱 Applying stemming... +[2025-03-26 16:12:10] 📝 Joining tokens back to text... +[2025-03-26 16:12:18] 🔢 Processing batch 63... +[2025-03-26 16:12:19] 🪙 Tokenizing text... +[2025-03-26 16:12:35] 🚫 Removing stopwords... +[2025-03-26 16:12:56] 🌱 Applying stemming... +[2025-03-26 16:14:25] 📝 Joining tokens back to text... +[2025-03-26 16:14:35] 🔢 Processing batch 64... +[2025-03-26 16:14:36] 🪙 Tokenizing text... +[2025-03-26 16:15:00] 🚫 Removing stopwords... +[2025-03-26 16:15:29] 🌱 Applying stemming... +[2025-03-26 16:17:47] 📝 Joining tokens back to text... +[2025-03-26 16:17:58] 🔢 Processing batch 65... +[2025-03-26 16:17:58] 🪙 Tokenizing text... +[2025-03-26 16:18:20] 🚫 Removing stopwords... +[2025-03-26 16:18:49] 🌱 Applying stemming... +[2025-03-26 16:20:46] 📝 Joining tokens back to text... +[2025-03-26 16:20:56] 🔢 Processing batch 66... +[2025-03-26 16:20:57] 🪙 Tokenizing text... +[2025-03-26 16:21:20] 🚫 Removing stopwords... +[2025-03-26 16:21:52] 🌱 Applying stemming... +[2025-03-26 16:23:53] 📝 Joining tokens back to text... +[2025-03-26 16:24:05] 🔢 Processing batch 67... +[2025-03-26 16:24:05] 🪙 Tokenizing text... +[2025-03-26 16:24:29] 🚫 Removing stopwords... +[2025-03-26 16:24:51] 🌱 Applying stemming... +[2025-03-26 16:26:26] 📝 Joining tokens back to text... +[2025-03-26 16:26:35] 🔢 Processing batch 68... +[2025-03-26 16:26:35] 🪙 Tokenizing text... +[2025-03-26 16:26:56] 🚫 Removing stopwords... +[2025-03-26 16:27:22] 🌱 Applying stemming... +[2025-03-26 16:29:06] 📝 Joining tokens back to text... +[2025-03-26 16:29:16] 🔢 Processing batch 69... +[2025-03-26 16:29:17] 🪙 Tokenizing text... +[2025-03-26 16:29:35] 🚫 Removing stopwords... +[2025-03-26 16:30:00] 🌱 Applying stemming... +[2025-03-26 16:31:41] 📝 Joining tokens back to text... +[2025-03-26 16:31:51] 🔢 Processing batch 70... +[2025-03-26 16:31:51] 🪙 Tokenizing text... +[2025-03-26 16:32:11] 🚫 Removing stopwords... +[2025-03-26 16:32:35] 🌱 Applying stemming... +[2025-03-26 16:34:13] 📝 Joining tokens back to text... +[2025-03-26 16:34:23] 🔢 Processing batch 71... +[2025-03-26 16:34:23] 🪙 Tokenizing text... +[2025-03-26 16:34:45] 🚫 Removing stopwords... +[2025-03-26 16:35:13] 🌱 Applying stemming... +[2025-03-26 16:36:58] 📝 Joining tokens back to text... +[2025-03-26 16:37:08] 🔢 Processing batch 72... +[2025-03-26 16:37:08] 🪙 Tokenizing text... +[2025-03-26 16:37:33] 🚫 Removing stopwords... +[2025-03-26 16:37:59] 🌱 Applying stemming... +[2025-03-26 16:39:35] 📝 Joining tokens back to text... +[2025-03-26 16:39:45] 🔢 Processing batch 73... +[2025-03-26 16:39:45] 🪙 Tokenizing text... +[2025-03-26 16:40:06] 🚫 Removing stopwords... +[2025-03-26 16:40:32] 🌱 Applying stemming... +[2025-03-26 16:42:13] 📝 Joining tokens back to text... +[2025-03-26 16:42:24] 🔢 Processing batch 74... +[2025-03-26 16:42:25] 🪙 Tokenizing text... +[2025-03-26 16:42:46] 🚫 Removing stopwords... +[2025-03-26 16:43:12] 🌱 Applying stemming... +[2025-03-26 16:44:51] 📝 Joining tokens back to text... +[2025-03-26 16:45:01] 🔢 Processing batch 75... +[2025-03-26 16:45:01] 🪙 Tokenizing text... +[2025-03-26 16:45:23] 🚫 Removing stopwords... +[2025-03-26 16:45:48] 🌱 Applying stemming... +[2025-03-26 16:47:28] 📝 Joining tokens back to text... +[2025-03-26 16:47:39] 🔢 Processing batch 76... +[2025-03-26 16:47:39] 🪙 Tokenizing text... +[2025-03-26 16:48:00] 🚫 Removing stopwords... +[2025-03-26 16:48:31] 🌱 Applying stemming... +[2025-03-26 16:50:15] 📝 Joining tokens back to text... +[2025-03-26 16:50:25] 🔢 Processing batch 77... +[2025-03-26 16:50:25] 🪙 Tokenizing text... +[2025-03-26 16:50:52] 🚫 Removing stopwords... +[2025-03-26 16:51:18] 🌱 Applying stemming... +[2025-03-26 16:53:01] 📝 Joining tokens back to text... +[2025-03-26 16:53:11] 🔢 Processing batch 78... +[2025-03-26 16:53:11] 🪙 Tokenizing text... +[2025-03-26 16:53:33] 🚫 Removing stopwords... +[2025-03-26 16:54:00] 🌱 Applying stemming... +[2025-03-26 16:55:40] 📝 Joining tokens back to text... +[2025-03-26 16:55:50] 🔢 Processing batch 79... +[2025-03-26 16:55:51] 🪙 Tokenizing text... +[2025-03-26 16:56:11] 🚫 Removing stopwords... +[2025-03-26 16:56:38] 🌱 Applying stemming... +[2025-03-26 16:58:24] 📝 Joining tokens back to text... +[2025-03-26 16:58:34] 🔢 Processing batch 80... +[2025-03-26 16:58:35] 🪙 Tokenizing text... +[2025-03-26 16:58:55] 🚫 Removing stopwords... +[2025-03-26 16:59:22] 🌱 Applying stemming... +[2025-03-26 17:01:05] 📝 Joining tokens back to text... +[2025-03-26 17:01:15] 🔢 Processing batch 81... +[2025-03-26 17:01:16] 🪙 Tokenizing text... +[2025-03-26 17:01:37] 🚫 Removing stopwords... +[2025-03-26 17:02:05] 🌱 Applying stemming... +[2025-03-26 17:03:55] 📝 Joining tokens back to text... +[2025-03-26 17:04:06] 🔢 Processing batch 82... +[2025-03-26 17:04:07] 🪙 Tokenizing text... +[2025-03-26 17:04:34] 🚫 Removing stopwords... +[2025-03-26 17:05:08] 🌱 Applying stemming... +[2025-03-26 17:07:03] 📝 Joining tokens back to text... +[2025-03-26 17:07:14] 🔢 Processing batch 83... +[2025-03-26 17:07:15] 🪙 Tokenizing text... +[2025-03-26 17:07:40] 🚫 Removing stopwords... +[2025-03-26 17:08:08] 🌱 Applying stemming... +[2025-03-26 17:10:06] 📝 Joining tokens back to text... +[2025-03-26 17:10:18] 🔢 Processing batch 84... +[2025-03-26 17:10:19] 🪙 Tokenizing text... +[2025-03-26 17:10:46] 🚫 Removing stopwords... +[2025-03-26 17:11:17] 🌱 Applying stemming... +[2025-03-26 17:13:35] 📝 Joining tokens back to text... +[2025-03-26 17:13:48] 🔢 Processing batch 85... +[2025-03-26 17:13:49] 🪙 Tokenizing text... +[2025-03-26 17:14:19] 🚫 Removing stopwords... +[2025-03-26 17:14:53] 🌱 Applying stemming... +[2025-03-26 17:17:16] 📝 Joining tokens back to text... +[2025-03-26 17:17:28] 🔢 Processing batch 86... +[2025-03-26 17:17:28] 🪙 Tokenizing text... +[2025-03-26 17:17:43] 🚫 Removing stopwords... +[2025-03-26 17:17:57] 🌱 Applying stemming... +[2025-03-26 17:18:44] 📝 Joining tokens back to text... +[2025-03-26 17:26:42] 💾 Processed data saved to '../data/processed_fakenews.parquet' and '../data/processed_fakenews.csv' +[2025-03-26 17:26:42] 📊 Total words (the raw number of all words in the text, including duplicates): 3,307,195,209 +⏮️ Before stopword removal: 3,307,195,209 +🔻 After stopword removal: 1,744,854,554 (-47.24%) +[2025-03-26 17:26:42] 🫆 Vocabulary (the number of distinct words in the text, ignoring duplicates): +⏮️ Before stemming: 2,767,790 +🔻 After stemming: 2,415,853 (-12.71%) +[2025-03-26 17:26:42] 📏 Avg. length of retained words: +⏮️ After stopword removal: 6.34 +🔻 After stemming: 5.41 (-14.74%) +[2025-03-26 17:27:57] 📌 Top 10 words: +🔝 Before preprocessing: [('the', 220550046), ('of', 106480206), ('to', 106216779), ('and', 96588260), ('a', 83333254), ('in', 73132963), ('that', 45117566), ('is', 42309500), ('for', 36971267), ('on', 29213684)] +🔝 After stopword removal: [('new', 8599601), ('one', 8315754), ('would', 8145653), ('said', 7354978), ('people', 5996078), ('also', 5692918), ('like', 5565201), ('even', 4472256), ('us', 4463611), ('could', 4114863)] +🔝 After stemming: [('new', 8600723), ('one', 8599171), ('would', 8145683), ('said', 7355057), ('like', 6797658), ('state', 6085922), ('peopl', 6060566), ('use', 5697023), ('also', 5692967), ('time', 5630219)] diff --git a/archives/fnc1a.png b/archives/fnc1a.png new file mode 100644 index 0000000000000000000000000000000000000000..12a3b00873cfd48639f06005a4aec355e594251a GIT binary patch literal 124514 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�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 literal 0 HcmV?d00001 diff --git a/archives/fnc1b.log b/archives/fnc1b.log new file mode 100644 index 0000000..fdba991 --- /dev/null +++ b/archives/fnc1b.log @@ -0,0 +1,6 @@ +nohup: ignoring input +🔍 Loading data from Parquet file at 'processed_fakenews.parquet' +🔍 Dataset contains 8,528,956 rows. +📉 Reducing dataset from 8,528,956 to 852,895 rows... +✅ Sample contains 852,895 rows (expected 852,895 rows) +💾 Sample saved to 'sampled_fakenews.csv' and 'sampled_fakenews.parquet'. diff --git a/src/fnc1a.py b/src/fnc1a.py index c81d7b8..3527d4c 100644 --- a/src/fnc1a.py +++ b/src/fnc1a.py @@ -1,27 +1,205 @@ -import random +import numpy as np import pandas as pd +import spacy +import nltk +import matplotlib.pyplot as plt +from nltk.corpus import stopwords +from nltk.stem import PorterStemmer +from collections import Counter +from pandarallel import pandarallel +import multiprocessing import os -import subprocess +import pyarrow.parquet as pq +import pyarrow as pa +from datetime import datetime -data_path = "./FNC/news_cleaned_2018_02_13.csv" -sample_path = "sampled_news" -SAMPLE_FRACTION = 0.001 # Use 0.001 for 0.1% of the dataset +# Print log messages with timestamp +def print_log(msg): + print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {msg}") -if not os.path.exists(data_path): - print(f"❌ Error: File not found at {data_path}") +# Download NLTK stopwords +nltk.download('stopwords') + +# Load spaCy model +print_log("📚 Loading spaCy model...") +try: + nlp = spacy.load("en_core_web_sm", disable=["parser", "ner"]) +except OSError: + import subprocess + print_log("⬇️ Model not found. Downloading...") + subprocess.run(["python", "-m", "spacy", "download", "en_core_web_sm"]) + nlp = spacy.load("en_core_web_sm") +print_log("📖 spaCy model loaded.") + +# Paths +csv_path = "../data/news_cleaned_2018_02_13.csv" +parquet_path = "../data/news_cleaned_2018_02_13.parquet" +output_parquet = "../data/processed_fakenews.parquet" +output_csv = "../data/processed_fakenews.csv" + +# Convert CSV to Parquet if needed +if os.path.exists(parquet_path): + data_path = parquet_path +elif os.path.exists(csv_path): + print_log("🔄 Converting CSV to Parquet...") + + chunksize=1e5 + pqwriter = None + for i, df in enumerate(pd.read_csv(csv_path, lineterminator="\n", on_bad_lines="skip", chunksize=chunksize, usecols=["id", "content", "type"])): + table = pa.Table.from_pandas(df) + # If it's the first chunk, create a new parquet writer + if i == 0: + pqwriter = pq.ParquetWriter(parquet_path, table.schema) + pqwriter.write_table(table) + + if pqwriter: + pqwriter.close() + + print_log("✅ Conversion complete.") + data_path = parquet_path +else: + print_log("❌ Error: No dataset found.") exit() -# Get total rows. Only works on Unix-like systems due to `wc` command -total_rows = int(subprocess.check_output(["wc", "-l", data_path]).split()[0]) - 1 -print(f"🔍 Dataset contains {total_rows:,} rows.") +# Stopwords & Stemmer +stop_words = set(stopwords.words("english")) +stemmer = PorterStemmer() -sample_size = int(total_rows * SAMPLE_FRACTION) -print(f"📉 Reducing dataset to {sample_size:,} rows...") +# Initialize parallel processing +# !WARNING: This will use all available CPU cores, might kill host machine +# Set progress_bar=True to see a progress bar +pandarallel.initialize(nb_workers=max(1, int(multiprocessing.cpu_count())), progress_bar=False) -# Read only a sample -skip_rows = sorted(random.sample(range(1, total_rows + 1), total_rows - sample_size)) -df_sample = pd.read_csv(data_path, skiprows=skip_rows, lineterminator="\n", on_bad_lines="skip") -df_sample.to_csv(f"{sample_path}.csv", index=False) -df_sample.to_parquet(f"{sample_path}.parquet", index=False) +batch_size = 100000 +parquet_file = pq.ParquetFile(data_path) -print("✅ Sample saved to sampled_news.csv and sampled_news.parquet.") +processed_chunks = [] +vocab_before = Counter() +vocab_after_stopwords = Counter() +vocab_after_stemming = Counter() +total_words_before = 0 +total_words_after_stopwords = 0 +total_words_after_stemming = 0 +total_chars_after_stopwords = 0 +total_chars_after_stemming = 0 + +# Process text in batches +print_log("🧮 Processing text in batches...") +batch_num = 0 +for batch in parquet_file.iter_batches(batch_size): + print_log(f"🔢 Processing batch {batch_num + 1}...") + chunk = batch.to_pandas() + chunk = chunk.dropna(subset=["content"]).astype({'content': 'string'}) + + # Tokenize, remove stopwords, and apply stemming + print_log("🪙 Tokenizing text...") + chunk_tokens = chunk["content"].parallel_apply(lambda text: [word.lower() for word in text.split() if word.isalpha()]) + for tokens in chunk_tokens: + vocab_before.update(tokens) + total_words_before += len(tokens) + + print_log("🚫 Removing stopwords...") + chunk_no_stopwords = chunk_tokens.parallel_apply(lambda tokens: [word for word in tokens if word not in stop_words]) + for tokens in chunk_no_stopwords: + vocab_after_stopwords.update(tokens) + total_words_after_stopwords += len(tokens) + total_chars_after_stopwords += sum(len(word) for word in tokens) + + print_log("🌱 Applying stemming...") + chunk_stemmed = chunk_no_stopwords.parallel_apply(lambda tokens: [stemmer.stem(word) for word in tokens]) + for tokens in chunk_stemmed: + vocab_after_stemming.update(tokens) + total_words_after_stemming += len(tokens) + total_chars_after_stemming += sum(len(word) for word in tokens) + + # Join tokens back to text + print_log("📝 Joining tokens back to text...") + chunk["processed_text"] = chunk_stemmed.parallel_apply(lambda tokens: ' '.join(tokens)) + processed_chunks.append(chunk[["id", "processed_text", "type"]]) + batch_num += 1 + +# Save processed data +final_df = pd.concat(processed_chunks, ignore_index=True) +final_df.to_parquet(output_parquet, index=False) +final_df.to_csv(output_csv, index=False) + +print_log(f"💾 Processed data saved to '{output_parquet}' and '{output_csv}'") + +# Print statistics +total_vocab_before = len(vocab_before) +total_vocab_after_stopwords = len(vocab_after_stopwords) +total_vocab_after_stemming = len(vocab_after_stemming) + +total_stopword_reduction = (total_words_before - total_words_after_stopwords) / total_words_before * 100 +print_log(f"📊 Total words (the raw number of all words in the text, including duplicates): {total_words_before:,}") +print(f"⏮️ Before stopword removal: {total_words_before:,}") +print(f"🔻 After stopword removal: {total_words_after_stopwords:,} (-{total_stopword_reduction:.2f}%)") + +vocab_stemming_reduction = (total_vocab_after_stopwords - total_vocab_after_stemming) / total_vocab_after_stopwords * 100 +print_log(f"🫆 Vocabulary (the number of distinct words in the text, ignoring duplicates):") +print(f"⏮️ Before stemming: {total_vocab_before:,}") +print(f"🔻 After stemming: {total_vocab_after_stemming:,} (-{vocab_stemming_reduction:.2f}%)") + +avg_chars_after_stopwords = total_chars_after_stopwords / total_words_after_stopwords +avg_chars_after_stemming = total_chars_after_stemming / total_words_after_stemming +avg_chars_reduction = (avg_chars_after_stopwords - avg_chars_after_stemming) / avg_chars_after_stopwords * 100 +print_log(f"📏 Avg. length of retained words:") +print(f"⏮️ After stopword removal: {avg_chars_after_stopwords:.2f}") +print(f"🔻 After stemming: {avg_chars_after_stemming:.2f} (-{avg_chars_reduction:.2f}%)") + +# Get most frequent words before and after stopword removal & stemming +def get_most_frequent_words(vocab, top_n=10): + return vocab.most_common(top_n) + +top_words_before = get_most_frequent_words(vocab_before) +top_words_after_stopwords = get_most_frequent_words(vocab_after_stopwords) +top_words_after_stemming = get_most_frequent_words(vocab_after_stemming) + +print_log("📌 Top 10 words:") +print("🔝 Before preprocessing:", top_words_before) +print("🔝 After stopword removal:", top_words_after_stopwords) +print("🔝 After stemming:", top_words_after_stemming) + +def plot_word_frequencies(vocab_before, vocab_after_stopwords, vocab_after_stemming, top_n=10000): + plt.figure(figsize=(12, 7)) + + freq_before = [freq for _, freq in vocab_before.most_common(top_n)] + freq_after_stopwords = [freq for _, freq in vocab_after_stopwords.most_common(top_n)] + freq_after_stemming = [freq for _, freq in vocab_after_stemming.most_common(top_n)] + + plt.loglog(range(1, len(freq_before)+1), freq_before, + label='Raw Text', color='royalblue', alpha=0.8, linewidth=2) + plt.loglog(range(1, len(freq_after_stopwords)+1), freq_after_stopwords, + label='After Stopword Removal', color='orange', alpha=0.8, linewidth=2) + plt.loglog(range(1, len(freq_after_stemming)+1), freq_after_stemming, + label='After Stemming', color='green', alpha=0.8, linewidth=2) + + # Add Zipf's law reference line + zipf_x = np.array(range(1, top_n+1)) + zipf_y = freq_before[0] / zipf_x + plt.plot(zipf_x, zipf_y, 'r--', label="Zipf's Law", alpha=0.5) + + top_words = [word for word, _ in vocab_before.most_common(5)] + for rank, word in enumerate(top_words, 1): + freq = vocab_before[word] + plt.annotate(word, xy=(rank, freq), xytext=(rank*1.5, freq*1.5), + arrowprops=dict(facecolor='black', shrink=0.05, width=1, headwidth=4), + fontsize=9, bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="gray", lw=1)) + + plt.title('Word Frequency Distribution (Log-Log Scale)', fontsize=14, pad=20) + plt.xlabel('Word Rank (Log Scale)', fontsize=12) + plt.ylabel('Frequency (Log Scale)', fontsize=12) + plt.grid(True, which="both", ls="-", alpha=0.2) + plt.legend(fontsize=11) + + plt.text(0.02, 0.02, + "• Steep drop at left = Stopwords dominate\n" + "• Flatter curve after processing = Better balance\n" + "• Close to Zipf's line = Natural language pattern", + transform=plt.gca().transAxes, fontsize=10, + bbox=dict(boxstyle="round", fc="white", ec="gray", pad=0.4)) + + plt.tight_layout() + plt.show() + +plot_word_frequencies(vocab_before, vocab_after_stopwords, vocab_after_stemming) \ No newline at end of file diff --git a/src/fnc1b.py b/src/fnc1b.py index d8d0164..796fecd 100644 --- a/src/fnc1b.py +++ b/src/fnc1b.py @@ -1,182 +1,75 @@ -import numpy as np +import random import pandas as pd -import spacy -import nltk -import matplotlib.pyplot as plt -from nltk.corpus import stopwords -from nltk.stem import PorterStemmer -from collections import Counter -from pandarallel import pandarallel -import multiprocessing import os +import subprocess +import pyarrow as pa import pyarrow.parquet as pq -# Download NLTK stopwords -nltk.download('stopwords') +parquet_path = "../data/processed_fakenews.parquet" +csv_path = "../data/processed_fakenews.csv" +sample_path = "../data/sampled_fakenews" +SAMPLE_FRACTION = 0.1 +RANDOM_SEED = 42 # For reproducibility -# Paths -csv_path = "sampled_news.csv" -parquet_path = "sampled_news_sm.parquet" -output_parquet = "processed_fakenews.parquet" -output_csv = "processed_fakenews.csv" +def get_sample_size(total_rows, log=False): + sample_size = int(total_rows * SAMPLE_FRACTION) + if log: + print(f"📉 Reducing dataset from {total_rows:,} to {sample_size:,} rows...") + return sample_size -# Convert CSV to Parquet if needed +def sample_dataframe(df, total_rows): + sample_size = get_sample_size(total_rows=total_rows, log=True) + return df.sample(n=sample_size, random_state=RANDOM_SEED) + +# Try to load from Parquet first, fall back to CSV if not available if os.path.exists(parquet_path): - data_path = parquet_path + print(f"🔍 Loading data from Parquet file at '{parquet_path}'") + try: + # Read metadata to get row count without loading entire file + parquet_file = pq.ParquetFile(parquet_path) + total_rows = parquet_file.metadata.num_rows + print(f"🔍 Dataset contains {total_rows:,} rows.") + + # Read and sample the data + df_sample = sample_dataframe(pd.read_parquet(parquet_path), total_rows) + + except Exception as e: + print(f"❌ Error reading Parquet file: {e}") + print("🔄 Falling back to CSV...") + if not os.path.exists(csv_path): + print(f"❌ Error: Neither Parquet nor CSV file found at {parquet_path} or {csv_path}") + exit() + + # Get total rows from CSV (Unix-like systems only due to `wc`) + total_rows = int(subprocess.check_output(["wc", "-l", csv_path]).split()[0]) - 1 + print(f"🔍 Dataset contains {total_rows:,} rows.") + + # Read and sample the data + df_sample = sample_dataframe( + pd.read_csv(csv_path, lineterminator="\n", on_bad_lines="skip"), + total_rows + ) + elif os.path.exists(csv_path): - print("🔄 Converting CSV to Parquet...") - df = pd.read_csv(csv_path, lineterminator="\n", on_bad_lines="skip", usecols=["id", "content", "type"]) - df.to_parquet(parquet_path, index=False) - print("✅ Conversion complete.") - data_path = parquet_path + print(f"🔍 Parquet file not found, loading from CSV at {csv_path}") + # Get total rows from CSV (Unix-like systems only due to `wc`) + total_rows = int(subprocess.check_output(["wc", "-l", csv_path]).split()[0]) - 1 + print(f"🔍 Dataset contains {total_rows:,} rows.") + + # Read and sample the data + df_sample = sample_dataframe( + pd.read_csv(csv_path, lineterminator="\n", on_bad_lines="skip"), + total_rows + ) else: - print("❌ Error: No dataset found.") + print(f"❌ Error: Neither Parquet nor CSV file found at {parquet_path} or {csv_path}") exit() -# Load spaCy model -print("📚 Loading spaCy model...") -try: - nlp = spacy.load("en_core_web_sm", disable=["parser", "ner"]) -except OSError: - import subprocess - print("⬇️ Model not found. Downloading...") - subprocess.run(["python", "-m", "spacy", "download", "en_core_web_sm"]) - nlp = spacy.load("en_core_web_sm") -print("📖 spaCy model loaded.") +# Verify the sample size +print(f"✅ Sample contains {len(df_sample):,} rows (expected {get_sample_size(total_rows=total_rows):,} rows)") -# Stopwords & Stemmer -stop_words = set(stopwords.words("english")) -stemmer = PorterStemmer() +# Save the sample in both formats +df_sample.to_csv(f"{sample_path}.csv", index=False) +df_sample.to_parquet(f"{sample_path}.parquet", index=False) -# Initialize parallel processing -pandarallel.initialize(nb_workers=max(1, int(multiprocessing.cpu_count() / 2)), progress_bar=True) - -batch_size = 100000 -parquet_file = pq.ParquetFile(data_path) - -processed_chunks = [] -vocab_before = Counter() -vocab_after_stopwords = Counter() -vocab_after_stemming = Counter() -total_words_before = 0 -total_words_after_stopwords = 0 -total_words_after_stemming = 0 - -total_chars_after_stopwords = 0 -total_chars_after_stemming = 0 - -print("🧮 Processing text in batches...") -batch_num = 0 -for batch in parquet_file.iter_batches(batch_size): - print(f"🔢 Processing batch {batch_num + 1}...") - chunk = batch.to_pandas() - chunk = chunk.dropna(subset=["content"]).astype({'content': 'string'}) - - print("🪙 Tokenizing text...") - chunk_tokens = chunk["content"].parallel_apply(lambda text: [word.lower() for word in text.split() if word.isalpha()]) - for tokens in chunk_tokens: - vocab_before.update(tokens) - total_words_before += len(tokens) - - print("🚫 Removing stopwords...") - chunk_no_stopwords = chunk_tokens.parallel_apply(lambda tokens: [word for word in tokens if word not in stop_words]) - for tokens in chunk_no_stopwords: - vocab_after_stopwords.update(tokens) - total_words_after_stopwords += len(tokens) - total_chars_after_stopwords += sum(len(word) for word in tokens) - - print("🌱 Applying stemming...") - chunk_stemmed = chunk_no_stopwords.parallel_apply(lambda tokens: [stemmer.stem(word) for word in tokens]) - for tokens in chunk_stemmed: - vocab_after_stemming.update(tokens) - total_words_after_stemming += len(tokens) - total_chars_after_stemming += sum(len(word) for word in tokens) - - print("📝 Joining tokens back to text...") - chunk["processed_text"] = chunk_stemmed.parallel_apply(lambda tokens: ' '.join(tokens)) - processed_chunks.append(chunk[["id", "processed_text", "type"]]) - batch_num += 1 - -# Save processed data -final_df = pd.concat(processed_chunks, ignore_index=True) -final_df.to_parquet(output_parquet, index=False) -final_df.to_csv(output_csv, index=False) - -print(f"💾 Processed data saved to '{output_parquet}' and '{output_csv}'") - -total_vocab_before = len(vocab_before) -total_vocab_after_stopwords = len(vocab_after_stopwords) -total_vocab_after_stemming = len(vocab_after_stemming) - -total_stopword_reduction = (total_words_before - total_words_after_stopwords) / total_words_before * 100 -print(f"📊 Total words (the raw number of all words in the text, including duplicates): {total_words_before:,}") -print(f"⏮️ Before stopword removal: {total_words_before:,}") -print(f"🔻 After stopword removal: {total_words_after_stopwords:,} (-{total_stopword_reduction:.2f}%)") - -vocab_stemming_reduction = (total_vocab_after_stopwords - total_vocab_after_stemming) / total_vocab_after_stopwords * 100 -print(f"🫆 Vocabulary (the number of distinct words in the text, ignoring duplicates):") -print(f"⏮️ Before stemming: {total_vocab_before:,}") -print(f"🔻 After stemming: {total_vocab_after_stemming:,} (-{vocab_stemming_reduction:.2f}%)") - -avg_chars_after_stopwords = total_chars_after_stopwords / total_words_after_stopwords -avg_chars_after_stemming = total_chars_after_stemming / total_words_after_stemming -avg_chars_reduction = (avg_chars_after_stopwords - avg_chars_after_stemming) / avg_chars_after_stopwords * 100 -print(f"📏 Avg. length of retained words:") -print(f"⏮️ After stopword removal: {avg_chars_after_stopwords:.2f}") -print(f"🔻 After stemming: {avg_chars_after_stemming:.2f} (-{avg_chars_reduction:.2f}%)") - -# Get most frequent words before and after stopword removal & stemming -def get_most_frequent_words(vocab, top_n=10): - return vocab.most_common(top_n) - -top_words_before = get_most_frequent_words(vocab_before) -top_words_after_stopwords = get_most_frequent_words(vocab_after_stopwords) -top_words_after_stemming = get_most_frequent_words(vocab_after_stemming) - -print("📌 Top 10 words before preprocessing:", top_words_before) -print("📌 Top 10 words after stopword removal:", top_words_after_stopwords) -print("📌 Top 10 words after stemming:", top_words_after_stemming) - -def plot_word_frequencies(vocab_before, vocab_after_stopwords, vocab_after_stemming, top_n=10000): - plt.figure(figsize=(12, 7)) - - freq_before = [freq for _, freq in vocab_before.most_common(top_n)] - freq_after_stopwords = [freq for _, freq in vocab_after_stopwords.most_common(top_n)] - freq_after_stemming = [freq for _, freq in vocab_after_stemming.most_common(top_n)] - - plt.loglog(range(1, len(freq_before)+1), freq_before, - label='Raw Text', color='royalblue', alpha=0.8, linewidth=2) - plt.loglog(range(1, len(freq_after_stopwords)+1), freq_after_stopwords, - label='After Stopword Removal', color='orange', alpha=0.8, linewidth=2) - plt.loglog(range(1, len(freq_after_stemming)+1), freq_after_stemming, - label='After Stemming', color='green', alpha=0.8, linewidth=2) - - # Add Zipf's law reference line - zipf_x = np.array(range(1, top_n+1)) - zipf_y = freq_before[0] / zipf_x - plt.plot(zipf_x, zipf_y, 'r--', label="Zipf's Law", alpha=0.5) - - top_words = [word for word, _ in vocab_before.most_common(5)] - for rank, word in enumerate(top_words, 1): - freq = vocab_before[word] - plt.annotate(word, xy=(rank, freq), xytext=(rank*1.5, freq*1.5), - arrowprops=dict(facecolor='black', shrink=0.05, width=1, headwidth=4), - fontsize=9, bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="gray", lw=1)) - - plt.title('Word Frequency Distribution (Log-Log Scale)', fontsize=14, pad=20) - plt.xlabel('Word Rank (Log Scale)', fontsize=12) - plt.ylabel('Frequency (Log Scale)', fontsize=12) - plt.grid(True, which="both", ls="-", alpha=0.2) - plt.legend(fontsize=11) - - plt.text(0.02, 0.02, - "• Steep drop at left = Stopwords dominate\n" - "• Flatter curve after processing = Better balance\n" - "• Close to Zipf's line = Natural language pattern", - transform=plt.gca().transAxes, fontsize=10, - bbox=dict(boxstyle="round", fc="white", ec="gray", pad=0.4)) - - plt.tight_layout() - plt.show() - -plot_word_frequencies(vocab_before, vocab_after_stopwords, vocab_after_stemming) \ No newline at end of file +print(f"💾 Sample saved to '{sample_path}.csv' and '{sample_path}.parquet'.") \ No newline at end of file diff --git a/src/parquet_validator.py b/src/parquet_validator.py new file mode 100644 index 0000000..d4adc4b --- /dev/null +++ b/src/parquet_validator.py @@ -0,0 +1,19 @@ +# Validate if a parquet file is valid or not, and print out some information about the file. +import pyarrow.parquet as pq + +def validate_parquet_file(file_path): + parquet_file = None + try: + parquet_file = pq.ParquetFile(file_path) + print(f"✅ The file '{file_path}' is a valid Parquet file.") + except Exception as e: + print(f"❌ The file '{file_path}' is not a valid Parquet file.") + print(f"Error: {e}") + + print(f" - Column Names: {parquet_file.schema}") + print(f" - File Metadata: {parquet_file.metadata}") + +# Example usage: +validate_parquet_file("../data/processed_fakenews.parquet") +validate_parquet_file("../data/sampled_fakenews.parquet") +