Ubuntu commited on
Commit
ad4c3bb
1 Parent(s): 2fb2dc0

added wikigpt

Browse files
.gitignore CHANGED
@@ -1,2 +1,2 @@
1
  keys.py
2
- wiki_gpt/
 
1
  keys.py
2
+ # wiki_gpt/
gpt3_finetuned_model/runs/Oct09_08-16-50_ip-172-31-95-165/events.out.tfevents.1696839410.ip-172-31-95-165.74908.0 CHANGED
Binary files a/gpt3_finetuned_model/runs/Oct09_08-16-50_ip-172-31-95-165/events.out.tfevents.1696839410.ip-172-31-95-165.74908.0 and b/gpt3_finetuned_model/runs/Oct09_08-16-50_ip-172-31-95-165/events.out.tfevents.1696839410.ip-172-31-95-165.74908.0 differ
 
wiki_gpt/.gitignore ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ venv
2
+ wiki_intro.csv
3
+ wiki_intro_processed.csv
4
+ config.py
5
+ data/*
6
+ __pycache__/*
7
+ _archive/*
8
+ # GPT-wiki-intro.csv
9
+ GPT-wiki-intro.csv.zip
wiki_gpt/README.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Wiki GPT
2
+
3
+ Code to generate [GPT-wiki-intro dataset](https://huggingface.co/datasets/aadityaubhat/GPT-wiki-intro#overview).
4
+ This dataset can be used to train and evaluate mdoels to classify text as human written or GPT generated.
5
+
6
+ To run the code -
7
+ 1. Install requirements from requirements.txt
8
+ 2. Create config.py and add your `OPENAI_API_KEY`
9
+ 3. Create a `data` folder
10
+ 4. Run `process_wiki_data.ipynb`
11
+ 5. Run `download_openai.ipynb`
12
+ 6. Run `process_results.ipynb`
13
+
14
+ ## Citation
15
+
16
+ Please cite as following
17
+
18
+ ```
19
+ @misc {aaditya_bhat_2023,
20
+ author = { {Aaditya Bhat} },
21
+ title = { GPT-wiki-intro (Revision 0e458f5) },
22
+ year = 2023,
23
+ url = { https://huggingface.co/datasets/aadityaubhat/GPT-wiki-intro },
24
+ doi = { 10.57967/hf/0326 },
25
+ publisher = { Hugging Face }
26
+ }
27
+ ```
wiki_gpt/download_openai.ipynb ADDED
@@ -0,0 +1,309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 25,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import pickle\n",
10
+ "from tqdm import tqdm\n",
11
+ "import pandas as pd\n",
12
+ "import re\n",
13
+ "import openai\n",
14
+ "from config import OPENAI_API_KEY\n",
15
+ "import dask"
16
+ ]
17
+ },
18
+ {
19
+ "cell_type": "code",
20
+ "execution_count": 55,
21
+ "metadata": {},
22
+ "outputs": [],
23
+ "source": [
24
+ "openai.api_key = OPENAI_API_KEY"
25
+ ]
26
+ },
27
+ {
28
+ "cell_type": "code",
29
+ "execution_count": 8,
30
+ "metadata": {},
31
+ "outputs": [],
32
+ "source": [
33
+ "data_df = pd.read_csv('wiki_intro_processed.csv')"
34
+ ]
35
+ },
36
+ {
37
+ "cell_type": "code",
38
+ "execution_count": 44,
39
+ "metadata": {},
40
+ "outputs": [],
41
+ "source": [
42
+ "def chunkify(lst, n):\n",
43
+ " return [lst[i:i + n] for i in range(0, len(lst), n)]"
44
+ ]
45
+ },
46
+ {
47
+ "cell_type": "code",
48
+ "execution_count": 5,
49
+ "metadata": {},
50
+ "outputs": [],
51
+ "source": [
52
+ "def create_prompt(title, starter_text):\n",
53
+ " return f'''200 word wikipedia style introduction on '{title}'\n",
54
+ " {starter_text}'''"
55
+ ]
56
+ },
57
+ {
58
+ "cell_type": "code",
59
+ "execution_count": 33,
60
+ "metadata": {},
61
+ "outputs": [],
62
+ "source": [
63
+ "def get_openai_response(dct): \n",
64
+ " title = dct['title']\n",
65
+ " starter_text = dct['starter_text']\n",
66
+ "\n",
67
+ " prompt = create_prompt(title, starter_text)\n",
68
+ "\n",
69
+ " return {title: openai.Completion.create(\n",
70
+ " model=\"text-curie-001\",\n",
71
+ " prompt=prompt,\n",
72
+ " temperature=0.7,\n",
73
+ " max_tokens=300,\n",
74
+ " top_p=1,\n",
75
+ " frequency_penalty=0.4,\n",
76
+ " presence_penalty=0.1\n",
77
+ " )}"
78
+ ]
79
+ },
80
+ {
81
+ "cell_type": "code",
82
+ "execution_count": 35,
83
+ "metadata": {},
84
+ "outputs": [],
85
+ "source": [
86
+ "def fake_get_openai_response(dct):\n",
87
+ " title = dct['title']\n",
88
+ " starter_text = dct['starter_text']\n",
89
+ "\n",
90
+ " prompt = create_prompt(title, starter_text)\n",
91
+ "\n",
92
+ " return {title: f'{prompt} blah blah blah'}"
93
+ ]
94
+ },
95
+ {
96
+ "cell_type": "code",
97
+ "execution_count": 54,
98
+ "metadata": {},
99
+ "outputs": [],
100
+ "source": [
101
+ "def run_dask(lst_dct):\n",
102
+ " delayed_calls = [dask.delayed(get_openai_response)(dct) for dct in lst_dct]\n",
103
+ " results = dask.compute(*delayed_calls)\n",
104
+ " return results"
105
+ ]
106
+ },
107
+ {
108
+ "cell_type": "code",
109
+ "execution_count": 70,
110
+ "metadata": {},
111
+ "outputs": [
112
+ {
113
+ "name": "stdout",
114
+ "output_type": "stream",
115
+ "text": [
116
+ "1\n",
117
+ "2\n",
118
+ "3\n",
119
+ "4\n",
120
+ "5\n",
121
+ "6\n",
122
+ "7\n",
123
+ "8\n",
124
+ "9\n",
125
+ "10\n",
126
+ "11\n",
127
+ "12\n",
128
+ "13\n",
129
+ "14\n",
130
+ "15\n",
131
+ "16\n",
132
+ "17\n",
133
+ "18\n",
134
+ "19\n",
135
+ "20\n",
136
+ "21\n",
137
+ "22\n",
138
+ "23\n",
139
+ "24\n",
140
+ "25\n",
141
+ "26\n",
142
+ "27\n",
143
+ "28\n",
144
+ "29\n",
145
+ "30\n",
146
+ "31\n",
147
+ "32\n",
148
+ "33\n",
149
+ "34\n",
150
+ "35\n",
151
+ "36\n",
152
+ "37\n",
153
+ "38\n",
154
+ "39\n",
155
+ "40\n",
156
+ "41\n",
157
+ "42\n",
158
+ "43\n",
159
+ "44\n",
160
+ "45\n",
161
+ "46\n",
162
+ "47\n",
163
+ "48\n",
164
+ "49\n",
165
+ "50\n",
166
+ "51\n",
167
+ "52\n",
168
+ "53\n",
169
+ "54\n",
170
+ "55\n",
171
+ "56\n",
172
+ "57\n",
173
+ "58\n",
174
+ "59\n",
175
+ "60\n",
176
+ "61\n",
177
+ "62\n",
178
+ "63\n",
179
+ "64\n",
180
+ "65\n",
181
+ "66\n",
182
+ "67\n",
183
+ "68\n",
184
+ "69\n",
185
+ "70\n",
186
+ "71\n",
187
+ "72\n",
188
+ "73\n",
189
+ "74\n",
190
+ "75\n",
191
+ "76\n",
192
+ "77\n",
193
+ "78\n",
194
+ "79\n",
195
+ "80\n",
196
+ "81\n",
197
+ "82\n",
198
+ "83\n",
199
+ "84\n",
200
+ "85\n",
201
+ "86\n",
202
+ "87\n",
203
+ "88\n",
204
+ "89\n",
205
+ "90\n",
206
+ "91\n",
207
+ "92\n",
208
+ "93\n",
209
+ "94\n",
210
+ "95\n",
211
+ "96\n",
212
+ "97\n",
213
+ "98\n",
214
+ "99\n",
215
+ "100\n",
216
+ "101\n",
217
+ "102\n",
218
+ "103\n",
219
+ "104\n",
220
+ "105\n",
221
+ "106\n",
222
+ "107\n",
223
+ "108\n",
224
+ "109\n",
225
+ "110\n",
226
+ "111\n",
227
+ "112\n",
228
+ "113\n",
229
+ "114\n",
230
+ "115\n",
231
+ "116\n",
232
+ "117\n",
233
+ "118\n",
234
+ "119\n",
235
+ "120\n",
236
+ "121\n",
237
+ "122\n",
238
+ "123\n",
239
+ "124\n",
240
+ "125\n",
241
+ "126\n",
242
+ "127\n",
243
+ "128\n",
244
+ "129\n",
245
+ "130\n",
246
+ "131\n",
247
+ "132\n",
248
+ "133\n",
249
+ "134\n",
250
+ "135\n",
251
+ "136\n",
252
+ "137\n",
253
+ "138\n",
254
+ "139\n",
255
+ "140\n",
256
+ "141\n",
257
+ "142\n",
258
+ "143\n",
259
+ "144\n",
260
+ "145\n",
261
+ "146\n",
262
+ "147\n",
263
+ "148\n",
264
+ "149\n"
265
+ ]
266
+ }
267
+ ],
268
+ "source": [
269
+ "chunk_n = 0\n",
270
+ "for chunk in chunkify(data_df[['title', 'starter_text']].to_dict('records'), 1000):\n",
271
+ " if chunk_n == 0:\n",
272
+ " chunk_n += 1\n",
273
+ " continue\n",
274
+ " print(chunk_n)\n",
275
+ " result = run_dask(chunk)\n",
276
+ " with open(f'data/result-{chunk_n}.pkl', 'wb') as file:\n",
277
+ " pickle.dump(result, file)\n",
278
+ " chunk_n += 1\n"
279
+ ]
280
+ }
281
+ ],
282
+ "metadata": {
283
+ "kernelspec": {
284
+ "display_name": "venv",
285
+ "language": "python",
286
+ "name": "python3"
287
+ },
288
+ "language_info": {
289
+ "codemirror_mode": {
290
+ "name": "ipython",
291
+ "version": 3
292
+ },
293
+ "file_extension": ".py",
294
+ "mimetype": "text/x-python",
295
+ "name": "python",
296
+ "nbconvert_exporter": "python",
297
+ "pygments_lexer": "ipython3",
298
+ "version": "3.10.6 (main, Aug 30 2022, 05:12:36) [Clang 13.1.6 (clang-1316.0.21.2.5)]"
299
+ },
300
+ "orig_nbformat": 4,
301
+ "vscode": {
302
+ "interpreter": {
303
+ "hash": "3f100d68d9cf80676b1a4c3ace5430b03ae266a1d88e3f101eb196b64b263632"
304
+ }
305
+ }
306
+ },
307
+ "nbformat": 4,
308
+ "nbformat_minor": 2
309
+ }
wiki_gpt/process_results.ipynb ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import pandas as pd\n",
10
+ "import pickle\n",
11
+ "import os; os.chdir('..')"
12
+ ]
13
+ },
14
+ {
15
+ "cell_type": "code",
16
+ "execution_count": 2,
17
+ "metadata": {},
18
+ "outputs": [],
19
+ "source": [
20
+ "data_df = pd.read_csv('wiki_intro_processed.csv')"
21
+ ]
22
+ },
23
+ {
24
+ "cell_type": "code",
25
+ "execution_count": 18,
26
+ "metadata": {},
27
+ "outputs": [],
28
+ "source": [
29
+ "def create_prompt(title, starter_text):\n",
30
+ " return f'''200 word wikipedia style introduction on '{title}'\n",
31
+ " {starter_text}'''"
32
+ ]
33
+ },
34
+ {
35
+ "cell_type": "code",
36
+ "execution_count": 4,
37
+ "metadata": {},
38
+ "outputs": [],
39
+ "source": [
40
+ "results = []\n",
41
+ "\n",
42
+ "for i in range(150):\n",
43
+ " with open(f'data/result-{i}.pkl', 'rb') as file:\n",
44
+ " temp = pickle.load(file)\n",
45
+ " results += list(temp)"
46
+ ]
47
+ },
48
+ {
49
+ "cell_type": "code",
50
+ "execution_count": 5,
51
+ "metadata": {},
52
+ "outputs": [
53
+ {
54
+ "data": {
55
+ "text/plain": [
56
+ "150000"
57
+ ]
58
+ },
59
+ "execution_count": 5,
60
+ "metadata": {},
61
+ "output_type": "execute_result"
62
+ }
63
+ ],
64
+ "source": [
65
+ "len(results)"
66
+ ]
67
+ },
68
+ {
69
+ "cell_type": "code",
70
+ "execution_count": 9,
71
+ "metadata": {},
72
+ "outputs": [],
73
+ "source": [
74
+ "processed_results = []\n",
75
+ "for dct in results:\n",
76
+ " for key in dct:\n",
77
+ " processed_results.append({\n",
78
+ " 'title': key, \n",
79
+ " 'generated_text': dct[key]['choices'][0]['text'],\n",
80
+ " 'prompt_tokens' : dct[key]['usage']['prompt_tokens'],\n",
81
+ " 'completion_tokens' : dct[key]['usage']['completion_tokens'],\n",
82
+ " })"
83
+ ]
84
+ },
85
+ {
86
+ "cell_type": "code",
87
+ "execution_count": 12,
88
+ "metadata": {},
89
+ "outputs": [],
90
+ "source": [
91
+ "processed_results_df = pd.DataFrame(processed_results)"
92
+ ]
93
+ },
94
+ {
95
+ "cell_type": "code",
96
+ "execution_count": 16,
97
+ "metadata": {},
98
+ "outputs": [],
99
+ "source": [
100
+ "# Create final df\n",
101
+ "final_df = pd.merge(data_df, processed_results_df, on=['title'])"
102
+ ]
103
+ },
104
+ {
105
+ "cell_type": "code",
106
+ "execution_count": 19,
107
+ "metadata": {},
108
+ "outputs": [],
109
+ "source": [
110
+ "# Create new columns\n",
111
+ "final_df['prompt'] = final_df.apply(lambda row: create_prompt(row['title'], row['starter_text']), axis=1)\n",
112
+ "\n",
113
+ "final_df['generated_text_complete'] = final_df['starter_text'] + final_df['generated_text']\n",
114
+ "\n",
115
+ "final_df['generated_text_len'] = final_df['generated_text_complete'].apply(lambda x: len(x.split(' ')))"
116
+ ]
117
+ },
118
+ {
119
+ "cell_type": "code",
120
+ "execution_count": 38,
121
+ "metadata": {},
122
+ "outputs": [],
123
+ "source": [
124
+ "# Rename columns\n",
125
+ "final_df = final_df.rename(columns={\n",
126
+ " 'intro': 'wiki_intro', 'intro_len': 'wiki_intro_len',\n",
127
+ " 'generated_text_complete': 'generated_intro', 'generated_text_len' : 'generated_intro_len'})"
128
+ ]
129
+ },
130
+ {
131
+ "cell_type": "code",
132
+ "execution_count": 40,
133
+ "metadata": {},
134
+ "outputs": [],
135
+ "source": [
136
+ "# Reorder columns\n",
137
+ "final_df = final_df[[ \n",
138
+ " 'id', 'url', 'title', 'wiki_intro', 'generated_intro', 'title_len',\n",
139
+ " 'wiki_intro_len', 'generated_intro_len', 'prompt', 'generated_text',\n",
140
+ " 'prompt_tokens', 'generated_text_tokens']]"
141
+ ]
142
+ },
143
+ {
144
+ "cell_type": "code",
145
+ "execution_count": 42,
146
+ "metadata": {},
147
+ "outputs": [],
148
+ "source": [
149
+ "# Write csv file\n",
150
+ "final_df.to_csv('GPT-wiki-intro.csv', index=False)"
151
+ ]
152
+ }
153
+ ],
154
+ "metadata": {
155
+ "kernelspec": {
156
+ "display_name": "venv",
157
+ "language": "python",
158
+ "name": "python3"
159
+ },
160
+ "language_info": {
161
+ "codemirror_mode": {
162
+ "name": "ipython",
163
+ "version": 3
164
+ },
165
+ "file_extension": ".py",
166
+ "mimetype": "text/x-python",
167
+ "name": "python",
168
+ "nbconvert_exporter": "python",
169
+ "pygments_lexer": "ipython3",
170
+ "version": "3.10.12"
171
+ },
172
+ "orig_nbformat": 4,
173
+ "vscode": {
174
+ "interpreter": {
175
+ "hash": "3f100d68d9cf80676b1a4c3ace5430b03ae266a1d88e3f101eb196b64b263632"
176
+ }
177
+ }
178
+ },
179
+ "nbformat": 4,
180
+ "nbformat_minor": 2
181
+ }
wiki_gpt/process_wiki_data.ipynb ADDED
@@ -0,0 +1,520 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 4,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import os; os.chdir('..')"
10
+ ]
11
+ },
12
+ {
13
+ "cell_type": "code",
14
+ "execution_count": 5,
15
+ "metadata": {},
16
+ "outputs": [],
17
+ "source": [
18
+ "# pip install apache-beam==2.43.0\n",
19
+ "# pip install --no-deps multiprocess==0.70.14"
20
+ ]
21
+ },
22
+ {
23
+ "cell_type": "code",
24
+ "execution_count": 6,
25
+ "metadata": {},
26
+ "outputs": [
27
+ {
28
+ "ename": "ImportError",
29
+ "evalue": "cannot import name 'get_context' from 'multiprocess' (/home/ubuntu/SentenceStructureComparision/venv/lib/python3.10/site-packages/multiprocess/__init__.py)",
30
+ "output_type": "error",
31
+ "traceback": [
32
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
33
+ "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)",
34
+ "\u001b[1;32m/home/ubuntu/SentenceStructureComparision/wiki_gpt/process_wiki_data.ipynb Cell 3\u001b[0m line \u001b[0;36m1\n\u001b[0;32m----> <a href='vscode-notebook-cell://ssh-remote%2B7b22686f73744e616d65223a22456d62656464696e6773227d/home/ubuntu/SentenceStructureComparision/wiki_gpt/process_wiki_data.ipynb#W1sdnNjb2RlLXJlbW90ZQ%3D%3D?line=0'>1</a>\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mdatasets\u001b[39;00m \u001b[39mimport\u001b[39;00m load_dataset\n\u001b[1;32m <a href='vscode-notebook-cell://ssh-remote%2B7b22686f73744e616d65223a22456d62656464696e6773227d/home/ubuntu/SentenceStructureComparision/wiki_gpt/process_wiki_data.ipynb#W1sdnNjb2RlLXJlbW90ZQ%3D%3D?line=1'>2</a>\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mtqdm\u001b[39;00m \u001b[39mimport\u001b[39;00m tqdm\n\u001b[1;32m <a href='vscode-notebook-cell://ssh-remote%2B7b22686f73744e616d65223a22456d62656464696e6773227d/home/ubuntu/SentenceStructureComparision/wiki_gpt/process_wiki_data.ipynb#W1sdnNjb2RlLXJlbW90ZQ%3D%3D?line=2'>3</a>\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mpandas\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mpd\u001b[39;00m\n",
35
+ "File \u001b[0;32m~/SentenceStructureComparision/venv/lib/python3.10/site-packages/datasets/__init__.py:22\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39m# flake8: noqa\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \u001b[39m# Copyright 2020 The HuggingFace Datasets Authors and the TensorFlow Datasets Authors.\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[39m#\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[39m# pylint: enable=line-too-long\u001b[39;00m\n\u001b[1;32m 18\u001b[0m \u001b[39m# pylint: disable=g-import-not-at-top,g-bad-import-order,wrong-import-position\u001b[39;00m\n\u001b[1;32m 20\u001b[0m __version__ \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m2.14.5\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m---> 22\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39marrow_dataset\u001b[39;00m \u001b[39mimport\u001b[39;00m Dataset\n\u001b[1;32m 23\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39marrow_reader\u001b[39;00m \u001b[39mimport\u001b[39;00m ReadInstruction\n\u001b[1;32m 24\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mbuilder\u001b[39;00m \u001b[39mimport\u001b[39;00m ArrowBasedBuilder, BeamBasedBuilder, BuilderConfig, DatasetBuilder, GeneratorBasedBuilder\n",
36
+ "File \u001b[0;32m~/SentenceStructureComparision/venv/lib/python3.10/site-packages/datasets/arrow_dataset.py:67\u001b[0m\n\u001b[1;32m 65\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m \u001b[39mimport\u001b[39;00m config\n\u001b[1;32m 66\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39marrow_reader\u001b[39;00m \u001b[39mimport\u001b[39;00m ArrowReader\n\u001b[0;32m---> 67\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39marrow_writer\u001b[39;00m \u001b[39mimport\u001b[39;00m ArrowWriter, OptimizedTypedSequence\n\u001b[1;32m 68\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mdata_files\u001b[39;00m \u001b[39mimport\u001b[39;00m sanitize_patterns\n\u001b[1;32m 69\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mdownload\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mdownload_config\u001b[39;00m \u001b[39mimport\u001b[39;00m DownloadConfig\n",
37
+ "File \u001b[0;32m~/SentenceStructureComparision/venv/lib/python3.10/site-packages/datasets/arrow_writer.py:27\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mpyarrow\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mparquet\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mpq\u001b[39;00m\n\u001b[1;32m 26\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m \u001b[39mimport\u001b[39;00m config\n\u001b[0;32m---> 27\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mfeatures\u001b[39;00m \u001b[39mimport\u001b[39;00m Features, Image, Value\n\u001b[1;32m 28\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mfeatures\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mfeatures\u001b[39;00m \u001b[39mimport\u001b[39;00m (\n\u001b[1;32m 29\u001b[0m FeatureType,\n\u001b[1;32m 30\u001b[0m _ArrayXDExtensionType,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 36\u001b[0m to_pyarrow_listarray,\n\u001b[1;32m 37\u001b[0m )\n\u001b[1;32m 38\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mfilesystems\u001b[39;00m \u001b[39mimport\u001b[39;00m is_remote_filesystem\n",
38
+ "File \u001b[0;32m~/SentenceStructureComparision/venv/lib/python3.10/site-packages/datasets/features/__init__.py:17\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39m# flake8: noqa\u001b[39;00m\n\u001b[1;32m 3\u001b[0m __all__ \u001b[39m=\u001b[39m [\n\u001b[1;32m 4\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mAudio\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 5\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mArray2D\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mTranslationVariableLanguages\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 16\u001b[0m ]\n\u001b[0;32m---> 17\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39maudio\u001b[39;00m \u001b[39mimport\u001b[39;00m Audio\n\u001b[1;32m 18\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mfeatures\u001b[39;00m \u001b[39mimport\u001b[39;00m Array2D, Array3D, Array4D, Array5D, ClassLabel, Features, Sequence, Value\n\u001b[1;32m 19\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mimage\u001b[39;00m \u001b[39mimport\u001b[39;00m Image\n",
39
+ "File \u001b[0;32m~/SentenceStructureComparision/venv/lib/python3.10/site-packages/datasets/features/audio.py:11\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39m.\u001b[39;00m \u001b[39mimport\u001b[39;00m config\n\u001b[1;32m 10\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mdownload\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mdownload_config\u001b[39;00m \u001b[39mimport\u001b[39;00m DownloadConfig\n\u001b[0;32m---> 11\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mdownload\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mstreaming_download_manager\u001b[39;00m \u001b[39mimport\u001b[39;00m xopen, xsplitext\n\u001b[1;32m 12\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mtable\u001b[39;00m \u001b[39mimport\u001b[39;00m array_cast\n\u001b[1;32m 13\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mutils\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mpy_utils\u001b[39;00m \u001b[39mimport\u001b[39;00m no_op_if_value_is_null, string_to_dict\n",
40
+ "File \u001b[0;32m~/SentenceStructureComparision/venv/lib/python3.10/site-packages/datasets/download/__init__.py:9\u001b[0m\n\u001b[1;32m 1\u001b[0m __all__ \u001b[39m=\u001b[39m [\n\u001b[1;32m 2\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mDownloadConfig\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 3\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mDownloadManager\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 4\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mDownloadMode\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 5\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mStreamingDownloadManager\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 6\u001b[0m ]\n\u001b[1;32m 8\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mdownload_config\u001b[39;00m \u001b[39mimport\u001b[39;00m DownloadConfig\n\u001b[0;32m----> 9\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mdownload_manager\u001b[39;00m \u001b[39mimport\u001b[39;00m DownloadManager, DownloadMode\n\u001b[1;32m 10\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mstreaming_download_manager\u001b[39;00m \u001b[39mimport\u001b[39;00m StreamingDownloadManager\n",
41
+ "File \u001b[0;32m~/SentenceStructureComparision/venv/lib/python3.10/site-packages/datasets/download/download_manager.py:35\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mutils\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39minfo_utils\u001b[39;00m \u001b[39mimport\u001b[39;00m get_size_checksum_dict\n\u001b[1;32m 34\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mutils\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mlogging\u001b[39;00m \u001b[39mimport\u001b[39;00m get_logger, is_progress_bar_enabled, tqdm\n\u001b[0;32m---> 35\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mutils\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mpy_utils\u001b[39;00m \u001b[39mimport\u001b[39;00m NestedDataStructure, map_nested, size_str\n\u001b[1;32m 36\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mdownload_config\u001b[39;00m \u001b[39mimport\u001b[39;00m DownloadConfig\n\u001b[1;32m 39\u001b[0m logger \u001b[39m=\u001b[39m get_logger(\u001b[39m__name__\u001b[39m)\n",
42
+ "File \u001b[0;32m~/SentenceStructureComparision/venv/lib/python3.10/site-packages/datasets/utils/py_utils.py:41\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mdill\u001b[39;00m\n\u001b[1;32m 40\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mmultiprocess\u001b[39;00m\n\u001b[0;32m---> 41\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mmultiprocess\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mpool\u001b[39;00m\n\u001b[1;32m 42\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mnumpy\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mnp\u001b[39;00m\n\u001b[1;32m 43\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mpackaging\u001b[39;00m \u001b[39mimport\u001b[39;00m version\n",
43
+ "File \u001b[0;32m~/SentenceStructureComparision/venv/lib/python3.10/site-packages/multiprocess/pool.py:29\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[39m# If threading is available then ThreadPool should be provided. Therefore\u001b[39;00m\n\u001b[1;32m 27\u001b[0m \u001b[39m# we avoid top-level imports which are liable to fail on some systems.\u001b[39;00m\n\u001b[1;32m 28\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m \u001b[39mimport\u001b[39;00m util\n\u001b[0;32m---> 29\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m \u001b[39mimport\u001b[39;00m get_context, \u001b[39mTimeoutError\u001b[39;00m\n\u001b[1;32m 30\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mconnection\u001b[39;00m \u001b[39mimport\u001b[39;00m wait\n\u001b[1;32m 32\u001b[0m \u001b[39m#\u001b[39;00m\n\u001b[1;32m 33\u001b[0m \u001b[39m# Constants representing the state of a pool\u001b[39;00m\n\u001b[1;32m 34\u001b[0m \u001b[39m#\u001b[39;00m\n",
44
+ "\u001b[0;31mImportError\u001b[0m: cannot import name 'get_context' from 'multiprocess' (/home/ubuntu/SentenceStructureComparision/venv/lib/python3.10/site-packages/multiprocess/__init__.py)"
45
+ ]
46
+ }
47
+ ],
48
+ "source": [
49
+ "from datasets import load_dataset\n",
50
+ "from tqdm import tqdm\n",
51
+ "import pandas as pd\n",
52
+ "import pyarrow as pa\n",
53
+ "import pyarrow.compute as pc\n",
54
+ "import re\n",
55
+ "import pyarrow.dataset as ds"
56
+ ]
57
+ },
58
+ {
59
+ "cell_type": "code",
60
+ "execution_count": null,
61
+ "metadata": {},
62
+ "outputs": [
63
+ {
64
+ "name": "stderr",
65
+ "output_type": "stream",
66
+ "text": [
67
+ "Downloading: 100%|██████████| 15.3k/15.3k [00:00<00:00, 19.5MB/s]\n",
68
+ "Downloading: 3%|▎ | 703M/20.3G [00:11<05:19, 61.2MB/s] "
69
+ ]
70
+ }
71
+ ],
72
+ "source": [
73
+ "dataset = load_dataset(\"wikipedia\", \"20220301.en\", split=\"train\")"
74
+ ]
75
+ },
76
+ {
77
+ "cell_type": "code",
78
+ "execution_count": 3,
79
+ "metadata": {},
80
+ "outputs": [],
81
+ "source": [
82
+ "data_df = dataset.to_pandas()"
83
+ ]
84
+ },
85
+ {
86
+ "cell_type": "code",
87
+ "execution_count": 6,
88
+ "metadata": {},
89
+ "outputs": [],
90
+ "source": [
91
+ "def keep_intro(text):\n",
92
+ " return re.sub(r'\\(\\W*\\)', '', ' '.join(text.split('\\n\\n')[:2]))"
93
+ ]
94
+ },
95
+ {
96
+ "cell_type": "code",
97
+ "execution_count": 7,
98
+ "metadata": {},
99
+ "outputs": [],
100
+ "source": [
101
+ "data_df['intro'] = data_df.apply(lambda row: keep_intro(row['text']), axis=1)"
102
+ ]
103
+ },
104
+ {
105
+ "cell_type": "code",
106
+ "execution_count": 9,
107
+ "metadata": {},
108
+ "outputs": [],
109
+ "source": [
110
+ "data_df[['id', 'title', 'url', 'intro']].to_csv('wiki_intro.csv', index=False)"
111
+ ]
112
+ },
113
+ {
114
+ "cell_type": "code",
115
+ "execution_count": 3,
116
+ "metadata": {},
117
+ "outputs": [],
118
+ "source": [
119
+ "data_df = pd.read_csv('wiki_intro.csv')"
120
+ ]
121
+ },
122
+ {
123
+ "cell_type": "code",
124
+ "execution_count": 4,
125
+ "metadata": {},
126
+ "outputs": [
127
+ {
128
+ "data": {
129
+ "text/plain": [
130
+ "6458670"
131
+ ]
132
+ },
133
+ "execution_count": 4,
134
+ "metadata": {},
135
+ "output_type": "execute_result"
136
+ }
137
+ ],
138
+ "source": [
139
+ "len(data_df)"
140
+ ]
141
+ },
142
+ {
143
+ "cell_type": "code",
144
+ "execution_count": 5,
145
+ "metadata": {},
146
+ "outputs": [
147
+ {
148
+ "data": {
149
+ "text/html": [
150
+ "<div>\n",
151
+ "<style scoped>\n",
152
+ " .dataframe tbody tr th:only-of-type {\n",
153
+ " vertical-align: middle;\n",
154
+ " }\n",
155
+ "\n",
156
+ " .dataframe tbody tr th {\n",
157
+ " vertical-align: top;\n",
158
+ " }\n",
159
+ "\n",
160
+ " .dataframe thead th {\n",
161
+ " text-align: right;\n",
162
+ " }\n",
163
+ "</style>\n",
164
+ "<table border=\"1\" class=\"dataframe\">\n",
165
+ " <thead>\n",
166
+ " <tr style=\"text-align: right;\">\n",
167
+ " <th></th>\n",
168
+ " <th>id</th>\n",
169
+ " <th>title</th>\n",
170
+ " <th>url</th>\n",
171
+ " <th>intro</th>\n",
172
+ " </tr>\n",
173
+ " </thead>\n",
174
+ " <tbody>\n",
175
+ " <tr>\n",
176
+ " <th>0</th>\n",
177
+ " <td>12</td>\n",
178
+ " <td>Anarchism</td>\n",
179
+ " <td>https://en.wikipedia.org/wiki/Anarchism</td>\n",
180
+ " <td>Anarchism is a political philosophy and moveme...</td>\n",
181
+ " </tr>\n",
182
+ " <tr>\n",
183
+ " <th>1</th>\n",
184
+ " <td>25</td>\n",
185
+ " <td>Autism</td>\n",
186
+ " <td>https://en.wikipedia.org/wiki/Autism</td>\n",
187
+ " <td>Autism is a neurodevelopmental disorder charac...</td>\n",
188
+ " </tr>\n",
189
+ " <tr>\n",
190
+ " <th>2</th>\n",
191
+ " <td>39</td>\n",
192
+ " <td>Albedo</td>\n",
193
+ " <td>https://en.wikipedia.org/wiki/Albedo</td>\n",
194
+ " <td>Albedo is the measure of the diffuse reflecti...</td>\n",
195
+ " </tr>\n",
196
+ " <tr>\n",
197
+ " <th>3</th>\n",
198
+ " <td>290</td>\n",
199
+ " <td>A</td>\n",
200
+ " <td>https://en.wikipedia.org/wiki/A</td>\n",
201
+ " <td>A, or a, is the first letter and the first vow...</td>\n",
202
+ " </tr>\n",
203
+ " <tr>\n",
204
+ " <th>4</th>\n",
205
+ " <td>303</td>\n",
206
+ " <td>Alabama</td>\n",
207
+ " <td>https://en.wikipedia.org/wiki/Alabama</td>\n",
208
+ " <td>Alabama is a state in the Southeastern region...</td>\n",
209
+ " </tr>\n",
210
+ " <tr>\n",
211
+ " <th>...</th>\n",
212
+ " <td>...</td>\n",
213
+ " <td>...</td>\n",
214
+ " <td>...</td>\n",
215
+ " <td>...</td>\n",
216
+ " </tr>\n",
217
+ " <tr>\n",
218
+ " <th>6458665</th>\n",
219
+ " <td>70201819</td>\n",
220
+ " <td>Bianca Fernandez</td>\n",
221
+ " <td>https://en.wikipedia.org/wiki/Bianca%20Fernandez</td>\n",
222
+ " <td>Bianca Jolie Fernandez (born 24 February 2004)...</td>\n",
223
+ " </tr>\n",
224
+ " <tr>\n",
225
+ " <th>6458666</th>\n",
226
+ " <td>70201882</td>\n",
227
+ " <td>Condons and Clangibbon</td>\n",
228
+ " <td>https://en.wikipedia.org/wiki/Condons%20and%20...</td>\n",
229
+ " <td>Condons and Clangibbon is a barony in County ...</td>\n",
230
+ " </tr>\n",
231
+ " <tr>\n",
232
+ " <th>6458667</th>\n",
233
+ " <td>70201886</td>\n",
234
+ " <td>2022 Chattanooga Red Wolves SC season</td>\n",
235
+ " <td>https://en.wikipedia.org/wiki/2022%20Chattanoo...</td>\n",
236
+ " <td>The 2022 Chattanooga Red Wolves SC season will...</td>\n",
237
+ " </tr>\n",
238
+ " <tr>\n",
239
+ " <th>6458668</th>\n",
240
+ " <td>70201947</td>\n",
241
+ " <td>Nkiko Prosper</td>\n",
242
+ " <td>https://en.wikipedia.org/wiki/Nkiko%20Prosper</td>\n",
243
+ " <td>Turatsinze Nkiko Prosper (born 1985) professio...</td>\n",
244
+ " </tr>\n",
245
+ " <tr>\n",
246
+ " <th>6458669</th>\n",
247
+ " <td>70201959</td>\n",
248
+ " <td>Michael O'Donnell (Missouri politician)</td>\n",
249
+ " <td>https://en.wikipedia.org/wiki/Michael%20O%27Do...</td>\n",
250
+ " <td>Michael A. O'Donnell (born June 17, 1968) is a...</td>\n",
251
+ " </tr>\n",
252
+ " </tbody>\n",
253
+ "</table>\n",
254
+ "<p>6458670 rows × 4 columns</p>\n",
255
+ "</div>"
256
+ ],
257
+ "text/plain": [
258
+ " id title \\\n",
259
+ "0 12 Anarchism \n",
260
+ "1 25 Autism \n",
261
+ "2 39 Albedo \n",
262
+ "3 290 A \n",
263
+ "4 303 Alabama \n",
264
+ "... ... ... \n",
265
+ "6458665 70201819 Bianca Fernandez \n",
266
+ "6458666 70201882 Condons and Clangibbon \n",
267
+ "6458667 70201886 2022 Chattanooga Red Wolves SC season \n",
268
+ "6458668 70201947 Nkiko Prosper \n",
269
+ "6458669 70201959 Michael O'Donnell (Missouri politician) \n",
270
+ "\n",
271
+ " url \\\n",
272
+ "0 https://en.wikipedia.org/wiki/Anarchism \n",
273
+ "1 https://en.wikipedia.org/wiki/Autism \n",
274
+ "2 https://en.wikipedia.org/wiki/Albedo \n",
275
+ "3 https://en.wikipedia.org/wiki/A \n",
276
+ "4 https://en.wikipedia.org/wiki/Alabama \n",
277
+ "... ... \n",
278
+ "6458665 https://en.wikipedia.org/wiki/Bianca%20Fernandez \n",
279
+ "6458666 https://en.wikipedia.org/wiki/Condons%20and%20... \n",
280
+ "6458667 https://en.wikipedia.org/wiki/2022%20Chattanoo... \n",
281
+ "6458668 https://en.wikipedia.org/wiki/Nkiko%20Prosper \n",
282
+ "6458669 https://en.wikipedia.org/wiki/Michael%20O%27Do... \n",
283
+ "\n",
284
+ " intro \n",
285
+ "0 Anarchism is a political philosophy and moveme... \n",
286
+ "1 Autism is a neurodevelopmental disorder charac... \n",
287
+ "2 Albedo is the measure of the diffuse reflecti... \n",
288
+ "3 A, or a, is the first letter and the first vow... \n",
289
+ "4 Alabama is a state in the Southeastern region... \n",
290
+ "... ... \n",
291
+ "6458665 Bianca Jolie Fernandez (born 24 February 2004)... \n",
292
+ "6458666 Condons and Clangibbon is a barony in County ... \n",
293
+ "6458667 The 2022 Chattanooga Red Wolves SC season will... \n",
294
+ "6458668 Turatsinze Nkiko Prosper (born 1985) professio... \n",
295
+ "6458669 Michael A. O'Donnell (born June 17, 1968) is a... \n",
296
+ "\n",
297
+ "[6458670 rows x 4 columns]"
298
+ ]
299
+ },
300
+ "execution_count": 5,
301
+ "metadata": {},
302
+ "output_type": "execute_result"
303
+ }
304
+ ],
305
+ "source": [
306
+ "data_df"
307
+ ]
308
+ },
309
+ {
310
+ "attachments": {},
311
+ "cell_type": "markdown",
312
+ "metadata": {},
313
+ "source": [
314
+ "## Data Cleaning"
315
+ ]
316
+ },
317
+ {
318
+ "cell_type": "code",
319
+ "execution_count": 14,
320
+ "metadata": {},
321
+ "outputs": [],
322
+ "source": [
323
+ "data_df = data_df[data_df.apply(lambda x : len(str(x['title'])) > 1, axis = 1)]"
324
+ ]
325
+ },
326
+ {
327
+ "cell_type": "code",
328
+ "execution_count": 15,
329
+ "metadata": {},
330
+ "outputs": [
331
+ {
332
+ "name": "stderr",
333
+ "output_type": "stream",
334
+ "text": [
335
+ "/var/folders/b5/qwcw21mn3973c1z_c12dw6hw0000gn/T/ipykernel_849/2014648341.py:1: SettingWithCopyWarning: \n",
336
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
337
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
338
+ "\n",
339
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
340
+ " data_df['intro_len'] = data_df.apply(lambda row: len(row['intro'].split(' ')), axis = 1)\n"
341
+ ]
342
+ }
343
+ ],
344
+ "source": [
345
+ "data_df['intro_len'] = data_df.apply(lambda row: len(row['intro'].split(' ')), axis = 1)"
346
+ ]
347
+ },
348
+ {
349
+ "cell_type": "code",
350
+ "execution_count": 16,
351
+ "metadata": {},
352
+ "outputs": [
353
+ {
354
+ "data": {
355
+ "text/plain": [
356
+ "<AxesSubplot: >"
357
+ ]
358
+ },
359
+ "execution_count": 16,
360
+ "metadata": {},
361
+ "output_type": "execute_result"
362
+ },
363
+ {
364
+ "data": {
365
+ "image/png": "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J3RcCgAAELfa9QbWuXPnau7cuS2uKy0tjXh811136a677mrP0wAAgMMA300DAABMUUYAAIApyggAADBFGQEAAKYoIwAAwBRlBAAAmKKMAAAAU5QRAABgijICAABMUUYAAIApyggAADBFGQEAAKYoIwAAwBRlBAAAmKKMAAAAU5QRAABgijICAABMUUYAAIApyggAADBFGQEAAKYoIwAAwBRlBAAAmKKMAAAAU5QRAABgijICAABMUUYAAIApyggAADBFGQEAAKYoIwAAwBRlBAAAmKKMAAAAU5QRAABgijICAABMUUYAAIApyggAADBFGQEAAKYoIwAAwBRlBAAAmKKMAAAAU5QRAABgKtF6AgAgScMWvKBAo896Gh3O38XpT2OtZwHENq6MAAAAU5QRAABgijICAABMUUYAAIApyggAADBFGQEAAKYoIwAAwBRlBAAAmKKMAAAAU5QRAABgijICAABMUUYAAIApyggAADBFGQEAAKYoIwAAwBRlBAAAmKKMAAAAU5QRAABgijICAABMUUYAAICpROsJAMDhYNiCFxRo9FlPo8P5uzj9aaz1LBDvuDICAABMUUYAAIApyggAADBFGQEAAKYoIwAAwBRlBAAAmKKMAAAAU+36nJGlS5fq9ttvV01NjXJycnTPPfdo7NjWbzRftWqVbr75Zn300UcaMmSIbrvtNp1zzjntnjQAILZ49XNUJD5L5VCI+srIY489pvz8fM2fP19vvPGGcnJyNGnSJO3cubPF8a+88opmzJihyy67TJs3b9a0adM0bdo0bd269QdPHgAAxL+or4zceeedmj17ti655BJJ0rJly/TMM8/ooYce0g033NBs/N13363JkyfruuuukyQtWrRIxcXFuvfee7Vs2bIfOH0AAA4Nr179iYUrP1GVkf3796uiokIFBQXhZQkJCcrLy1NZWVmL25SVlSk/Pz9i2aRJk7RmzZpWnycQCCgQCIQf19XVSZJ27dqlYDAYzZQPKBgMqqGhQYnBBDWGvHeCSVJiyKmhIeTZjOSLf17PSL745/WMTfm+/PJLJSUldei+9+zZI0lyzh14DtHs9IsvvlBjY6PS09Mjlqenp+vdd99tcZuampoWx9fU1LT6PIWFhVq4cGGz5dnZ2dFMF//fTOsJdDLyxT+vZyRf/PN6xs7Ot2fPHvXs2bPV9TH5RXkFBQURV1NCoZB27dqlI488Uj5fx7XS+vp69evXT5988olSU1M7bL+xxOsZyRf/vJ6RfPHP6xk7M59zTnv27FFWVtYBx0VVRtLS0tSlSxfV1tZGLK+trVVGRkaL22RkZEQ1XpL8fr/8fn/Esl69ekUz1aikpqZ68gT7Lq9nJF/883pG8sU/r2fsrHwHuiLSJKq7aZKTkzV69GiVlJSEl4VCIZWUlCg3N7fFbXJzcyPGS1JxcXGr4wEAwOEl6pdp8vPzNWvWLI0ZM0Zjx47VkiVLtG/fvvDdNRdffLH69u2rwsJCSdK8efN05plnavHixZo6dapWrlyp8vJyPfDAAx2bBAAAxKWoy8j06dP1+eef65ZbblFNTY1OOukkPf/88+E3qVZXVysh4X8XXE499VStWLFCv/vd73TjjTdqyJAhWrNmjYYNG9ZxKdrJ7/dr/vz5zV4S8hKvZyRf/PN6RvLFP69njIV8Pnew+20AAAA6Ed9NAwAATFFGAACAKcoIAAAwRRkBAACmDusysnTpUg0cOFBdu3bVuHHj9Nprr1lPqV0WLFggn88X8XPccceF13/99deaM2eOjjzySHXv3l0//elPm30QXSzZsGGDzj33XGVlZcnn8zX7HiPnnG655RZlZmaqW7duysvL0/vvvx8xZteuXbrooouUmpqqXr166bLLLtPevXsPYYoDO1jGX/7yl82O6eTJkyPGxHLGwsJCnXzyyerRo4f69OmjadOmqaqqKmJMW87L6upqTZ06VSkpKerTp4+uu+46ffPNN4cySovakm/8+PHNjuGVV14ZMSZW891///0aMWJE+EOwcnNz9dxzz4XXx/Oxa3KwjPF8/Fpy6623yufz6eqrrw4vi6nj6A5TK1eudMnJye6hhx5yb731lps9e7br1auXq62ttZ5a1ObPn+9OPPFEt2PHjvDP559/Hl5/5ZVXun79+rmSkhJXXl7uTjnlFHfqqacazvjAnn32WXfTTTe5J5980klyq1evjlh/6623up49e7o1a9a4f//73+68885z2dnZ7quvvgqPmTx5ssvJyXGvvvqq+9e//uUGDx7sZsyYcYiTtO5gGWfNmuUmT54ccUx37doVMSaWM06aNMk9/PDDbuvWra6ystKdc845rn///m7v3r3hMQc7L7/55hs3bNgwl5eX5zZv3uyeffZZl5aW5goKCiwiRWhLvjPPPNPNnj074hjW1dWF18dyvn/84x/umWeece+9956rqqpyN954o0tKSnJbt251zsX3sWtysIzxfPy+77XXXnMDBw50I0aMcPPmzQsvj6XjeNiWkbFjx7o5c+aEHzc2NrqsrCxXWFhoOKv2mT9/vsvJyWlx3e7du11SUpJbtWpVeNk777zjJLmysrJDNMP2+/4v6lAo5DIyMtztt98eXrZ7927n9/vdo48+6pxz7u2333aS3Ouvvx4e89xzzzmfz+c+/fTTQzb3tmqtjJx//vmtbhNvGXfu3OkkufXr1zvn2nZePvvssy4hIcHV1NSEx9x///0uNTXVBQKBQxvgIL6fz7lvf5l99z/+74unfM45d8QRR7gHH3zQc8fuu5oyOued47dnzx43ZMgQV1xcHJEp1o7jYfkyzf79+1VRUaG8vLzwsoSEBOXl5amsrMxwZu33/vvvKysrS4MGDdJFF12k6upqSVJFRYWCwWBE1uOOO079+/ePy6zbt29XTU1NRJ6ePXtq3Lhx4TxlZWXq1auXxowZEx6Tl5enhIQEbdq06ZDPub1KS0vVp08fDR06VFdddZW+/PLL8Lp4y1hXVydJ6t27t6S2nZdlZWUaPnx4xLd+T5o0SfX19XrrrbcO4ewP7vv5mvz9739XWlqahg0bpoKCAjU0NITXxUu+xsZGrVy5Uvv27VNubq7njp3UPGMTLxy/OXPmaOrUqRHHS4q9f4Mx+a29ne2LL75QY2NjxF+wJKWnp+vdd981mlX7jRs3TkVFRRo6dKh27NihhQsX6vTTT9fWrVtVU1Oj5OTkZl80mJ6erpqaGpsJ/wBNc27p2DWtq6mpUZ8+fSLWJyYmqnfv3nGTefLkybrggguUnZ2tDz74QDfeeKOmTJmisrIydenSJa4yhkIhXX311TrttNPCn7zclvOypqamxePctC5WtJRPkmbOnKkBAwYoKytLb775pn7729+qqqpKTz75pKTYz7dlyxbl5ubq66+/Vvfu3bV69WqdcMIJqqys9Myxay2jFP/HT5JWrlypN954Q6+//nqzdbH2b/CwLCNeM2XKlPCfR4wYoXHjxmnAgAF6/PHH1a1bN8OZob1+/vOfh/88fPhwjRgxQsccc4xKS0s1YcIEw5lFb86cOdq6das2btxoPZVO0Vq+K664Ivzn4cOHKzMzUxMmTNAHH3ygY4455lBPM2pDhw5VZWWl6urq9MQTT2jWrFlav3699bQ6VGsZTzjhhLg/fp988onmzZun4uJide3a1Xo6B3VYvkyTlpamLl26NHvXcG1trTIyMoxm1XF69eqlY489Vtu2bVNGRob279+v3bt3R4yJ16xNcz7QscvIyNDOnTsj1n/zzTfatWtXXGaWpEGDBiktLU3btm2TFD8Z586dq6efflovvfSSjj766PDytpyXGRkZLR7npnWxoLV8LRk3bpwkRRzDWM6XnJyswYMHa/To0SosLFROTo7uvvtuzxw7qfWMLYm341dRUaGdO3dq1KhRSkxMVGJiotavX68///nPSkxMVHp6ekwdx8OyjCQnJ2v06NEqKSkJLwuFQiopKYl4vTBe7d27Vx988IEyMzM1evRoJSUlRWStqqpSdXV1XGbNzs5WRkZGRJ76+npt2rQpnCc3N1e7d+9WRUVFeMy6desUCoXC/6HEm//85z/68ssvlZmZKSn2MzrnNHfuXK1evVrr1q1TdnZ2xPq2nJe5ubnasmVLROkqLi5Wampq+FK6lYPla0llZaUkRRzDWM3XklAopEAgEPfH7kCaMrYk3o7fhAkTtGXLFlVWVoZ/xowZo4suuij855g6jh36dtg4snLlSuf3+11RUZF7++233RVXXOF69eoV8a7heHHNNde40tJSt337dvfyyy+7vLw8l5aW5nbu3Omc+/b2rf79+7t169a58vJyl5ub63Jzc41n3bo9e/a4zZs3u82bNztJ7s4773SbN292H3/8sXPu21t7e/Xq5Z566in35ptvuvPPP7/FW3tHjhzpNm3a5DZu3OiGDBkSM7e9OnfgjHv27HHXXnutKysrc9u3b3cvvviiGzVqlBsyZIj7+uuvw/uI5YxXXXWV69mzpystLY24NbKhoSE85mDnZdNthRMnTnSVlZXu+eefd0cddVRM3Dp5sHzbtm1zv//97115ebnbvn27e+qpp9ygQYPcGWecEd5HLOe74YYb3Pr169327dvdm2++6W644Qbn8/nc2rVrnXPxfeyaHChjvB+/1nz/DqFYOo6HbRlxzrl77rnH9e/f3yUnJ7uxY8e6V1991XpK7TJ9+nSXmZnpkpOTXd++fd306dPdtm3bwuu/+uor96tf/codccQRLiUlxf3kJz9xO3bsMJzxgb300ktOUrOfWbNmOee+vb335ptvdunp6c7v97sJEya4qqqqiH18+eWXbsaMGa579+4uNTXVXXLJJW7Pnj0GaVp2oIwNDQ1u4sSJ7qijjnJJSUluwIABbvbs2c2KcixnbCmbJPfwww+Hx7TlvPzoo4/clClTXLdu3VxaWpq75pprXDAYPMRpmjtYvurqanfGGWe43r17O7/f7wYPHuyuu+66iM+pcC5281166aVuwIABLjk52R111FFuwoQJ4SLiXHwfuyYHyhjvx6813y8jsXQcfc4517HXWgAAANrusHzPCAAAiB2UEQAAYIoyAgAATFFGAACAKcoIAAAwRRkBAACmKCMAAMAUZQQAAJiijAAAAFOUEQAAYIoyAgAATFFGAACAqf8Hc7Wzy0owsBoAAAAASUVORK5CYII=",
366
+ "text/plain": [
367
+ "<Figure size 640x480 with 1 Axes>"
368
+ ]
369
+ },
370
+ "metadata": {},
371
+ "output_type": "display_data"
372
+ }
373
+ ],
374
+ "source": [
375
+ "data_df['intro_len'].hist(bins=[0,50,100,150,200,250,300,350,400])"
376
+ ]
377
+ },
378
+ {
379
+ "cell_type": "code",
380
+ "execution_count": 20,
381
+ "metadata": {},
382
+ "outputs": [],
383
+ "source": [
384
+ "data_df = data_df[data_df['intro_len'].between(150, 350)]"
385
+ ]
386
+ },
387
+ {
388
+ "cell_type": "code",
389
+ "execution_count": 23,
390
+ "metadata": {},
391
+ "outputs": [],
392
+ "source": [
393
+ "data_df['title_len'] = data_df.apply(lambda row: len(row['title'].split(' ')), axis = 1)"
394
+ ]
395
+ },
396
+ {
397
+ "cell_type": "code",
398
+ "execution_count": 26,
399
+ "metadata": {},
400
+ "outputs": [
401
+ {
402
+ "data": {
403
+ "text/plain": [
404
+ "<AxesSubplot: >"
405
+ ]
406
+ },
407
+ "execution_count": 26,
408
+ "metadata": {},
409
+ "output_type": "execute_result"
410
+ },
411
+ {
412
+ "data": {
413
+ "image/png": "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bDNnztRTTz2lyZMna9CgQXrooYdUUFCgkpKSYLcGSYmJiZKkurq6gOV1dXXWuvZEEMI18fv9ysvL05tvvqktW7YoJSUl2C0ZbcyYMdq/f79qa2utn+HDh+vBBx9UbW2tIiIigt2iUe66666LPk7ib3/7m/r27Rukjsx29uxZhYcH/rqLiIhQc3NzkDrChVJSUpSYmKjKykprmcfj0c6dO+VwONr98Tk0hmuSm5urVatW6fe//726du1qHceNi4tTTExMkLszT9euXS86P6tz587q2bMn520FQUFBge6880795Cc/0b//+79r165devnll/Xyyy8HuzUj3XPPPXr++efVp08f3XrrrXr33Xe1cOFCPfLII8FuzRhnzpzRhx9+aN0+cuSIamtr1aNHD/Xp00f5+fl67rnndPPNNyslJUXPPPOMkpKSrCvL2pUfuAaSLvnz+uuvB7s1/H//9m//5n/iiSeC3Yax3nrrLf/AgQP9NpvN379/f//LL78c7JaM5fF4/E888YS/T58+/ujoaP83v/lN/49//GO/1+sNdmvG+NOf/nTJ3xk5OTl+v9/vb25u9j/zzDP+hIQEv81m848ZM8Z/+PDhf0lvfI4QAAAwFucIAQAAYxGEAACAsQhCAADAWAQhAABgLIIQAAAwFkEIAAAYiyAEAACMRRACAADGIggBAABjEYQAAICxCEIAAMBYBCEAAGCs/wdaTjD4nrBYpAAAAABJRU5ErkJggg==",
414
+ "text/plain": [
415
+ "<Figure size 640x480 with 1 Axes>"
416
+ ]
417
+ },
418
+ "metadata": {},
419
+ "output_type": "display_data"
420
+ }
421
+ ],
422
+ "source": [
423
+ "data_df.title_len.hist(bins=[1,2,3,4,5,6,7,8,9,10])"
424
+ ]
425
+ },
426
+ {
427
+ "cell_type": "code",
428
+ "execution_count": 27,
429
+ "metadata": {},
430
+ "outputs": [],
431
+ "source": [
432
+ "data_df = data_df[data_df['title_len'] < 4]"
433
+ ]
434
+ },
435
+ {
436
+ "cell_type": "code",
437
+ "execution_count": 34,
438
+ "metadata": {},
439
+ "outputs": [],
440
+ "source": [
441
+ "data_df = data_df.sample(n=150000, random_state=1111)"
442
+ ]
443
+ },
444
+ {
445
+ "cell_type": "code",
446
+ "execution_count": 35,
447
+ "metadata": {},
448
+ "outputs": [
449
+ {
450
+ "data": {
451
+ "text/plain": [
452
+ "<AxesSubplot: >"
453
+ ]
454
+ },
455
+ "execution_count": 35,
456
+ "metadata": {},
457
+ "output_type": "execute_result"
458
+ },
459
+ {
460
+ "data": {
461
+ "image/png": "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m19tx/iNN9642XFqaMzxGzNmTI21z5gxI2BMaz1+UsMZT5w4Ued5uGnTJntcaz2GL7/8soYOHWp/OZzT6dS7775r7w/l88+vvoyhfg5KDR/DVncOWmi0rVu3Wn//939v/fGPf7QkWZs3bw7Yn5GRYY0fP946deqU/efMmTMBY8aPH28NGzbM2rt3r/X+++9b/fv3tx5++OGbmKJuDeW7NtepU6es1atXW2FhYdYXX3xhj+nbt6+1cOHCgHEXLly4yUlq53K5rDVr1liHDx+2SktLrXvuucfq06dPwPpmzJhh9e7d2youLrb2799vjR492rrjjjvs/VevXrUGDx5spaamWgcPHrS2bt1qdevWzcrJyWmJSAEaynfo0CFr4sSJ1ttvv219/vnnVnFxsXX77bdbkyZNCphHkrVmzZqAY3j58uWWiBSgMcfvZz/7mTV9+vSAtZ87d87e35qPn2U1nPHq1as1zsMFCxZY7du3t86fP2/P01qP4dtvv20VFBRY//mf/2kdO3bMeu6556zIyEjr8OHDlmWF9vnnV1/GUD8HLavhY9jazkFKznWqq+Tcd999dd7nk08+sSRZH330kb3t3XfftcLCwqz/+Z//CdJKr09t+b7rvvvus8aOHRuwrW/fvtby5cuDt7BmdPr0aUuStWvXLsuyLOvs2bNWZGSktWnTJnvMp59+akmy3G63ZVl/LYLh4eGWx+Oxx7z88suWw+GwvF7vzQ3QgO/mq83GjRutqKgoy+fz2dsac+xbg9ry/exnP7OefvrpOu8TSsfPshp3DJOSkqzHHnssYFuoHEPLsqzOnTtbr776qnHn37X8GWsTyueg37X5Wts5yNtVzWznzp3q0aOHBgwYoJkzZ+qbb76x97ndbnXq1EkjR460t6Wmpio8PFwffvhhSyz3upWXl6ugoEDTpk2rsW/JkiXq2rWrhg8frueff75VvZR8Lf9LxF26dJEklZSUyOfzKTU11R4zcOBA9enTR263W9Jfj+GQIUMCvnDS5XKpoqJCR44cuYmrb9h389U1xuFwqE2bwO8FzczMVLdu3TRq1CitXr1aViv8Oq268r3++uvq1q2bBg8erJycHF26dMneF0rHT2r4GJaUlKi0tLTW87C1H8Oqqiq98cYbunjxopxOp3Hnn1QzY21C+RysK19rOgdD+huPW5vx48dr4sSJSkhI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",
462
+ "text/plain": [
463
+ "<Figure size 640x480 with 1 Axes>"
464
+ ]
465
+ },
466
+ "metadata": {},
467
+ "output_type": "display_data"
468
+ }
469
+ ],
470
+ "source": [
471
+ "data_df['intro_len'].hist()"
472
+ ]
473
+ },
474
+ {
475
+ "cell_type": "code",
476
+ "execution_count": 4,
477
+ "metadata": {},
478
+ "outputs": [],
479
+ "source": [
480
+ "data_df['starter_text'] = data_df['intro'].apply(lambda x: ' '.join(str(x).split(' ')[:7]))"
481
+ ]
482
+ },
483
+ {
484
+ "cell_type": "code",
485
+ "execution_count": 6,
486
+ "metadata": {},
487
+ "outputs": [],
488
+ "source": [
489
+ "data_df.to_csv('data/wiki_intro_processed.csv', index=False)"
490
+ ]
491
+ }
492
+ ],
493
+ "metadata": {
494
+ "kernelspec": {
495
+ "display_name": "venv",
496
+ "language": "python",
497
+ "name": "python3"
498
+ },
499
+ "language_info": {
500
+ "codemirror_mode": {
501
+ "name": "ipython",
502
+ "version": 3
503
+ },
504
+ "file_extension": ".py",
505
+ "mimetype": "text/x-python",
506
+ "name": "python",
507
+ "nbconvert_exporter": "python",
508
+ "pygments_lexer": "ipython3",
509
+ "version": "3.10.12"
510
+ },
511
+ "orig_nbformat": 4,
512
+ "vscode": {
513
+ "interpreter": {
514
+ "hash": "3f100d68d9cf80676b1a4c3ace5430b03ae266a1d88e3f101eb196b64b263632"
515
+ }
516
+ }
517
+ },
518
+ "nbformat": 4,
519
+ "nbformat_minor": 2
520
+ }
wiki_gpt/requirements.txt ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ aiohttp==3.8.3
2
+ aiosignal==1.3.1
3
+ apache-beam
4
+ appnope==0.1.3
5
+ asttokens==2.2.1
6
+ async-timeout==4.0.2
7
+ attrs==22.2.0
8
+ backcall==0.2.0
9
+ certifi==2022.12.7
10
+ charset-normalizer==2.1.1
11
+ click==8.1.3
12
+ cloudpickle==2.2.1
13
+ comm==0.1.2
14
+ contourpy==1.0.7
15
+ crcmod==1.7
16
+ cycler==0.11.0
17
+ dask==2023.1.1
18
+ datasets
19
+ debugpy==1.6.6
20
+ decorator==5.1.1
21
+ dill
22
+ docopt==0.6.2
23
+ executing==1.2.0
24
+ fastavro==1.7.1
25
+ fasteners==0.18
26
+ filelock==3.9.0
27
+ fonttools==4.38.0
28
+ frozenlist==1.3.3
29
+ fsspec==2023.1.0
30
+ grpcio==1.51.1
31
+ hdfs==2.7.0
32
+ httplib2==0.20.4
33
+ huggingface-hub==0.12.0
34
+ idna==3.4
35
+ install==1.3.5
36
+ ipykernel==6.20.2
37
+ ipython==8.9.0
38
+ jedi==0.18.2
39
+ jupyter_client==8.0.2
40
+ jupyter_core==5.2.0
41
+ kiwisolver==1.4.4
42
+ locket==1.0.0
43
+ matplotlib==3.6.3
44
+ matplotlib-inline==0.1.6
45
+ multidict==6.0.4
46
+ multiprocess
47
+ mwparserfromhell==0.6.4
48
+ nest-asyncio==1.5.6
49
+ numpy==1.22.4
50
+ objsize==0.6.1
51
+ openai==0.26.4
52
+ orjson==3.8.5
53
+ packaging==23.0
54
+ pandas==1.5.3
55
+ parso==0.8.3
56
+ partd==1.3.0
57
+ pexpect==4.8.0
58
+ pickleshare==0.7.5
59
+ Pillow==9.4.0
60
+ pip==23.0
61
+ platformdirs==2.6.2
62
+ prompt-toolkit==3.0.36
63
+ proto-plus==1.22.2
64
+ protobuf==3.19.4
65
+ psutil==5.9.4
66
+ ptyprocess==0.7.0
67
+ pure-eval==0.2.2
68
+ pyarrow==9.0.0
69
+ pydot==1.4.2
70
+ Pygments==2.14.0
71
+ pymongo==3.13.0
72
+ pyparsing==3.0.9
73
+ python-dateutil==2.8.2
74
+ pytz==2022.7.1
75
+ PyYAML==6.0
76
+ pyzmq==25.0.0
77
+ regex==2022.10.31
78
+ requests==2.28.2
79
+ responses==0.18.0
80
+ setuptools==63.4.3
81
+ six==1.16.0
82
+ stack-data==0.6.2
83
+ toolz==0.12.0
84
+ tornado==6.2
85
+ tqdm==4.64.1
86
+ traitlets==5.9.0
87
+ typing_extensions==4.4.0
88
+ urllib3==1.26.14
89
+ wcwidth==0.2.6
90
+ xxhash==3.2.0
91
+ yarl==1.8.2
92
+ zstandard==0.19.0