Files
fineweb-eda/nb.ipynb
2025-11-28 16:11:49 +05:30

358 lines
54 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"id": "ccfdbb24",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from datasets import load_dataset"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "e21fae62",
"metadata": {},
"outputs": [],
"source": [
"OUTPUT_DIR = \"./dataset\"\n",
"FILE_PATH = os.path.join(OUTPUT_DIR, \"fineweb-6b.parquet\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "bb9c37b2",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Generating train split: 8548517 examples [00:20, 417303.96 examples/s]\n"
]
},
{
"data": {
"text/plain": [
"Dataset({\n",
" features: ['text', 'meta', 'id'],\n",
" num_rows: 8548517\n",
"})"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dataset = load_dataset(\"parquet\", data_files={\n",
" \"train\": FILE_PATH\n",
"}, split=\"train\")\n",
"dataset"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "917999bb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'text': Value('string'),\n",
" 'meta': {'url': Value('string'),\n",
" 'dump': Value('string'),\n",
" 's_cluster': Value('int64'),\n",
" 'token_count': Value('int64')},\n",
" 'id': Value('string')}"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dataset.features"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "1f6addf9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'id': '<urn:uuid:d66bc6fe-8477-4adf-b430-f6a558ccc8ff>',\n",
" 'meta': {'dump': None, 's_cluster': None, 'token_count': None, 'url': None},\n",
" 'text': 'How AP reported in all formats from tornado-stricken regionsMarch 8, '\n",
" '2012\\n'\n",
" 'When the first serious bout of tornadoes of 2012 blew through middle '\n",
" 'America in the middle of the night, they touched down in places '\n",
" 'hours from any AP bureau. Our closest video journalist was '\n",
" 'Chicago-based Robert Ray, who dropped his plans to travel to Georgia '\n",
" 'for Super Tuesday, booked several flights to the cities closest to '\n",
" 'the strikes and headed for the airport. Hed decide once there which '\n",
" 'flight to take.\\n'\n",
" 'He never got on board a plane. Instead, he ended up driving toward '\n",
" 'Harrisburg, Ill., where initial reports suggested a town was '\n",
" 'destroyed. That decision turned out to be a lucky break for the AP. '\n",
" 'Twice.\\n'\n",
" 'Ray was among the first journalists to arrive and he confirmed those '\n",
" 'reports -- in all formats. He shot powerful video, put victims on '\n",
" 'the phone with AP Radio and played back sound to an editor who '\n",
" 'transcribed the interviews and put the material on text wires. He '\n",
" 'then walked around the devastation with the Central Regional Desk on '\n",
" 'the line, talking to victims with the phone held so close that '\n",
" 'editors could transcribe his interviews in real time.\\n'\n",
" 'Ray also made a dramatic image of a young girl who found a mans '\n",
" 'prosthetic leg in the rubble, propped it up next to her destroyed '\n",
" 'home and spray-painted an impromptu sign: “Found leg. Seriously.”\\n'\n",
" 'The following day, he was back on the road and headed for Georgia '\n",
" 'and a Super Tuesday date with Newt Gingrichs campaign. The drive '\n",
" 'would take him through a stretch of the South that forecasters '\n",
" 'expected would suffer another wave of tornadoes.\\n'\n",
" 'To prevent running into THAT storm, Ray used his iPhone to monitor '\n",
" 'Doppler radar, zooming in on extreme cells and using Google maps to '\n",
" 'direct himself to safe routes. And then the journalist took over '\n",
" 'again.\\n'\n",
" '“When weather like that occurs, a reporter must seize the '\n",
" 'opportunity to get the news out and allow people to see, hear and '\n",
" 'read the power of nature so that they can take proper shelter,” Ray '\n",
" 'says.\\n'\n",
" 'So Ray now started to use his phone to follow the storms. He '\n",
" 'attached a small GoPro camera to his steering wheel in case a '\n",
" 'tornado dropped down in front of the car somewhere, and took video '\n",
" 'of heavy rain and hail with his iPhone. Soon, he spotted a tornado '\n",
" 'and the chase was on. He followed an unmarked emergency vehicle to '\n",
" \"Cleveland, Tenn., where he was first on the scene of the storm's \"\n",
" 'aftermath.\\n'\n",
" 'Again, the tornadoes had struck in locations that were hours from '\n",
" 'the nearest AP bureau. Damage and debris, as well as a wickedly '\n",
" 'violent storm that made travel dangerous, slowed our efforts to get '\n",
" 'to the news. That wasnt a problem in Tennessee, where our customers '\n",
" 'were well served by an all-formats report that included this text '\n",
" 'story.\\n'\n",
" '“CLEVELAND, Tenn. (AP) _ Fierce wind, hail and rain lashed Tennessee '\n",
" 'for the second time in three days, and at least 15 people were '\n",
" 'hospitalized Friday in the Chattanooga area.”\\n'\n",
" 'The byline? Robert Ray.\\n'\n",
" 'For being adept with technology, chasing after news as it literally '\n",
" 'dropped from the sky and setting a standard for all-formats '\n",
" 'reporting that put the AP ahead on the most competitive news story '\n",
" 'of the day, Ray wins this weeks $300 Best of the States prize.\\n'\n",
" '© 2013 The Associated Press. All rights reserved. Terms and '\n",
" 'conditions apply. See AP.org for details.'}\n"
]
}
],
"source": [
"from pprint import pprint\n",
"pprint(dataset[0])"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "f3dbfcf5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"728"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(tokenizer(dataset[0]['text'])['input_ids'])"
]
},
{
"cell_type": "markdown",
"id": "18bc69d9",
"metadata": {},
"source": [
"# **Document Length Analysis**\n",
"> Understanding length of the document is crucial for setting effective padding/truncation strategies during training."
]
},
{
"cell_type": "markdown",
"id": "1ef0cdc6",
"metadata": {},
"source": [
"**A. Apply tokenizer and map**\n",
"- We'll use `map` function to calculate the token count for every document\n",
"- We'll store it in a new column\n",
" - hf's `map` is highly optimized and works well with large datasets"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "d83540a8",
"metadata": {},
"outputs": [],
"source": [
"from transformers import AutoTokenizer"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "ea3aaf18",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Map (num_proc=24): 0%| | 57/8548517 [00:03<126:46:39, 18.73 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (8502 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 238/8548517 [00:03<24:01:39, 98.82 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (9849 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 1598/8548517 [00:03<2:03:15, 1155.63 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (9183 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 7328/8548517 [00:05<43:17, 3287.81 examples/s] Token indices sequence length is longer than the specified maximum sequence length for this model (11389 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 7680/8548517 [00:05<47:08, 3020.02 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (30422 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 9837/8548517 [00:06<34:08, 4169.10 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (10627 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 17071/8548517 [00:07<23:41, 6002.42 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (11265 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 17697/8548517 [00:07<23:45, 5986.02 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (9853 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 21964/8548517 [00:08<19:57, 7118.45 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (8480 > 8192). Running this sequence through the model will result in indexing errors\n",
"Token indices sequence length is longer than the specified maximum sequence length for this model (10483 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 23469/8548517 [00:08<19:39, 7228.23 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (12505 > 8192). Running this sequence through the model will result in indexing errors\n",
"Token indices sequence length is longer than the specified maximum sequence length for this model (8226 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 24209/8548517 [00:08<20:37, 6888.89 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (10808 > 8192). Running this sequence through the model will result in indexing errors\n",
"Token indices sequence length is longer than the specified maximum sequence length for this model (18963 > 8192). Running this sequence through the model will result in indexing errors\n",
"Token indices sequence length is longer than the specified maximum sequence length for this model (9103 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 24928/8548517 [00:08<20:34, 6906.48 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (8232 > 8192). Running this sequence through the model will result in indexing errors\n",
"Token indices sequence length is longer than the specified maximum sequence length for this model (18374 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 26669/8548517 [00:08<18:12, 7801.39 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (8793 > 8192). Running this sequence through the model will result in indexing errors\n",
"Token indices sequence length is longer than the specified maximum sequence length for this model (8551 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 28799/8548517 [00:08<15:50, 8964.52 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (11499 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 29717/8548517 [00:09<16:03, 8843.98 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (9902 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 30618/8548517 [00:09<16:39, 8519.71 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (11594 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 0%| | 33358/8548517 [00:09<17:05, 8304.62 examples/s]Token indices sequence length is longer than the specified maximum sequence length for this model (18832 > 8192). Running this sequence through the model will result in indexing errors\n",
"Token indices sequence length is longer than the specified maximum sequence length for this model (43572 > 8192). Running this sequence through the model will result in indexing errors\n",
"Map (num_proc=24): 100%|██████████| 8548517/8548517 [17:47<00:00, 8004.38 examples/s]\n"
]
}
],
"source": [
"TOKENIZER_NAME = \"HuggingFaceTB/SmolLM2-1.7B\"\n",
"tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_NAME)\n",
"\n",
"def calculate_token_length(example) -> dict:\n",
" tokens = tokenizer(example[\"text\"], truncation=False, padding=False)[\"input_ids\"]\n",
" return { \"length\": len(tokens) }\n",
"\n",
"dataset_with_lengths = dataset.map(calculate_token_length, num_proc=24)"
]
},
{
"cell_type": "markdown",
"id": "8e9d98bd",
"metadata": {},
"source": [
"**B. Analyze distribution**"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "38094868",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"---- Document Length Stats (Tokens) ---\n",
"count 8.548517e+06\n",
"mean 7.018761e+02\n",
"std 1.515926e+03\n",
"min 3.000000e+01\n",
"25% 2.010000e+02\n",
"50% 3.880000e+02\n",
"75% 7.560000e+02\n",
"max 1.534070e+05\n",
"dtype: float64\n"
]
}
],
"source": [
"lengths = pd.Series(dataset_with_lengths[\"length\"])\n",
"\n",
"# descriptive stats\n",
"print(\"\\n---- Document Length Stats (Tokens) ---\")\n",
"print(lengths.describe())"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "03c77507",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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3//93z/weyt0LfHCcOxOiMP+xGUf/ehHs4uB8TW6OvHEE7MhiXobiq3DNddcE959991s3XiR8sc//nE46qijwvPPP/+BukBiV0v8HO+4445w3nnn9brO66+/nnW6xAvrcTiteNEzXrS/8cYbs8fj8rif4ns88sgjs7qiHXfcsdsF3bi/4r6M+ytehF2RGFLE99vQ0BDee++97AJ/vIAfh1GKnR591Zfaevq3f/u37CJy3DcxSIwXj3/0ox9l82bcdNNN3daNF4s79mH8XC+//PLs4vGuu+6ahR/Ls3jx4iwgy/e4veuuu7KL8TFoiaFXPDb7GjKkfp/ie4vhQgwi4r6Jn+W9996bdbfttttu2TpxH8f3G88N8eL7H/7wh/D1r389+w7EzzCKYd43vvGNbkOedXyW8bsWL8rHc0g8xmP4EIexi0Okxc6QuG3H+efwww/PQq04RFQcVi1+Jj2/U8sTvy8x2Pr85z+fhYSvvfZadj6Krx27uDbeeOPsOWNHRJzfI3aTxMC1UENqxfcXv08d+62rGJzE4bxWNAxZ7HKJIVEMqT7IsFgpx3jPkDfu9xh2xLC841iMx0Y85uOwgzFA7wjc4nES31dXX/jCF7J9H1/vkUceCf/5n/+ZBXPxnBvFEC4GUPE7Gj+HGADF71nPwCaKrxnPqXPnzs3CMgCAspMDAKCkNTQ0xLaUzvs333xzdv/cc8/ttt7nPve5XFVVVe7ZZ5/tXBbXi9tHp512Wm611VbLXXnllZ2Pv/vuu7m11lord/zxx3d7rtmzZ+dGjhzZbfmECROy5zvnnHO6rfvxj388t+uuu670fey333657bbbbrmP90ctN9xwQ7be1KlTO5ctWbIk96lPfSpbfsUVVyx3P3eYOXNmtnydddbJvfnmm53Lb7nllmz5H/7whxW+77vvvjtb7/rrr1/uOjvttFNu7bXX7rwf64rbxNeObrrppux+a2vrcp9jzpw52TpnnnnmMo917K/GxsZeH9t8882Xeb+rr7567uWXX+5c/uCDD2bLTz311G6fabyt7DlXVFtc1nW/z5gxI7v/b//2b93WO/3007Pld911V+ey+Bpx2T333NO57PXXX88NHTo0O95XJH5P4raXXnrpCteLx2zP9xi3i9+lJ554otfPOv63q4592vV46+sxHN9vXO/kk09epralS5d2/nvBggXLPD527NjclltuudL3E/3whz/MDR8+PPf00093Wx6PmUGDBuVefPHFbuefH//4x53rvP/++7l99913mffYm/feey/7DvbcP/Ez67ov4rHel+frzYq27XjsqquuWuaxb33rW9ljscau38O4zaxZs7J9F/dne3t7Uj0XXnhht+9z6jFeX1+f/fuSSy7JzvHxs+p6DGyzzTbZZ93zeNhiiy1yo0ePXua7duyxx3Z73SOPPDI7v3X4yU9+kq0Xv7crc80112TrxvMDAEA5MkQYAECZib+wjvNzxEnTu4q/go7XfuMQW13FZfFX9rEDIc450fWX5rFjI/7q/ktf+lL26+yOW3z++Kv62CXTU/z1dFfx1+XxV+kfVH/UEodtit0lHd06Ufx1d8cv+lOMGzcum2+g62tFhXjvsaMgdossT+xYif74xz9mnRf5SunWiMNWffjDH+68H38FHz+HFf3CvxA6nn/SpEnLHN9RS0tLt+VxKKyOz6KjYyYOZ7SyzyUOHRd1/UxTxI6L+Nof1MqO4TicVeyYip0JPXUdWi0O49bhnXfeyb47scb4XPH+ylx//fXZa8f90fX7F4fOip0299xzT+fnEztkuh5L8TsaO2P6InZDxO9gFJ83fg4dQ1DFbor+9q9//auzjp465tDpWKfDyy+/nO3L+N2L+yEOm7cqj/EodsydcsopWZdJ7ETsMGPGjPDMM8+E8ePHZ/uy43OLw0h++tOfzurtOcRbb8dc3DZ2oXQ938TOlJ7b9tTx/YmvCQBQjgwRBgBQZl544YVsGJ04j0ZXcVidjsd7DvU0b968bAihGF50FS/MRXEomd70HPKlY/6HnhfY4rwEH1R/1BL3RZz8uudwWHFuiVRd52voeK2oEO89fj49P8+u4sXdz372s9kcJnEIuDjvQQxA4kXV3i4U9yZeFI/zRvTVNttss8yyvsxR8UHFzyxegO/5GcX5NeKF357Hd8/PJfWY7Mu8Rb2JQyx9UH05huO8OfH7PmrUqBU+Vxy+KYYwf/nLX5aZTyMGLHGujZV9/x577LFl6ukQh9Xq+p3qOW9NDEj6omM+mZ///Odh5syZ3eabWWeddUJ/6wiiepvrJA6F13WdDnEOp/j9icN39XWel0Ie43E4shi6fOc73+k270rX8+aKhmiLn3/XIHFF57J4no1hchw2LA5jFockjEFNHNovDmfWEY71/P70NmcVAEA5ELAAAFS4vffeO/uVc5xEPY693/VCbcevk+O8I71dOIwXFbuKv1TvLwOplt4s7/XyvUDfIf4q/umnnw7bb7/9cteJFy9///vfZ3NuxLk14pw7cYL7OF9HXNaXSdq7dg4USqyrt/ffc5L2fJ+7Pz+Xjov5+QZkPS/Cr6jm5e2PQh3DMYSJF8HjHENTpkzJJqkfMmRI1ikRA7mVdSFEcZ04v8i3v/3tXh+P4VohxDmgfvCDH2THb5zkPZ6P4nH5zW9+s091flAxHIrivDI9xWWxnp6hZQwXYlAdg6E4b0mh9PUYj3PrxO6+eG6M8+N0Dfc69tmFF16YzcfVm57nh5V9Z+KxHTtfYtdgDHZiJ+B1112Xhd9xrqiu23d8f+I8RAAA5UjAAgBQZuLwNHEy7DikVNeuhyeffLLz8a7ir6Tj8DKx6+Gggw4K06ZN69yuY5LmOMFxHAqomPqjlrgv4kXC+Iv+rl0sccLmnor1C+wYnMQhieJk5yvziU98Irudd9554Zprrglf/vKXw7XXXpv90rzQ9Xf8Mr6rGATFydy7/vK9t6G4ev4CP6W2+JnFi8bx9Tu6sqI4GXq8yPxBh2fq+iv+eCE5dlEUSkcnQM/J7nvuj9TvRQzU4sTqy+tiiaFb7Mi49dZbu3Un9Das3vI+i/g6sZNqZd+9uP/jOSSu2/XC/VNPPdXn4/2AAw4Iv/71r7stj/us60X6/vo+xmHvYpfO9OnTl3nsoYce6jWkiMOfxfPoGWeckXUCxa6ODyL1GI/7Je63ffbZJwvS7rvvvqyrqet5M3aeFPIcHkOv+FrxFkO7GIx973vfy46prq8Tvz9x3UIFcAAAA405WAAAyswhhxyS/SI+dqR0FX+pHi9KHnzwwctss+OOO2a/Zo9D3Bx66KGdcwzEi/rxwly8eNbb3B5z5swJq0p/1BKfMz7Xf/zHf3Quixc2m5ubl1l3+PDhvV4c70+PPvpo9sv9eGF+RfPCxF+J9+zI6LgQ3DHUUUeAVKj6b7755vDKK690u/j84IMPdju+4sXdGOx1/Wzie4rDVXWVUls8vqOpU6d2Wx4v8kb19fWhEOLcPLvttluvF9rzFS+Mx1/3d8xX0iEOh5WvODRc/Ozj8HA9dRwTHR0FXY+ROCzUFVdc0etx3tvnELvb4vBiMczpKa7//vvvd34+8d9xyMEO8Xx06aWX9un9xFp7Hstx/peux1pHnR2vXWhxn8b5jF566aXOZTE0igHi5z//+V63iV03p59+epg8eXK3956PfI7xOLxfDNbjuTt2GnXMIbTrrrtm38OLLrooC70Kcd6MYV5PPc83HR5++OGsw2ZlQ9ABAJQqHSwAAGUmBiTxF+Dx18Tt7e1hp512yoZtiRMSx4v1Hb9o7il2PsR14sW9OJZ+vIAeA414sTDOMbDLLruEL37xi9mvu1988cVsaJg4vFjPIOeDiBf7zj333GWWxyFvYjdGoWuJ85TEydnj5NGxayUOoRR/5d9xAbHrr+Tjhcro5JNPzoKZeCE41lAo9957bzbHQ8fE3jGEiLXEC5M33XTTCud2+M1vfpNdpD/yyCOzzzd2L8XQKH5+HRdrYzdGnHQ9DuUTf00eux3isGMrGnpsReIv9uMv5uNk5vGiarwYHIfV6jqEVBzmKV4UjvvruOOOy+bpuOyyy7ILrh0TZqfWFo/nOJ/Er371q+ziepx/JoY7cR/EzzMe+4Vy+OGHZ9+jWGvPOX7yET/LeIE+hg3x2IqfVbyQ3zF/ST7i+43fiZ/+9KdZx0PsQoshYTye4mMnnXRSGDNmTDYkWDw3xCGk4oX2eHzEbrCeQ2HF4zx+z+L3MH7GcZ049FOc2yMej5/5zGfCMccck60XJ0r/+9//nnVPxHNN7KSIrxG/i7GLIy6Ln+uNN96YBTp9EZ//nHPOCRMnTgx77bVX9vxXX3112HLLLbutF/ddnI8kHk+x4y4GLnvssccK576J54d4zLz66qudnT1xgvqOLpSOEOC73/1uFurE/Rcnjo/7Kw6xtcMOO2R1LU9cJ77PGIbGmo4++uiQj3yP8fh5xXN97EaM37m77rorO27jfCkx+Izfu1h/7NKJgVXsNomPx/2QIn4+MSSMQU8MDePxG88/MeSJ54QOMbyO88N8/etfz2s/AACUhBwAACWtoaEh/ty727J33303d+qpp+Y23njj3ODBg3PbbLNN7sILL8wtXbq023pxu7h9V7fcckuuuro6N27cuNySJUuyZXfffXdu7NixuZEjR+aGDRuW22qrrXLHHHNMbvr06Z3bTZgwITd8+PBl6jvzzDOXqa83++23X7Zeb7dPf/rTnesVupY5c+bkxo8fnxsxYkT2nPG57r///my9a6+9tnO9999/P/eNb3wjt9566+Wqqqo6n2fmzJnZv+P+7Skuj6+5IvH9dH2v8fOKr/HJT34yd9555+Vef/31Zba54oorsnXja0ePPPJI7ktf+lJus802yw0dOjS3/vrr5z7zmc902yfRAw88kNt1111zQ4YM6Vbb8vZXx2Obb7555/2u7/fiiy/Obbrpptlr7rvvvrlHH310me3/67/+K7fllltmr7nzzjvnbr/99mWec0W19faZLV68OHf22Wfntthii2x/xRomT56ce++997qtF1+jvr6+12Mt3lbmtddey74Lv/3tb5e7znbbbbfMc/X2vep6vH32s5/NrbHGGrm11147d+KJJ+Yef/zxbJv4ueZzDMdjM34eH/3oR7P9F4+fgw8+OPfwww93rnPrrbfmdtxxx+w7U1NTk7vgggtyl19+ebfjKJo9e3a2z+L3IT7W9b3F80rcz1tvvXX2Ouuuu25ur732yl100UW5RYsWda73z3/+M/eVr3wlt+aaa2bfqfjvv/3tb8u8x97Ez/C0007LbbTRRrnVV189t/fee+f+8pe/9PqZxXNVbW1t9hn15bnj8bC8c0zXfRDFz2TMmDHZ57TWWmvlvvzlL2f7prfvYWtra+eyeM6M38VY080335zri/jZ9azhgxzjDz74YPb5xXPIggULsmVx/x911FG5ddZZJ/u+xu2+8IUv5KZNm7bMsRWP0d7eZ0d9cZvDDz88+/8v8TiI/43v+emnn+623Z/+9Kdsu2eeeaZP+wEAoBRVxf9T7JAHAAAGkti9E7tB4lwG8df4VK7YeROHhoodIUDfxW6b2KkVO/AAAMqVgAUAgIoW5yyIQ1R1iEN0xSGV4twbs2fP7vYYlScOQReHLYtzcAjboG/ifF5xSLUZM2bkPQwhAEApMAcLAAAVLc69EEOWPffcM5tLJM4X8cADD4Tzzz9fuELYbLPNsrlxgL772Mc+Ft5//327DAAoezpYAACoaNdcc024+OKLs0nu44X0OFF0nLg9Tg4OAAAAyyNgAQAAAAAASLRa6gYAAAAAAACVTsACAAAAAACQqOInuV+6dGl49dVXw4gRI0JVVVXq/gMAAAAAAMpILpcL7777bth4443Daqstv0+l4gOWGK5suummq/TDAQAAAAAABraXXnopbLLJJst9vOIDlti50rGj1lxzzVCpFi9eHO64444wZsyYMHjw4GKX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lIWaxpa8tmtvqi94LQAAAAAA/aliO1gAAAAAAADyJWABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIJGABAAAAAABIVJ26AUCh1TS25LVde1N9wWsBAAAAAOgLHSwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJBCwAAAAAAACJqlM3ABgoahpb8tquvam+4LUAAAAAAJVFBwsAAAAAAEAiAQsAAAAAAEAiAQsAAAAAAEAiAQsAAAAAAEAiAQsAAAAAAICABQAAAAAAoH/pYAEAAAAAAEgkYAEAAAAAAEgkYAEAAAAAAEgkYAEAAAAAAEgkYAEAAAAAAEgkYAEAAAAAAEgkYAEAAAAAAEgkYAEAAAAAAEgkYAEAAAAAAEgkYAEAAAAAAEgkYAEAAAAAAEgkYAEAAAAAAEgkYAEAAAAAAEhUHcpATU1NWHPNNcNqq60W1l577XD33XcXuyQAAAAAAKCMlUXAEj3wwAPhQx/6ULHLAEpATWNLXtu1N9UXvBYAAAAAoDQZIgwAAAAAAKDUApZ77rknHHrooWHjjTcOVVVV4eabb15mnebm5mwYsGHDhoU99tgjPPTQQ90ej9vtt99+oa6uLlx99dWrsHoAAAAAAKASFT1gmT9/fthpp52yEKU31113XZg0aVI488wzwyOPPJKtO3bs2PD66693rnPfffeFhx9+ONx6663h/PPPD4899tgqfAcAAAAAAEClKfocLAcffHB2W54pU6aE448/PkycODG7f9lll4WWlpZw+eWXh8bGxmzZ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AAAAAFBhAUuHbbfdNrsBAAAAAABUmuSAJc65cuWVV4Zp06aF119/PRserKs4HwsAAAAAAEA5Sw5Y4mT2MWCpr68P22+/faiqquqfygAAAAAAAMolYLn22mvDf//3f4dDDjmkfyoCAAAAAAAY4FbLZ5L7rbfeun+qAQAAAAAAKMeA5bTTTguXXHJJyOVy/VMRAAAAAABAuQ0Rdt9994W77747/OlPfwrbbbddGDx4cLfHb7zxxkLWBwAAAAAAUPoBy1prrRWOPPLI/qkGAAAAAACgHAOWK664on8qAQAAAAAAKNc5WKL3338//PnPfw6//OUvw7vvvpste/XVV8O8efMKXR8AAAAAAEDpd7C88MIL4aCDDgovvvhiWLhwYRg9enQYMWJEuOCCC7L7l112Wf9UCgBFUtPYktd27U31Ba8FAAAAgBLtYDnllFPCbrvtFt56662w+uqrdy6P87JMmzat0PUBAAAAAACUfgfLvffeGx544IEwZMiQbstramrCK6+8UsjaAAAAAAAAyqODZenSpWHJkiXLLH/55ZezocIAAAAAAADKXXLAMmbMmDB16tTO+1VVVdnk9meeeWY45JBDCl0fAAAAAABA6Q8RdvHFF4exY8eG2tra8N5774Xx48eHZ555Jqy77rrhd7/7Xf9UCQAAAAAAUMoByyabbBIeffTRcO2114bHHnss61457rjjwpe//OVuk94DAAAAAACUq+q8NqquDkcffXThqwEAAAAAACjHgOWqq65a4eNf/epXP0g9AAAAAAAA5RewnHLKKd3uL168OCxYsCAMGTIkrLHGGgIWAAAAAACg7K2WusFbb73V7RbnYHnqqafCPvvsY5J7AAAAAACgIiQHLL3ZZpttQlNT0zLdLQAAAAAAAOWoIAFLx8T3r776aigVzc3Noba2NtTV1RW7FAAAAAAAoNznYLn11lu73c/lcmHWrFnhZz/7Wdh7771DqWhoaMhuc+fODSNHjix2OQCUoZrGlry2a2+qL3gtAAAAABQ5YDniiCO63a+qqgrrrbde+NSnPhUuvvjiQtYGAAAAAABQHgHL0qVL+6cSAAAAAACASpuDBQAAAAAAoFIkd7BMmjSpz+tOmTIl9ekBAAAAAADKL2D529/+lt0WL14cPvKRj2TLnn766TBo0KCwyy67dJubBQAAAAAAoBwlByyHHnpoGDFi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HWA+ZawBjDPA/MAxDWCsAeYHjmkaF3Upn376aerSpUtq2bLxlVbqfoqw2DgzS6DqTYQrAhbAWAPM6xzTAMYaYH7huAYwzjSNDh06fG0bi9wDAAAAAADUSMACAAAAAABQIwELWZs2bdKQIUPyT4Bvi7EG+LYZZ4C5wVgDGGuA+YFjmtlX94vcAwAAAAAA1EoFCwAAAAAAQI0ELAAAAAAAADUSsAAAAAAAANRIwAIAAAAAAFAjAQtp2LBhaYUVVkgLLbRQ2mCDDdLjjz9uqwANOuWUU1Lv3r3ToosumpZeeum08847pxdffLGqzZdffpkGDBiQllhiibTIIoukXXfdNb3//vtVbcaOHZu233771K5du/w4gwYNSlOnTq1qc//996d11103tWnTJq288srp0ksvtVegDp166qmpRYsW6bDDDivfZpwB5oR33nkn/fSnP83HLG3btk1rrrlmeuKJJ8r3F0WRjj/++NS5c+d8/1ZbbZVefvnlqsf46KOP0l577ZXat2+fFltssbT//vunzz77rKrNs88+mzbddNP8eWvZZZdNp59+uh0IdWLatGlp8ODBqVu3bnkcWWmlldIJJ5yQx5cSYw1QqwceeCDtuOOOqUuXLvmz0g033FB1/9wcV0aMGJFWW2213CaOpW677ba626ECljp39dVXpyOOOCINGTIk/etf/0prr7122mabbdL48eObumtAMzRy5Mgcnjz66KPprrvuSlOmTElbb711+vzzz8ttDj/88HTzzTfnP7LR/t133019+/at+pAR4cp///vf9PDDD6fLLrsshyfxx7/k9ddfz2222GKL9PTTT+cTqwcccEC688475/prBprOqFGj0kUXXZTWWmutqtuNM8Ds+vjjj9PGG2+cWrdunW6//fY0evTodNZZZ6WOHTuW28RJhPPOOy/98Y9/TI899lhaeOGF82elCHlL4sTECy+8kI+LbrnllnzCo3///uX7J06cmI+Vll9++fTkk0+mM844Iw0dOjQNHz7cToQ6cNppp6ULL7wwXXDBBWnMmDH5eowt559/frmNsQaoVZyDiXO48aX5hsytcSXO6fTr1y+HM0899VT+Em5cnn/++fraqQV1rU+fPsWAAQPK16dNm1Z06dKlOOWUU5q0X8C8Yfz48fHVq2LkyJH5+oQJE4rWrVsXI0aMKLcZM2ZMbvPII4/k67fddlvRsmXLYty4ceU2F154YdG+ffti8uTJ+fpRRx1V9OzZs+q5fvKTnxTbbLPNXHplQFP79NNPi+7duxd33XVXsdlmmxUDBw7MtxtngDnh6KOPLjbZZJNG758+fXrRqVOn4owzzijfFuNPmzZtir///e/5+ujRo/MxzqhRo8ptbr/99qJFixbFO++8k6//4Q9/KDp27Fg+xik996qrrmpHQh3Yfvvti/3226/qtr59+xZ77bVX/rexBphdcSxy/fXXl6/PzXFl9913z+NcpQ022KA48MAD62rHqmCpY/Ht8Uggo0yspGXLlvn6I4880qR9A+YNn3zySf65+OKL558xpkRVS+W4EqWiyy23XHlciZ9RNrrMMsuU28Q3KeLbEfHtiVKbyscotTE2Qf2IarmoZJtxLDDOAHPCTTfdlNZff/2022675elKe/XqlS6++OKqatpx48ZVjUEdOnTIUypXHtPElBrxOCXRPj5TxbdFS22+973vpQUXXLDqmCamWI0qGmD+ttFGG6V77rknvfTSS/n6M888kx588MG03Xbb5evGGmBOm5vjinM3/yNgqWMffPBBnqqn8iRniOvxPyLAzEyfPj1P3RXTa6yxxhr5thg74o9v/KFubFyJnw2NO6X7ZtYmQpgvvvjCjoH53FVXXZWnLo11n2ZknAHmhNdeey1P29O9e/c8BelBBx2UDj300Dx1aWmsCTP7rBQ/I5yp1KpVq/zFk1qOe4D51zHHHJP22GOP/KWzmJIwwtz4DBVT8wRjDTCnzc1xpbE24+rsGKdVU3cAgHn32+Uxr2Z8AwtgTnnrrbfSwIED81zAsVAiwLf1RZH41ubJJ5+cr8dJzziuibnK99lnHxsdmCOuueaadMUVV6Qrr7wy9ezZs7y+ZCxMbawBmD+oYKljSy65ZFpggQXS+++/X3V7XO/UqVOT9Qto/g455JC8CNp9992XunbtWr49xo6YfnDChAmNjivxs6Fxp3TfzNq0b98+tW3b9lt7XUDTiynAxo8fn9Zdd938Laq4jBw5Mi/SGP+Ob0QZZ4DZ1blz59SjR4+q21ZfffU0duzYqmOSmX1Wip8xXlWaOnVq+uijj2o67gHmX4MGDSpXscQ0yXvvvXc6/PDDy1W6xhpgTpub40pjbTrV2TGOgKWOxTQ+6623Xp4PtPKbXHF9ww03bNK+Ac1TrJ8W4cr111+f7r333tStW7eq+2NMidL3ynEl5ueMkxWlcSV+Pvfcc1V/zOOb6hGelE50RJvKxyi1MTbB/G/LLbfMY0R8w7N0iW+Zx1QapX8bZ4DZFVOcxjFKpVgjYfnll8//jmOcODlQeTwSU5XGvOSVxzTxpZIIhkvi+Cg+U8U856U2DzzwQF6jrvKYZtVVV00dO3a0I2E+N2nSpLymQaX4omuME8FYA8xpc3Ncce7m/zWw8D115KqrriratGlTXHrppcXo0aOL/v37F4sttlgxbty4pu4a0AwddNBBRYcOHYr777+/eO+998qXSZMmldv88pe/LJZbbrni3nvvLZ544oliww03zJeSqVOnFmussUax9dZbF08//XRxxx13FEsttVRx7LHHltu89tprRbt27YpBgwYVY8aMKYYNG1YssMACuS1QfzbbbLNi4MCB5evGGWB2Pf7440WrVq2Kk046qXj55ZeLK664Ih97XH755eU2p556av5sdOONNxbPPvtssdNOOxXdunUrvvjii3KbbbfdtujVq1fx2GOPFQ8++GDRvXv3ol+/fuX7J0yYUCyzzDLF3nvvXTz//PP581c8z0UXXWQnQh3YZ599iu985zvFLbfcUrz++uvFddddVyy55JLFUUcdVW5jrAFq9emnnxZPPfVUvsTp/bPPPjv/+80335yr48pDDz2Uj6fOPPPMfO5myJAhRevWrYvnnnuurnaqgIXi/PPPzydDF1xwwaJPnz7Fo48+aqsADf/RSKnByyWXXFJuE3+wDz744KJjx475j+8uu+ySQ5hKb7zxRrHddtsVbdu2zR8wjjzyyGLKlClVbe67775inXXWyWPTiiuuWPUcQH0HLMYZYE64+eab85c+4gtnq622WjF8+PCq+6dPn14MHjw4n1yINltuuWXx4osvVrX58MMP88mIRRZZpGjfvn2x77775pMelZ555plik002yY8RJ1rjpAdQHyZOnJiPYeKcy0ILLZQ/1xx33HHF5MmTy22MNUCt4nxJQ+dmItSd2+PKNddcU6yyyir53E3Pnj2LW2+9te52aIv4T6maBQAAAAAAgK9nDRYAAAAAAIAaCVgAAAAAAABqJGABAAAAAACokYAFAAAAAACgRgIWAAAAAACAGglYAAAAAAAAaiRgAQAAAAAAqJGABQAAAAAAoEYCFgAAmEe98cYbqUWLFunpp59u6q7MMwYPHpz69++fmoPYdzfccENTd6PZ+OCDD9LSSy+d3n777abuCgAAzBIBCwAANPFJ9pldhg4d2iz3zyuvvJL23Xff1LVr19SmTZvUrVu31K9fv/TEE08025Bp3Lhx6dxzz03HHXdc+bb//Oc/6aCDDkrLLbdcfh2dOnVK22yzTXrooYdScwpc7r///nx/x44d05dffll136hRo8rvl8r2O+20U+rcuXNaeOGF0zrrrJOuuOKKr+3DAw88kHbcccfUpUuXWQ6Afv7znzf43u3Zs2ejbZZYYom07bbbpmeffbbcZskll0w/+9nP0pAhQ772OQEAoDkQsAAAQBN67733ypdzzjkntW/fvuq2X//6181u/0SIst5666WXXnopXXTRRWn06NHp+uuvT6uttlo68sgjm7p7jfrTn/6UNtpoo7T88suXb9t1113TU089lS677LL8em666aa0+eabpw8//DA1R4suumje1pX+/Oc/54Co0sMPP5zWWmutdO211+YQI8KwCC9uueWWmT7+559/ntZee+00bNiwWe5ThFaV79m33norLb744mm33XaraheBSqnNPffck1q1apV22GGHqjbRzwiCPvroo1l+fgAAaCoCFgAAaEJRMVG6dOjQIX+7v3Q9pks6++yzy1UiUYVwxx13NPpY06ZNS/vtt18OOsaOHZtvu/HGG9O6666bFlpoobTiiium3/72t2nq1Knl34nni+Bhl112Se3atUvdu3fPIUNjiqLI1QjR7p///Gfafvvt00orrZT7FpUH8Xwlzz33XPr+97+f2rZtmysWYmquzz77rHx/BBmHHXZY1ePvvPPO+fFLVlhhhXTyySfn1xXhQgQJw4cPL98flTOhV69e+bXEYzbmqquuytUZJRMmTMiv4bTTTktbbLFFDl769OmTjj322PSjH/2oahtFkBRhQGyj1VdfPT3yyCO5iieeLypEIrh59dVXq57vwgsvzNtmwQUXTKuuumr629/+lmbXPvvsk/7yl7+Ur3/xxRf5dcXtlX7zm9+kE044Ifcr+jBw4MAccFx33XUzffztttsunXjiifn9MKvifVv5Po4A7uOPP85hSaVShVBc4v1yzDHH5DAmqohKouolqmdmDJEAAKA5ErAAAEAzFZUBZ511VjrzzDNzFUJMXRUn/l9++eWvtJ08eXKuGIipsiI0iCAifkbVQpxcjyqTCAkuvfTSdNJJJ1X9boQuu+++e36OH/7wh2mvvfZqtIIgHv+FF17IlSotW37148Riiy1WroSI/saUVjGF1YgRI9Ldd9+dDjnkkJq3Q2yD9ddfP1eaHHzwwXlKrxdffDHf9/jjj+ef8dhRGdFYgBCvJ7ZBPE7JIosski8xDVZsv5mJsCK2Zbz+CLD23HPPdOCBB+YwJgKFCJ4qX1sEBLHdYzs9//zzuW0EDvfdd1+aHXvvvXfer6UALSpUIoSKEO3rfPLJJ7my5NsWFTVbbbVVVaXQjCJou/zyy9PKK6+cw7dKEXLFawQAgOZOwAIAAM1UBCtHH3102mOPPXIFRFRaxDf/YyqxGU9WRyVJVALECfylllqqHJxElUBUN0T1yg9+8IMcFETQUikqRmL9lDjZHdUi8Xil4GJGpXAnQoaZufLKK/NaIX/961/TGmuskStZLrjgglzF8f7779e0HSL0iWAl+hfbI9bqKAUVpdcaJ+mjMqKxACECiQhBojqiJKaoisAppgeLYGjjjTfOlR+V64KURDgSIdQqq6yS+xBrv0QQFSFSVLREmBLrnlTuu9iu0e/4nSOOOCL17ds33z47oqopqkyi3yGqWaK65+tcc801OeiasapkTnv33XfT7bffng444ICv3BfTk5VCrahGikqpq6+++itBXeyjN99881vtJwAAzAkCFgAAaIYmTpyYT1bHSf9KcX3MmDFVt0U4EhUj//jHP/J0TSXPPPNM+t3vflc+qR2XX/ziF7nSY9KkSeV2sVZHSUx3FevAjB8/vsF+RUgxK6KPsZZHPF5l36dPn16uPplVlf0rTaHWWP8aE1NphZgqrVKswRLbOU72xxRaEZJENUgpwGioD8sss0z+ueaaa1bdFoFS7LfS65+VffdNRKAS/XvttdfyVGUR9MxMhFERrFx88cXlheejQqTyfRHrnswJpbAqpnqbUUzDFhVAcYkAL8KpCItmDFNiSrnK9ycAADRXAhYAAJjHRYVHVF3EyfZKUYkSVSylk9pxiXVRogqlMmho3bp11e9FiBFBSEOiGiP8+9//nu1+R+XCjIHNlClTvtKulv41JqpeQqwNMqPYFlHdM3jw4Lw4fFSexHoyjfUhnr+x22rt1zcRoUQERvvvv39eU2bGKbYqjRw5Mrf5/e9/n6c4K4mp0irfF5VrznxTsS+joiamMYt1Z2YUYVtUIcWld+/eee2fCAYj+JlxOrdSZRIAADRnAhYAAGiGoookpkp66KGHqm6P6z169Ki6LdYkOfXUU/NJ8jihXhKVGFEtUjqpXXlpaP2UWRFTlMXzx7ooDYUJsXB8iGmzooImTqBX9j2eN6Y7C3ESPappSqZNm5bXK6lF6UR+/O7MxELvsU1jHZavE6+vst/fRLz+Wdl330RMbRZhSVTbzGx6sLg/po6LqeX69+//lSqRyvdDTNk1u+K998orr+TgZ1ZEKBXvh1J1UUm8B3r16jXb/QEAgG9bq2/9GQAAgG9k0KBBuZIiwoEINi655JJcbdDQdE6/+tWvcsiwww475DUwNtlkk3T88cfn67Hg/Y9//ON8MjtCjziBfeKJJ36jPsVJ8ehHLGK+6aabpuOOOy6vxxLVMjfffHOepixOtMe0VdH3WP9l6NCheX2Y6GNUN5Sm2Ip1WWJtkltvvTW/xrPPPrsc0NSyJkmEBXfccUfq2rVrrkapnCatJF579PnBBx8sT1/14Ycfpt122y2HFDEFWIQMsWD96aefnnbaaac0u/su1myJoCCeN7bNddddl+6+++6Z/t7rr7+e93Gl7t27f6VdrKUTz9FY9UpMCxb7PtaGiWnQxo0bVw6kZrbQfezHCElm7E/8TryPwrHHHpveeeedvL7OjIvbb7DBBnnNnYZMnjy53I+oJIo1eeL5osKmJKYGe/LJJ/NaQAAA0NwJWAAAoJk69NBD0yeffJKOPPLIvOZIVD/EWiENnXAPhx12WK4qiSnDInCINS5iYfFYhyWqGGJKqwhDGlqAvBZ9+vTJQcRJJ52U13T54IMPUufOndNGG22UzjnnnNymXbt26c4778wn+GM6qLgeJ/ojRCmJYCMCn6jGiKqMww8/PK/TUYv4vfPOOy+/xgiUIvSpXGy+Urzu6G8EKBG4xNojEQjE9Fmvvvpqnp5s2WWXzW1isfvZESHOueeemxe1j23QrVu3HExtvvnmM/29CJxmFOulzCiCktK0Z42thRJhxSmnnJIvJZtttlmj2yfEfq3cB6X+RFBWWpcmqo7Gjh1b9XvxPr322mvza25MvCfjfRIizIr34ogRI6q2yY033piDnNiPAADQ3LUoZnWVSgAAgHlYfPSJQCWCnH79+jV1d2jAd7/73Rws7rnnnrYPAADNnjVYAACAuhDTmw0fPjxNnTq1qbtCA6ISqm/fvsIvAADmGSpYAAAAAAAAaqSCBQAAAAAAoEYCFgAAAAAAgBoJWAAAAAAAAGokYAEAAAAAAKiRgAUAAAAAAKBGAhYAAAAAAIAaCVgAAAAAAABqJGABAAAAAACokYAFAAAAAAAg1eb/ANM4HSqVRYgEAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 2000x1200 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot distribution (use log scale for better viz of skew)\n",
"plt.figure(figsize=(20, 12))\n",
"\n",
"# zoom into bulk of the data eg. docs < 10K tokens\n",
"lengths[lengths < 10000].hist(bins=100, log=True)\n",
"plt.title('Token Length Distribution (Truncated at 10k Tokens)')\n",
"plt.xlabel('Token Count (SmolLM2-1.7B)')\n",
"plt.ylabel('Frequency (Log Scale)')\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "fineweb",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}