srikanth1579 commited on
Commit
ab1fde5
·
verified ·
1 Parent(s): 3171726

Upload 11 files

Browse files
A2 #Q1 Dataset format.png ADDED
A2 #Q2 LSTM Model Class.png ADDED
A2 #Q3 Seq-to-Seq Model class.png ADDED
A2 #Q4 Training curves.docx ADDED
Binary file (102 kB). View file
 
A2 #Q5 BLEU Scores for both LSTM-based model vs Seq-to-seq model (Plot).png ADDED
A2 #Q6 BLEU Scores CSV file.csv ADDED
@@ -0,0 +1,1001 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Sample,BLEUSeq2seq Score,BLEU LTSM Score
2
+ 1,0.399632095,0.028610696
3
+ 2,0.860571445,0.326800669
4
+ 3,0.685595153,0.741736946
5
+ 4,0.578926787,0.777621286
6
+ 5,0.224814912,0.9
7
+ 6,0.224795616,0.426231956
8
+ 7,0.14646689,0.9
9
+ 8,0.792940917,0.711575621
10
+ 9,0.580892009,0.294392584
11
+ 10,0.666458062,0.304737051
12
+ 11,0.116467595,0
13
+ 12,0.875927882,0.9
14
+ 13,0.765954113,0.9
15
+ 14,0.269871289,0.06120956
16
+ 15,0.245459974,0.681207817
17
+ 16,0.246723608,0.9
18
+ 17,0.343393794,0
19
+ 18,0.519805145,0.422093015
20
+ 19,0.445556015,0.9
21
+ 20,0.332983312,0
22
+ 21,0.589482316,0.731325697
23
+ 22,0.211595089,0
24
+ 23,0.333715719,0.9
25
+ 24,0.393089475,0.867936226
26
+ 25,0.464855987,0.451630237
27
+ 26,0.728140769,0.770556212
28
+ 27,0.259739026,0.605986227
29
+ 28,0.511387551,0.57307641
30
+ 29,0.573931655,0.405422678
31
+ 30,0.13716033,0.9
32
+ 31,0.586035882,0
33
+ 32,0.236419299,0.592435865
34
+ 33,0.152041274,0.391211195
35
+ 34,0.85910843,0.36972991
36
+ 35,0.872505626,0.20567295
37
+ 36,0.746717878,0.565274061
38
+ 37,0.343691015,0.165002416
39
+ 38,0.178137691,0.701349388
40
+ 39,0.647386421,0
41
+ 40,0.452121995,0
42
+ 41,0.197630588,0.640732985
43
+ 42,0.496141528,0.9
44
+ 43,0.127510817,0
45
+ 44,0.827456322,0.348280425
46
+ 45,0.307023985,0.9
47
+ 46,0.630017827,0.9
48
+ 47,0.349368861,0.291566007
49
+ 48,0.516054417,0
50
+ 49,0.537368223,0.750354989
51
+ 50,0.247883564,0.460734633
52
+ 51,0.875667702,0.638270293
53
+ 52,0.720106259,0.323351706
54
+ 53,0.851599153,0.730568278
55
+ 54,0.81586188,0.500694437
56
+ 55,0.578319983,0.9
57
+ 56,0.837499388,0.786739067
58
+ 57,0.170794002,0.794520449
59
+ 58,0.25678629,0.358456355
60
+ 59,0.136181831,0.410947679
61
+ 60,0.360264265,0.211206668
62
+ 61,0.410941832,0.9
63
+ 62,0.317079225,0.867807476
64
+ 63,0.762990007,0.669498753
65
+ 64,0.385402661,0.9
66
+ 65,0.324747608,0.511773829
67
+ 66,0.534156867,0.502118079
68
+ 67,0.21273938,0.184432318
69
+ 68,0.741757585,0.475490718
70
+ 69,0.159640515,0.412015329
71
+ 70,0.889509549,0
72
+ 71,0.717795815,0.56685373
73
+ 72,0.258972545,0.119850179
74
+ 73,0.104417694,0.601998996
75
+ 74,0.752369143,0.384311164
76
+ 75,0.665485875,0.778347438
77
+ 76,0.683205734,0.762472597
78
+ 77,0.717016277,0.424425195
79
+ 78,0.159235721,0.856911245
80
+ 79,0.386772583,0.395786315
81
+ 80,0.192695248,0.648379783
82
+ 81,0.790482741,0.568188553
83
+ 82,0.598638501,0.429019006
84
+ 83,0.36471842,0.350370788
85
+ 84,0.15084668,0.70238253
86
+ 85,0.348785857,0.617004973
87
+ 86,0.360146658,0.579820975
88
+ 87,0.683684943,0.9
89
+ 88,0.610045977,0
90
+ 89,0.809770194,0.898989765
91
+ 90,0.47777194,0.6383925
92
+ 91,0.195675397,0.834275071
93
+ 92,0.67059583,0.732810268
94
+ 93,0.708628039,0.320591054
95
+ 94,0.549021758,0.617227583
96
+ 95,0.716773744,0.237749783
97
+ 96,0.495036477,0.487654925
98
+ 97,0.518186264,0.57323548
99
+ 98,0.442032815,0.89654152
100
+ 99,0.120335301,0.868575872
101
+ 100,0.186313142,0.461549286
102
+ 101,0.125143349,0.194870217
103
+ 102,0.609128329,0.786990531
104
+ 103,0.351484785,0.891649669
105
+ 104,0.506856553,0.768351474
106
+ 105,0.826053179,0.9
107
+ 106,0.299433783,0.568515583
108
+ 107,0.428306338,0.165357974
109
+ 108,0.704440911,0.9
110
+ 109,0.283038532,0.9
111
+ 110,0.161583928,0.193599593
112
+ 111,0.331801162,0.222202775
113
+ 112,0.22897703,0.127596961
114
+ 113,0.843758122,0.603302728
115
+ 114,0.746496304,0.523862523
116
+ 115,0.606723005,0.32452639
117
+ 116,0.797168472,0.437875236
118
+ 117,0.742937662,0.383344477
119
+ 118,0.249256047,0.9
120
+ 119,0.814047199,0.252747009
121
+ 120,0.531473794,0.111905834
122
+ 121,0.745952124,0.713058927
123
+ 122,0.81687304,0.633918652
124
+ 123,0.35440278,0.9
125
+ 124,0.18804154,0.667032742
126
+ 125,0.28234813,0.9
127
+ 126,0.441686231,0.9
128
+ 127,0.754411813,0.419167132
129
+ 128,0.788584467,0.318857492
130
+ 129,0.105561704,0.499083336
131
+ 130,0.508597842,0.301754125
132
+ 131,0.433928803,0.452810626
133
+ 132,0.277686248,0.577790408
134
+ 133,0.195892294,0
135
+ 134,0.370092137,0.573066409
136
+ 135,0.854327763,0.530452687
137
+ 136,0.358562346,0.211194602
138
+ 137,0.515032497,0.851787499
139
+ 138,0.662415167,0.431390978
140
+ 139,0.390903682,0.631142712
141
+ 140,0.877425666,0.455200314
142
+ 141,0.869957836,0.9
143
+ 142,0.301425837,0.041752446
144
+ 143,0.497798805,0.674007817
145
+ 144,0.340702648,0.9
146
+ 145,0.327872396,0.063539785
147
+ 146,0.129509558,0.633467746
148
+ 147,0.587651467,0.86641778
149
+ 148,0.502143219,0.671656913
150
+ 149,0.141183001,0.868122908
151
+ 150,0.322917171,0.9
152
+ 151,0.826612709,0.825370749
153
+ 152,0.291649513,0.9
154
+ 153,0.215915898,0.760431834
155
+ 154,0.491562208,0.583798204
156
+ 155,0.888520363,0.763032528
157
+ 156,0.293644217,0.9
158
+ 157,0.637708438,0.193725648
159
+ 158,0.709295692,0.561064281
160
+ 159,0.290110035,0.9
161
+ 160,0.682573079,0.093302535
162
+ 161,0.394226506,0.217486014
163
+ 162,0.605844664,0.414951313
164
+ 163,0.606823769,0.234263037
165
+ 164,0.528619747,0.672173284
166
+ 165,0.172231816,0.311602999
167
+ 166,0.768241996,0.801998539
168
+ 167,0.356624052,0.9
169
+ 168,0.249214808,0.397102594
170
+ 169,0.132620113,0.233385147
171
+ 170,0.572714355,0.264743837
172
+ 171,0.642051489,0.778244155
173
+ 172,0.113270263,0.9
174
+ 173,0.509674447,0.371591146
175
+ 174,0.28119662,0.579338394
176
+ 175,0.616138232,0.473213701
177
+ 176,0.239493143,0.734002753
178
+ 177,0.65275019,0.815698144
179
+ 178,0.409388277,0.64513043
180
+ 179,0.849383991,0.652955826
181
+ 180,0.210016755,0.445684064
182
+ 181,0.372853081,0.865538702
183
+ 182,0.190778817,0.297702787
184
+ 183,0.839754895,0.80608299
185
+ 184,0.801871483,0.441544832
186
+ 185,0.306353302,0
187
+ 186,0.627987237,0.582832059
188
+ 187,0.75377776,0.887885476
189
+ 188,0.544160649,0.58192299
190
+ 189,0.523720463,0.314658549
191
+ 190,0.293481833,0.62433224
192
+ 191,0.174482214,0.171393522
193
+ 192,0.817772606,0.856205944
194
+ 193,0.820334446,0.144868162
195
+ 194,0.606481166,0.65632466
196
+ 195,0.371223833,0.380393034
197
+ 196,0.37936766,0.9
198
+ 197,0.680764543,0.9
199
+ 198,0.817688208,0.9
200
+ 199,0.809669139,0.023913392
201
+ 200,0.723900437,0.373537822
202
+ 201,0.613625317,0.543091636
203
+ 202,0.167311972,0
204
+ 203,0.229302971,0.245499491
205
+ 204,0.818843351,0.702302812
206
+ 205,0.585143248,0.456552424
207
+ 206,0.107357641,0.9
208
+ 207,0.181177234,0.9
209
+ 208,0.630801415,0.785450778
210
+ 209,0.104049267,0.728892465
211
+ 210,0.228646441,0.9
212
+ 211,0.538987031,0.459803452
213
+ 212,0.653516158,0.060618166
214
+ 213,0.621569008,0.169383435
215
+ 214,0.279415448,0.52503599
216
+ 215,0.669743377,0.9
217
+ 216,0.28979927,0.232644237
218
+ 217,0.360319759,0.196706038
219
+ 218,0.697193124,0.782270786
220
+ 219,0.619706319,0.634509583
221
+ 220,0.779378728,0.742370382
222
+ 221,0.626090314,0.705028509
223
+ 222,0.554646883,0.269498177
224
+ 223,0.174939814,0.260250194
225
+ 224,0.394172642,0.524887108
226
+ 225,0.312161894,0.282839581
227
+ 226,0.295191715,0.601561559
228
+ 227,0.878408444,0.310749962
229
+ 228,0.41447818,0.146266917
230
+ 229,0.813637244,0.535602752
231
+ 230,0.604910901,0.406690812
232
+ 231,0.735849043,0.439099269
233
+ 232,0.502109674,0.473977676
234
+ 233,0.561523108,0.291093701
235
+ 234,0.494014155,0
236
+ 235,0.25619439,0.544031191
237
+ 236,0.677961692,0.206781974
238
+ 237,0.32461789,0.871280227
239
+ 238,0.119452773,0.813680537
240
+ 239,0.616377837,0.405761625
241
+ 240,0.241688544,0.277176932
242
+ 241,0.852366867,0.754865335
243
+ 242,0.863142862,0.889112501
244
+ 243,0.831891512,0.770036633
245
+ 244,0.39612696,0.58783425
246
+ 245,0.112365293,0.629055709
247
+ 246,0.84265485,0.401969793
248
+ 247,0.442547319,0.473997687
249
+ 248,0.873323855,0.131348856
250
+ 249,0.870895982,0.9
251
+ 250,0.782407564,0.578155048
252
+ 251,0.335559114,0.560128141
253
+ 252,0.408078183,0.106789283
254
+ 253,0.780909337,0
255
+ 254,0.353537604,0
256
+ 255,0.235594197,0.715233893
257
+ 256,0.54544101,0.571425972
258
+ 257,0.848923819,0
259
+ 258,0.656823837,0.717035216
260
+ 259,0.556048936,0.030601887
261
+ 260,0.177741195,0.602275375
262
+ 261,0.592005781,0.718249881
263
+ 262,0.89204308,0.9
264
+ 263,0.212067212,0.281156905
265
+ 264,0.514663722,0.241378063
266
+ 265,0.801898458,0
267
+ 266,0.692614894,0
268
+ 267,0.657612593,0.361212285
269
+ 268,0.661987267,0.237156186
270
+ 269,0.387592921,0.547202197
271
+ 270,0.334873475,0.352543034
272
+ 271,0.747488924,0.599771513
273
+ 272,0.748090716,0.625597273
274
+ 273,0.793657855,0.766044459
275
+ 274,0.830592442,0.242180223
276
+ 275,0.509073919,0.211805788
277
+ 276,0.501213036,0.536677238
278
+ 277,0.738636143,0.26898898
279
+ 278,0.619971145,0.89404248
280
+ 279,0.661573502,0.39105004
281
+ 280,0.736634136,0.557414556
282
+ 281,0.812004273,0.832808746
283
+ 282,0.370396125,0.733753018
284
+ 283,0.400466362,0.394609603
285
+ 284,0.175185552,0.198192559
286
+ 285,0.562624113,0.075237495
287
+ 286,0.128753819,0.541309241
288
+ 287,0.472478415,0.161985702
289
+ 288,0.534115708,0.328472331
290
+ 289,0.329233002,0.094428109
291
+ 290,0.572666608,0
292
+ 291,0.1244002,0.280357394
293
+ 292,0.129878551,0.229383829
294
+ 293,0.758080449,0.593996777
295
+ 294,0.388152513,0.39465319
296
+ 295,0.20164841,0.9
297
+ 296,0.517794608,0.043576483
298
+ 297,0.715994842,0.476350366
299
+ 298,0.272656822,0.290452863
300
+ 299,0.598312381,0.447587372
301
+ 300,0.168277972,0.9
302
+ 301,0.141345377,0
303
+ 302,0.525083705,0.9
304
+ 303,0.532508097,0.391722606
305
+ 304,0.609943921,0.365382016
306
+ 305,0.680873067,0.9
307
+ 306,0.880681664,0.73426367
308
+ 307,0.513040279,0.743442953
309
+ 308,0.358365178,0.806462926
310
+ 309,0.736148956,0.337982969
311
+ 310,0.316665801,0.9
312
+ 311,0.451177137,0.362464057
313
+ 312,0.162765105,0.378720332
314
+ 313,0.120280595,0.864158962
315
+ 314,0.870118732,0.338215219
316
+ 315,0.768784096,0.719991179
317
+ 316,0.656779365,0.89653844
318
+ 317,0.427162356,0.248380521
319
+ 318,0.238635456,0.582568045
320
+ 319,0.225149634,0
321
+ 320,0.300194319,0.09455141
322
+ 321,0.539381332,0.220674016
323
+ 322,0.671676738,0.422550877
324
+ 323,0.628157901,0.9
325
+ 324,0.323947118,0.624292143
326
+ 325,0.863892225,0.740150198
327
+ 326,0.690317533,0.317211165
328
+ 327,0.543483242,0
329
+ 328,0.589376597,0.530291289
330
+ 329,0.43568005,0.868179129
331
+ 330,0.298184792,0.9
332
+ 331,0.384778143,0.235703623
333
+ 332,0.706276888,0.527245358
334
+ 333,0.111514791,0.276162354
335
+ 334,0.192858112,0.9
336
+ 335,0.136802114,0.67743365
337
+ 336,0.132583042,0.72627581
338
+ 337,0.784368467,0.141174124
339
+ 338,0.662926288,0.640569526
340
+ 339,0.479339063,0.294329789
341
+ 340,0.178267329,0.126127569
342
+ 341,0.4932927,0.197049838
343
+ 342,0.478777417,0.442695914
344
+ 343,0.238561496,0.772527265
345
+ 344,0.447081319,0.589232498
346
+ 345,0.418803788,0.629466201
347
+ 346,0.592680078,0.84005646
348
+ 347,0.608074921,0.516977856
349
+ 348,0.136243208,0.322960931
350
+ 349,0.399690092,0.9
351
+ 350,0.600687933,0.048632481
352
+ 351,0.502509007,0.9
353
+ 352,0.785191873,0.655350875
354
+ 353,0.626954905,0.424066799
355
+ 354,0.230347542,0.79213536
356
+ 355,0.156454998,0.096616115
357
+ 356,0.613935423,0.517046723
358
+ 357,0.121209048,0.52208024
359
+ 358,0.568620465,0.473112515
360
+ 359,0.852184193,0.754590988
361
+ 360,0.560379342,0.9
362
+ 361,0.410535941,0.9
363
+ 362,0.614630575,0.39374087
364
+ 363,0.466602312,0.148108833
365
+ 364,0.536493431,0.469579726
366
+ 365,0.853171847,0.48954448
367
+ 366,0.40888211,0.050042249
368
+ 367,0.868952451,0.630624017
369
+ 368,0.824280514,0.709203372
370
+ 369,0.256632908,0
371
+ 370,0.155489041,0.477012224
372
+ 371,0.180622401,0.608930319
373
+ 372,0.114577461,0.304593278
374
+ 373,0.175554369,0.9
375
+ 374,0.646405419,0.263976137
376
+ 375,0.156950919,0
377
+ 376,0.355180504,0.725098866
378
+ 377,0.775900249,0.731484113
379
+ 378,0.118617549,0.9
380
+ 379,0.751574786,0.079999297
381
+ 380,0.32548382,0.698535487
382
+ 381,0.194531862,0.114491484
383
+ 382,0.657389732,0.386378141
384
+ 383,0.603154277,0.9
385
+ 384,0.801977611,0
386
+ 385,0.688056835,0.688824247
387
+ 386,0.742784744,0.477075344
388
+ 387,0.325627658,0.9
389
+ 388,0.241951635,0.229194717
390
+ 389,0.700491801,0.9
391
+ 390,0.745467791,0.365119491
392
+ 391,0.892404114,0.356122106
393
+ 392,0.430094142,0.072999329
394
+ 393,0.397614469,0.391199297
395
+ 394,0.721130369,0.423416575
396
+ 395,0.372642832,0.46387764
397
+ 396,0.84460586,0.755790989
398
+ 397,0.786730201,0.726222582
399
+ 398,0.443195222,0.286122987
400
+ 399,0.700696854,0.150457872
401
+ 400,0.703634299,0.9
402
+ 401,0.182499095,0.007200451
403
+ 402,0.822042325,0.070653788
404
+ 403,0.504201898,0
405
+ 404,0.761165973,0.9
406
+ 405,0.356039681,0.097125069
407
+ 406,0.816418583,0.9
408
+ 407,0.411361343,0.9
409
+ 408,0.108670121,0.800345851
410
+ 409,0.824305581,0.554559991
411
+ 410,0.173029341,0.866005543
412
+ 411,0.35545091,0.394953575
413
+ 412,0.860049574,0.350839592
414
+ 413,0.860485718,0.454700806
415
+ 414,0.55875031,0.168064655
416
+ 415,0.60546977,0.475601017
417
+ 416,0.458756418,0.811466233
418
+ 417,0.334568617,0.082747762
419
+ 418,0.362931636,0.481130455
420
+ 419,0.638014765,0.610148403
421
+ 420,0.701899624,0.112002855
422
+ 421,0.733263235,0.516900078
423
+ 422,0.731694514,0.554471896
424
+ 423,0.172964882,0.128581098
425
+ 424,0.495536244,0.121544947
426
+ 425,0.146047008,0.9
427
+ 426,0.539623106,0.9
428
+ 427,0.453224401,0
429
+ 428,0.810163346,0.9
430
+ 429,0.38073201,0.368381767
431
+ 430,0.193653613,0.449430094
432
+ 431,0.214393346,0.307112578
433
+ 432,0.709208505,0.728075191
434
+ 433,0.594574451,0.729358526
435
+ 434,0.180898141,0.761762761
436
+ 435,0.167285445,0.392994951
437
+ 436,0.660775305,0.253023444
438
+ 437,0.158210405,0.185973554
439
+ 438,0.757488047,0.771725246
440
+ 439,0.664993782,0.461585143
441
+ 440,0.165079025,0.827318779
442
+ 441,0.167870171,0.9
443
+ 442,0.889311663,0.352196534
444
+ 443,0.399416637,0.725943746
445
+ 444,0.396513718,0.722537735
446
+ 445,0.750239654,0.787883489
447
+ 446,0.857798862,0.021251169
448
+ 447,0.888800851,0.613334021
449
+ 448,0.702702548,0.584266571
450
+ 449,0.401007668,0.686896807
451
+ 450,0.166800573,0.610468755
452
+ 451,0.721717533,0.299634831
453
+ 452,0.5467234,0.51728741
454
+ 453,0.439377607,0.321720321
455
+ 454,0.825083508,0.609811224
456
+ 455,0.188957986,0.124611017
457
+ 456,0.494100083,0.640486799
458
+ 457,0.109082916,0.816432818
459
+ 458,0.474928514,0.875603243
460
+ 459,0.145042621,0
461
+ 460,0.195054333,0.436427182
462
+ 461,0.194020997,0.222805937
463
+ 462,0.619368242,0.386010606
464
+ 463,0.696835903,0.392643135
465
+ 464,0.566695012,0.577819709
466
+ 465,0.869738039,0.83340227
467
+ 466,0.399896464,0
468
+ 467,0.328569669,0.9
469
+ 468,0.794879303,0.11571177
470
+ 469,0.278876671,0.811585918
471
+ 470,0.870578032,0.795252622
472
+ 471,0.10972358,0.893777658
473
+ 472,0.875903061,0.363554268
474
+ 473,0.13452793,0.04793441
475
+ 474,0.812914491,0.469274644
476
+ 475,0.522160887,0.811754325
477
+ 476,0.894371837,0.9
478
+ 477,0.159037252,0.798691607
479
+ 478,0.543083428,0.586919061
480
+ 479,0.875442028,0.9
481
+ 480,0.518478275,0.205080102
482
+ 481,0.603518911,0.873356815
483
+ 482,0.656598951,0.322534784
484
+ 483,0.463632852,0.800643755
485
+ 484,0.602046464,0.794521938
486
+ 485,0.56745145,0.457772656
487
+ 486,0.820926408,0.265928321
488
+ 487,0.136357104,0.410544575
489
+ 488,0.324770552,0.214104789
490
+ 489,0.860329187,0.237168198
491
+ 490,0.812211027,0.356634289
492
+ 491,0.464525402,0.159013205
493
+ 492,0.596106078,0.436690151
494
+ 493,0.321904946,0.076210719
495
+ 494,0.250496928,0.438814406
496
+ 495,0.470958724,0.582810641
497
+ 496,0.382681782,0.632245159
498
+ 497,0.566924889,0.513618598
499
+ 498,0.16218771,0.509592906
500
+ 499,0.879515846,0.61010319
501
+ 500,0.888968596,0.573884366
502
+ 501,0.658529371,0.350736306
503
+ 502,0.528877093,0.407413995
504
+ 503,0.347622093,0
505
+ 504,0.751036016,0.168183797
506
+ 505,0.647784938,0.285101277
507
+ 506,0.230093551,0.63765552
508
+ 507,0.828741748,0.629778228
509
+ 508,0.758029794,0.575279515
510
+ 509,0.859839931,0.799048565
511
+ 510,0.680575607,0.677563662
512
+ 511,0.590732157,0.848004803
513
+ 512,0.434594429,0.648693023
514
+ 513,0.846182787,0.9
515
+ 514,0.792851112,0
516
+ 515,0.136174936,0
517
+ 516,0.12109358,0.072480509
518
+ 517,0.401170694,0.9
519
+ 518,0.748442665,0.9
520
+ 519,0.889820903,0.536135208
521
+ 520,0.220333513,0.9
522
+ 521,0.575304572,0.17037831
523
+ 522,0.404712685,0.896877748
524
+ 523,0.875931518,0.226885176
525
+ 524,0.773695139,0.102118449
526
+ 525,0.770662964,0.642640195
527
+ 526,0.474954528,0.606392363
528
+ 527,0.431855602,0.293036753
529
+ 528,0.318725658,0.233284656
530
+ 529,0.145100397,0.742552708
531
+ 530,0.791777901,0.681630709
532
+ 531,0.750320807,0
533
+ 532,0.899774139,0.014221788
534
+ 533,0.89730947,0.535286327
535
+ 534,0.544345364,0.012921094
536
+ 535,0.715189932,0.303804232
537
+ 536,0.855812584,0.160563795
538
+ 537,0.779717913,0.131607377
539
+ 538,0.297878481,0.9
540
+ 539,0.460435308,0.326836869
541
+ 540,0.203327532,0.595249297
542
+ 541,0.863240822,0.822788795
543
+ 542,0.584939708,0
544
+ 543,0.282914244,0.813627723
545
+ 544,0.637360548,0.286309155
546
+ 545,0.594502592,0.9
547
+ 546,0.386530174,0.218872209
548
+ 547,0.190846074,0.356354348
549
+ 548,0.637258556,0.744653648
550
+ 549,0.516246161,0.228832408
551
+ 550,0.717854713,0.381008212
552
+ 551,0.516130801,0.643706903
553
+ 552,0.7817452,0.862648152
554
+ 553,0.541525471,0.457998114
555
+ 554,0.548750377,0.9
556
+ 555,0.801322882,0.057308634
557
+ 556,0.422786293,0.429233853
558
+ 557,0.207212183,0.506630172
559
+ 558,0.123026141,0.579619634
560
+ 559,0.704109805,0.635860542
561
+ 560,0.596247641,0.779320272
562
+ 561,0.663263814,0.392966897
563
+ 562,0.270371329,0.038949583
564
+ 563,0.20909718,0.9
565
+ 564,0.111635733,0.191541437
566
+ 565,0.380470047,0.700941476
567
+ 566,0.571934149,0.190403259
568
+ 567,0.413795236,0
569
+ 568,0.449979938,0.12867131
570
+ 569,0.823326956,0.9
571
+ 570,0.378604374,0.657565215
572
+ 571,0.511191591,0.564471676
573
+ 572,0.72692241,0.168688659
574
+ 573,0.417234226,0.695115469
575
+ 574,0.59766936,0.9
576
+ 575,0.789890967,0
577
+ 576,0.859616499,0.455152068
578
+ 577,0.217658785,0.297756198
579
+ 578,0.8412701,0.793123632
580
+ 579,0.493693034,0.695294164
581
+ 580,0.306595511,0.542262095
582
+ 581,0.467308605,0.453772986
583
+ 582,0.88402606,0.56067833
584
+ 583,0.494094475,0.48707089
585
+ 584,0.363001288,0.354013044
586
+ 585,0.606720683,0.9
587
+ 586,0.292116495,0.59640684
588
+ 587,0.160690662,0.346338874
589
+ 588,0.203103778,0.056573698
590
+ 589,0.202436671,0.483749902
591
+ 590,0.221522155,0.686800138
592
+ 591,0.211061738,0.697284337
593
+ 592,0.612699796,0.9
594
+ 593,0.245504068,0.146914868
595
+ 594,0.376533827,0.555753579
596
+ 595,0.817430728,0.279245059
597
+ 596,0.479169312,0.355585277
598
+ 597,0.634046191,0.293514843
599
+ 598,0.237855897,0
600
+ 599,0.253831215,0.124562999
601
+ 600,0.132694893,0.9
602
+ 601,0.23514805,0.258715482
603
+ 602,0.322872271,0.416372476
604
+ 603,0.241608387,0
605
+ 604,0.170962027,0.229906693
606
+ 605,0.196508697,0.061739979
607
+ 606,0.468623014,0.435819059
608
+ 607,0.265066975,0.474501
609
+ 608,0.391415889,0.879707971
610
+ 609,0.502733817,0.009105176
611
+ 610,0.652315863,0.593635726
612
+ 611,0.131449712,0.9
613
+ 612,0.739528319,0.9
614
+ 613,0.602320312,0.9
615
+ 614,0.165407226,0.105693455
616
+ 615,0.798862899,0.163687153
617
+ 616,0.83669792,0.321195099
618
+ 617,0.148862368,0.836806524
619
+ 618,0.321502119,0.746060945
620
+ 619,0.744961024,0.793060363
621
+ 620,0.698607752,0.665532652
622
+ 621,0.247616815,0.392202609
623
+ 622,0.267479459,0.186053372
624
+ 623,0.396377682,0.341051727
625
+ 624,0.487618388,0.9
626
+ 625,0.594603817,0
627
+ 626,0.395130912,0.698189057
628
+ 627,0.470027773,0.766648506
629
+ 628,0.697976751,0.530362109
630
+ 629,0.129346562,0.129831401
631
+ 630,0.301949555,0.370935393
632
+ 631,0.670679669,0.659832743
633
+ 632,0.81616547,0.721269338
634
+ 633,0.509341954,0.078963902
635
+ 634,0.525690788,0.9
636
+ 635,0.185737609,0.485752967
637
+ 636,0.457929893,0.221050583
638
+ 637,0.526093813,0.312141628
639
+ 638,0.293976403,0.369071128
640
+ 639,0.315394585,0.494455714
641
+ 640,0.40182733,0.9
642
+ 641,0.116056958,0.9
643
+ 642,0.357663332,0.432833134
644
+ 643,0.269158406,0.564192924
645
+ 644,0.361997882,0.433373006
646
+ 645,0.195809705,0.277771347
647
+ 646,0.812421825,0.709003281
648
+ 647,0.574873963,0.04179906
649
+ 648,0.643281855,0.882822175
650
+ 649,0.731336991,0.9
651
+ 650,0.498753759,0.61926981
652
+ 651,0.16953623,0.30886779
653
+ 652,0.529685233,0.019184445
654
+ 653,0.569472894,0.071380962
655
+ 654,0.696351579,0.506210695
656
+ 655,0.445327637,0.541143205
657
+ 656,0.202064242,0.9
658
+ 657,0.327020725,0.464777285
659
+ 658,0.390465837,0.3442423
660
+ 659,0.616733793,0.10498328
661
+ 660,0.556622644,0.608890864
662
+ 661,0.384877381,0.801058732
663
+ 662,0.889212199,0.399520959
664
+ 663,0.584619855,0.718003042
665
+ 664,0.289781433,0.564040344
666
+ 665,0.181425978,0.784546478
667
+ 666,0.222287311,0.764606813
668
+ 667,0.296766183,0.791738859
669
+ 668,0.228545099,0.782719747
670
+ 669,0.249253619,0.10350808
671
+ 670,0.328076135,0.592074315
672
+ 671,0.238698876,0.590546628
673
+ 672,0.81741234,0.757073413
674
+ 673,0.164186997,0.632102093
675
+ 674,0.519609112,0.9
676
+ 675,0.428317462,0.9
677
+ 676,0.885902894,0.19363742
678
+ 677,0.189631122,0
679
+ 678,0.418284479,0.674262565
680
+ 679,0.875576347,0.067662156
681
+ 680,0.792405701,0.853617271
682
+ 681,0.753657657,0
683
+ 682,0.306322262,0.9
684
+ 683,0.23671007,0.30998468
685
+ 684,0.634914576,0.9
686
+ 685,0.843500791,0.209588005
687
+ 686,0.545410314,0.551126731
688
+ 687,0.557290152,0.736446674
689
+ 688,0.323983275,0.661229149
690
+ 689,0.715594347,0.611475963
691
+ 690,0.249634999,0.857951086
692
+ 691,0.358943389,0.733981048
693
+ 692,0.440349151,0.110992458
694
+ 693,0.506088303,0.823233566
695
+ 694,0.293927786,0.243188178
696
+ 695,0.19186946,0.169331526
697
+ 696,0.588496034,0
698
+ 697,0.330904443,0.073369428
699
+ 698,0.564990577,0.438545559
700
+ 699,0.223490172,0.838604809
701
+ 700,0.484912081,0.9
702
+ 701,0.526071546,0.509863806
703
+ 702,0.141458829,0.442976066
704
+ 703,0.369283423,0.036354545
705
+ 704,0.207531742,0.595821461
706
+ 705,0.150699976,0.673331198
707
+ 706,0.891968186,0.079341299
708
+ 707,0.357883076,0
709
+ 708,0.747899557,0.322567583
710
+ 709,0.303712524,0.704855002
711
+ 710,0.645202178,0.721234563
712
+ 711,0.708182288,0.53056543
713
+ 712,0.576510992,0
714
+ 713,0.477260951,0.894663295
715
+ 714,0.429472731,0.765967217
716
+ 715,0.379094613,0
717
+ 716,0.843623315,0.9
718
+ 717,0.764495526,0.020179491
719
+ 718,0.872021529,0.635647515
720
+ 719,0.199437779,0.9
721
+ 720,0.68469398,0.169536942
722
+ 721,0.850672365,0.044872475
723
+ 722,0.244986453,0.205646056
724
+ 723,0.153197014,0.070808633
725
+ 724,0.692896519,0
726
+ 725,0.559578491,0.823572394
727
+ 726,0.773463021,0
728
+ 727,0.211817901,0.674115828
729
+ 728,0.736213849,0.9
730
+ 729,0.261301856,0.319724533
731
+ 730,0.230924754,0.422784388
732
+ 731,0.231412638,0.643530247
733
+ 732,0.751659776,0.353825286
734
+ 733,0.632157777,0.405532106
735
+ 734,0.51845234,0.55638193
736
+ 735,0.387064387,0.400415929
737
+ 736,0.801760433,0.746398651
738
+ 737,0.413956086,0.31045017
739
+ 738,0.753279552,0.611290475
740
+ 739,0.451307927,0.828932397
741
+ 740,0.401555544,0.676018315
742
+ 741,0.470143829,0.783359852
743
+ 742,0.341102299,0.484825074
744
+ 743,0.698087504,0.507832813
745
+ 744,0.502176312,0.239453538
746
+ 745,0.285770156,0.537522754
747
+ 746,0.819659659,0.83547497
748
+ 747,0.407112977,0.277966345
749
+ 748,0.534842289,0
750
+ 749,0.825177689,0.9
751
+ 750,0.599390397,0
752
+ 751,0.193518433,0.432255287
753
+ 752,0.851865699,0.334711549
754
+ 753,0.602166442,0.608613492
755
+ 754,0.367924492,0.9
756
+ 755,0.211417658,0.9
757
+ 756,0.735220151,0.695430535
758
+ 757,0.596058205,0.9
759
+ 758,0.526768874,0.712197092
760
+ 759,0.815114066,0.107622053
761
+ 760,0.730877769,0.9
762
+ 761,0.221339904,0.521019557
763
+ 762,0.349377654,0.899921438
764
+ 763,0.298791312,0.344947128
765
+ 764,0.695157034,0.595989562
766
+ 765,0.126825948,0.429774057
767
+ 766,0.555911748,0.205427445
768
+ 767,0.709966949,0.550310223
769
+ 768,0.801412509,0.205775945
770
+ 769,0.373665399,0.510585936
771
+ 770,0.757005844,0.610315149
772
+ 771,0.18850539,0.582000631
773
+ 772,0.777161833,0.9
774
+ 773,0.20199093,0.812268746
775
+ 774,0.417829832,0.9
776
+ 775,0.737836293,0.45659749
777
+ 776,0.219933942,0.255550591
778
+ 777,0.283401116,0.824392204
779
+ 778,0.677802055,0.662358027
780
+ 779,0.676029229,0.230244761
781
+ 780,0.612918106,0.754797451
782
+ 781,0.655158756,0
783
+ 782,0.534179555,0.732152294
784
+ 783,0.301439247,0.691777763
785
+ 784,0.376556795,0.753562435
786
+ 785,0.245278173,0.752649568
787
+ 786,0.826760449,0.828537614
788
+ 787,0.566713436,0.611101535
789
+ 788,0.420681133,0.426066583
790
+ 789,0.469604643,0.328028737
791
+ 790,0.857826672,0.619969654
792
+ 791,0.222681122,0.343139913
793
+ 792,0.568983866,0.558438304
794
+ 793,0.504710943,0
795
+ 794,0.589163388,0.9
796
+ 795,0.114488147,0.013628956
797
+ 796,0.797699127,0
798
+ 797,0.845694626,0.846428438
799
+ 798,0.552106547,0.059664309
800
+ 799,0.657320659,0.421989478
801
+ 800,0.837999505,0.263938268
802
+ 801,0.665790907,0.9
803
+ 802,0.222031234,0.34851776
804
+ 803,0.561030688,0.685587123
805
+ 804,0.585372037,0.402541098
806
+ 805,0.439304537,0.287443299
807
+ 806,0.689155388,0.755569942
808
+ 807,0.847493612,0.185037681
809
+ 808,0.84045481,0.350319657
810
+ 809,0.460671497,0
811
+ 810,0.190590437,0
812
+ 811,0.887872959,0.247652379
813
+ 812,0.771118469,0.9
814
+ 813,0.199730145,0.154721294
815
+ 814,0.836673506,0.500187896
816
+ 815,0.79591709,0.031786968
817
+ 816,0.515070446,0.447448538
818
+ 817,0.573020349,0.057224712
819
+ 818,0.419202163,0.9
820
+ 819,0.143809311,0.560756311
821
+ 820,0.368157793,0.268479888
822
+ 821,0.742282759,0.304554366
823
+ 822,0.103705618,0.322554819
824
+ 823,0.366799337,0.871360078
825
+ 824,0.418534955,0.9
826
+ 825,0.529916482,0.525181241
827
+ 826,0.835884493,0.192729785
828
+ 827,0.377076795,0.030194688
829
+ 828,0.377562562,0.9
830
+ 829,0.690000998,0.498031622
831
+ 830,0.461774353,0.094969901
832
+ 831,0.279683858,0.9
833
+ 832,0.461951613,0.569342184
834
+ 833,0.212685616,0.574137375
835
+ 834,0.241109589,0.50883471
836
+ 835,0.498694218,0.691815652
837
+ 836,0.43514036,0.3941246
838
+ 837,0.831876721,0.4250262
839
+ 838,0.389915119,0.629426338
840
+ 839,0.56447068,0.380919947
841
+ 840,0.60581143,0.047314774
842
+ 841,0.110475565,0.023601305
843
+ 842,0.630829898,0.283155523
844
+ 843,0.242428773,0.430664499
845
+ 844,0.868856254,0.227940361
846
+ 845,0.218930182,0.623995717
847
+ 846,0.431699299,0.041564826
848
+ 847,0.168279734,0.249017933
849
+ 848,0.897499401,0.275312476
850
+ 849,0.501756008,0.629105532
851
+ 850,0.576308014,0.660853868
852
+ 851,0.153661182,0.19205541
853
+ 852,0.699968376,0.684843774
854
+ 853,0.267924474,0.9
855
+ 854,0.818443432,0.9
856
+ 855,0.264111712,0.510245918
857
+ 856,0.252550177,0.509225921
858
+ 857,0.129239734,0.9
859
+ 858,0.477653556,0.181365776
860
+ 859,0.551872907,0.9
861
+ 860,0.152566912,0.9
862
+ 861,0.720422093,0.440521756
863
+ 862,0.462631068,0.395553765
864
+ 863,0.519512215,0.496358382
865
+ 864,0.452610198,0.603895363
866
+ 865,0.420610449,0.9
867
+ 866,0.547712265,0.9
868
+ 867,0.224192197,0.232212969
869
+ 868,0.245542504,0
870
+ 869,0.789428497,0.467212445
871
+ 870,0.85689237,0.9
872
+ 871,0.398647453,0.696880578
873
+ 872,0.316595739,0.259939856
874
+ 873,0.615199635,0.121905279
875
+ 874,0.426987337,0.9
876
+ 875,0.120309085,0.829255596
877
+ 876,0.224922078,0.51824201
878
+ 877,0.672777783,0.853366492
879
+ 878,0.627139154,0.42316913
880
+ 879,0.121676794,0.479190243
881
+ 880,0.27757773,0.29710151
882
+ 881,0.284859837,0.645220204
883
+ 882,0.637514195,0.755069768
884
+ 883,0.11576843,0.665360064
885
+ 884,0.183286866,0.616515497
886
+ 885,0.739932868,0.195189159
887
+ 886,0.24283573,0.675757772
888
+ 887,0.622196886,0
889
+ 888,0.290546225,0
890
+ 889,0.179553114,0.9
891
+ 890,0.294537753,0.9
892
+ 891,0.677813545,0
893
+ 892,0.784557174,0.593622404
894
+ 893,0.764175892,0.614313082
895
+ 894,0.417746824,0.329100312
896
+ 895,0.634468109,0.617623992
897
+ 896,0.263987436,0.627855087
898
+ 897,0.334518184,0.396846944
899
+ 898,0.817068655,0.077784525
900
+ 899,0.110401539,0.155259676
901
+ 900,0.168406825,0.519077876
902
+ 901,0.266309004,0.526586639
903
+ 902,0.121225763,0
904
+ 903,0.245148348,0.879305624
905
+ 904,0.566433249,0.500060623
906
+ 905,0.43713964,0.551573716
907
+ 906,0.814137369,0.321835573
908
+ 907,0.753954849,0.9
909
+ 908,0.373453881,0.512353169
910
+ 909,0.307538747,0.38053411
911
+ 910,0.403753927,0.404781045
912
+ 911,0.572235954,0.465045611
913
+ 912,0.314450913,0.491905004
914
+ 913,0.599319126,0.9
915
+ 914,0.427529322,0.616470334
916
+ 915,0.541637745,0.268066979
917
+ 916,0.448901223,0.687141209
918
+ 917,0.335572608,0.9
919
+ 918,0.858762646,0.522107012
920
+ 919,0.710884635,0.68146507
921
+ 920,0.212090541,0.9
922
+ 921,0.794774381,0.459998009
923
+ 922,0.489944959,0
924
+ 923,0.815641782,0.671626119
925
+ 924,0.739884205,0.564785035
926
+ 925,0.440170804,0.677641272
927
+ 926,0.117975447,0.537707678
928
+ 927,0.314941888,0.235910364
929
+ 928,0.533307372,0.658007968
930
+ 929,0.606782576,0.462395216
931
+ 930,0.306310148,0.581727352
932
+ 931,0.211484859,0.9
933
+ 932,0.767944189,0.357523523
934
+ 933,0.887521745,0.411138792
935
+ 934,0.520552146,0.797687105
936
+ 935,0.237343429,0.544391687
937
+ 936,0.317845861,0.732638395
938
+ 937,0.114712541,0.322203681
939
+ 938,0.831439045,0.280121239
940
+ 939,0.194200866,0.495145109
941
+ 940,0.56121318,0
942
+ 941,0.319244177,0.023560038
943
+ 942,0.543342402,0.728298656
944
+ 943,0.621136311,0.413790858
945
+ 944,0.763793443,0.869446044
946
+ 945,0.265137017,0.661151239
947
+ 946,0.108796663,0.443875203
948
+ 947,0.209508504,0.649752172
949
+ 948,0.820014913,0.302974845
950
+ 949,0.799112062,0.505207452
951
+ 950,0.577930482,0.689261658
952
+ 951,0.580413488,0.088053248
953
+ 952,0.63202934,0.123430379
954
+ 953,0.240297023,0.307292604
955
+ 954,0.831529557,0.482177859
956
+ 955,0.43501642,0.9
957
+ 956,0.406510823,0.9
958
+ 957,0.515134164,0.276283568
959
+ 958,0.137572773,0.106383953
960
+ 959,0.233026695,0.729408407
961
+ 960,0.690426893,0.865337494
962
+ 961,0.166238934,0.331889912
963
+ 962,0.582521688,0.364184963
964
+ 963,0.296279288,0.740478264
965
+ 964,0.411436491,0.489036243
966
+ 965,0.330954989,0.578971069
967
+ 966,0.384538173,0.015390396
968
+ 967,0.675236724,0.190131095
969
+ 968,0.337697372,0.176936745
970
+ 969,0.553123712,0.411411886
971
+ 970,0.480840322,0.867272117
972
+ 971,0.630936932,0.211223827
973
+ 972,0.849463791,0.686975213
974
+ 973,0.686057678,0.548907023
975
+ 974,0.271952303,0.635134985
976
+ 975,0.124946508,0.444004081
977
+ 976,0.309811235,0.9
978
+ 977,0.576062345,0.821573298
979
+ 978,0.141140651,0.161003341
980
+ 979,0.497092998,0.9
981
+ 980,0.577474279,0.541951571
982
+ 981,0.367395113,0.387759296
983
+ 982,0.716729763,0.51244302
984
+ 983,0.185278603,0.362207806
985
+ 984,0.160110225,0.412602619
986
+ 985,0.682551005,0.450738158
987
+ 986,0.496393053,0.394094822
988
+ 987,0.650721917,0.370922101
989
+ 988,0.447861871,0.51090245
990
+ 989,0.297121627,0.272085598
991
+ 990,0.755281854,0.368980355
992
+ 991,0.739532703,0.658156057
993
+ 992,0.655757177,0.150005837
994
+ 993,0.31771611,0.9
995
+ 994,0.572184533,0.316523222
996
+ 995,0.388779118,0.356695694
997
+ 996,0.173265659,0.484370624
998
+ 997,0.83385086,0.9
999
+ 998,0.209454905,0.677277106
1000
+ 999,0.860189883,0
1001
+ 1000,0.456804618,0
A2 #Q7 Chrf Scores CSV.csv ADDED
@@ -0,0 +1,1001 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Sample,CHRF LTSM Score,CHRFSeq2seq Score
2
+ 1,0.318066158,0.818785258
3
+ 2,0.542299349,1.043018449
4
+ 3,0,0.5007191
5
+ 4,0.514403292,1.015122392
6
+ 5,0.750750751,1.251469851
7
+ 6,1.108281456,1.609000556
8
+ 7,0,0.5007191
9
+ 8,0.77650713,1.27722623
10
+ 9,0.258799172,0.759518272
11
+ 10,0.990990991,1.491710091
12
+ 11,0.412541254,0.913260354
13
+ 12,0.879507476,1.380226576
14
+ 13,0.338753388,0.839472488
15
+ 14,0.499001996,0.999721096
16
+ 15,0.727449079,1.228168179
17
+ 16,0,0.5007191
18
+ 17,1.556016598,2.056735698
19
+ 18,0.828363154,1.329082254
20
+ 19,0.375375375,0.876094475
21
+ 20,0.417262756,0.917981856
22
+ 21,1.068376068,1.569095168
23
+ 22,0.825082508,1.325801608
24
+ 23,0.255623722,0.756342822
25
+ 24,1.086956522,1.587675622
26
+ 25,1.47325476,1.97397386
27
+ 26,0.333333333,0.834052433
28
+ 27,0.656167979,1.156887079
29
+ 28,0.661375661,1.162094761
30
+ 29,1.001780944,1.502500044
31
+ 30,0.322997416,0.823716516
32
+ 31,0.712250712,1.212969812
33
+ 32,0.262054507,0.762773607
34
+ 33,0.265392781,0.766111881
35
+ 34,0,0.5007191
36
+ 35,0.465549348,0.966268448
37
+ 36,0.542727452,1.043446552
38
+ 37,0.656167979,1.156887079
39
+ 38,1.1684427,1.6691618
40
+ 39,0.850340136,1.351059236
41
+ 40,0.39184953,0.89256863
42
+ 41,0.19379845,0.69451755
43
+ 42,0.621890547,1.122609647
44
+ 43,0.813599224,1.314318324
45
+ 44,1.163873371,1.664592471
46
+ 45,0.27593819,0.77665729
47
+ 46,0.368731563,0.869450663
48
+ 47,0.607385811,1.108104911
49
+ 48,0.647668394,1.148387494
50
+ 49,0.564130337,1.064849437
51
+ 50,0.591016548,1.091735648
52
+ 51,0.503524673,1.004243773
53
+ 52,0.344352617,0.845071717
54
+ 53,0.983168161,1.483887261
55
+ 54,0.356125356,0.856844456
56
+ 55,0.666666667,1.167385767
57
+ 56,1.201460977,1.702180077
58
+ 57,0.322997416,0.823716516
59
+ 58,1.59642401,2.09714311
60
+ 59,1.086956522,1.587675622
61
+ 60,0.886524823,1.387243923
62
+ 61,0.645994832,1.146713932
63
+ 62,0.694676003,1.195395103
64
+ 63,0.816993464,1.317712564
65
+ 64,1.185266229,1.685985329
66
+ 65,0.468164794,0.968883894
67
+ 66,0.698324022,1.199043122
68
+ 67,0.768757688,1.269476788
69
+ 68,0.287356322,0.788075422
70
+ 69,0.897601609,1.398320709
71
+ 70,0.499001996,0.999721096
72
+ 71,1.033057851,1.533776951
73
+ 72,0.862068966,1.362788066
74
+ 73,1.351351351,1.852070451
75
+ 74,0.117370892,0.618089992
76
+ 75,0.268817204,0.769536304
77
+ 76,0.631121882,1.131840982
78
+ 77,0.255623722,0.756342822
79
+ 78,0.668377714,1.169096814
80
+ 79,0.570776256,1.071495356
81
+ 80,0,0.5007191
82
+ 81,0.338753388,0.839472488
83
+ 82,0.295508274,0.796227374
84
+ 83,0.727348296,1.228067396
85
+ 84,0.164690382,0.665409482
86
+ 85,0,0.5007191
87
+ 86,0.968992248,1.469711348
88
+ 87,0,0.5007191
89
+ 88,0.881834215,1.382553315
90
+ 89,1.375137514,1.875856614
91
+ 90,0.813449024,1.314168124
92
+ 91,0.559284116,1.060003216
93
+ 92,1.094276094,1.594995194
94
+ 93,0.677506775,1.178225875
95
+ 94,1.122874559,1.623593659
96
+ 95,0,0.5007191
97
+ 96,0.258799172,0.759518272
98
+ 97,0,0.5007191
99
+ 98,0.730994152,1.231713252
100
+ 99,0.605796259,1.106515359
101
+ 100,0.796178344,1.296897444
102
+ 101,1.226692836,1.727411936
103
+ 102,0.322997416,0.823716516
104
+ 103,0.537634409,1.038353509
105
+ 104,0.373692078,0.874411178
106
+ 105,0.838926174,1.339645274
107
+ 106,0.732747136,1.233466236
108
+ 107,0.559284116,1.060003216
109
+ 108,0.265392781,0.766111881
110
+ 109,0.759301443,1.260020543
111
+ 110,0.295508274,0.796227374
112
+ 111,0.717154332,1.217873432
113
+ 112,0.338753388,0.839472488
114
+ 113,1.109262341,1.609981441
115
+ 114,1.003379806,1.504098906
116
+ 115,0.559284116,1.060003216
117
+ 116,1.034612491,1.535331591
118
+ 117,1.126126126,1.626845226
119
+ 118,0.235404896,0.736123996
120
+ 119,0.900900901,1.401620001
121
+ 120,0.592417062,1.093136162
122
+ 121,0,0.5007191
123
+ 122,0.887705282,1.388424382
124
+ 123,0.626566416,1.127285516
125
+ 124,0,0.5007191
126
+ 125,0.809061489,1.309780589
127
+ 126,0.279642058,0.780361158
128
+ 127,0,0.5007191
129
+ 128,0,0.5007191
130
+ 129,0,0.5007191
131
+ 130,0.768049155,1.268768255
132
+ 131,0.998003992,1.498723092
133
+ 132,1.159554731,1.660273831
134
+ 133,0.299760192,0.800479292
135
+ 134,0.888749477,1.389468577
136
+ 135,0.574712644,1.075431744
137
+ 136,0.599520384,1.100239484
138
+ 137,0.420875421,0.921594521
139
+ 138,0,0.5007191
140
+ 139,1.033591731,1.534310831
141
+ 140,0,0.5007191
142
+ 141,0.382262997,0.882982097
143
+ 142,0.313283208,0.814002308
144
+ 143,1.073619632,1.574338732
145
+ 144,0,0.5007191
146
+ 145,0.262054507,0.762773607
147
+ 146,0,0.5007191
148
+ 147,0,0.5007191
149
+ 148,0,0.5007191
150
+ 149,0.262054507,0.762773607
151
+ 150,0.32808399,0.82880309
152
+ 151,0.32808399,0.82880309
153
+ 152,0.268817204,0.769536304
154
+ 153,0,0.5007191
155
+ 154,0,0.5007191
156
+ 155,0.782472613,1.283191713
157
+ 156,0.9499924,1.4507115
158
+ 157,0.457875458,0.958594558
159
+ 158,0.683060109,1.183779209
160
+ 159,0.669344043,1.170063143
161
+ 160,0,0.5007191
162
+ 161,0,0.5007191
163
+ 162,0.642673522,1.143392622
164
+ 163,0.754527163,1.255246263
165
+ 164,0.287356322,0.788075422
166
+ 165,0.641025641,1.141744741
167
+ 166,0.356125356,0.856844456
168
+ 167,0,0.5007191
169
+ 168,0.721126111,1.221845211
170
+ 169,0.683060109,1.183779209
171
+ 170,0.524109015,1.024828115
172
+ 171,0.382262997,0.882982097
173
+ 172,0.420875421,0.921594521
174
+ 173,0.246548323,0.747267423
175
+ 174,0.628140704,1.128859804
176
+ 175,0.457875458,0.958594558
177
+ 176,0.656167979,1.156887079
178
+ 177,0.916525663,1.417244763
179
+ 178,0,0.5007191
180
+ 179,0.265392781,0.766111881
181
+ 180,0.59311981,1.09383891
182
+ 181,0,0.5007191
183
+ 182,0.797448166,1.298167266
184
+ 183,0,0.5007191
185
+ 184,0,0.5007191
186
+ 185,0.544662309,1.045381409
187
+ 186,1.151012891,1.651731991
188
+ 187,0.617283951,1.118003051
189
+ 188,0.73964497,1.24036407
190
+ 189,0,0.5007191
191
+ 190,0,0.5007191
192
+ 191,0.698324022,1.199043122
193
+ 192,0.64439633,1.14511543
194
+ 193,0.465549348,0.966268448
195
+ 194,0.445632799,0.946351899
196
+ 195,0.647668394,1.148387494
197
+ 196,0.825082508,1.325801608
198
+ 197,0.846501129,1.347220229
199
+ 198,0.203252033,0.703971133
200
+ 199,0.809061489,1.309780589
201
+ 200,0.367107195,0.867826295
202
+ 201,0,0.5007191
203
+ 202,0.304136253,0.804855353
204
+ 203,0.714285714,1.215004814
205
+ 204,0.781152356,1.281871456
206
+ 205,0,0.5007191
207
+ 206,0.505050505,1.005769605
208
+ 207,0.825082508,1.325801608
209
+ 208,0.295508274,0.796227374
210
+ 209,0.902266493,1.402985593
211
+ 210,0.445632799,0.946351899
212
+ 211,0.892325996,1.393045096
213
+ 212,0.55187638,1.05259548
214
+ 213,0.76298943,1.26370853
215
+ 214,0.776397516,1.277116616
216
+ 215,1.03493956,1.53565866
217
+ 216,0.412541254,0.913260354
218
+ 217,0.255623722,0.756342822
219
+ 218,0.968992248,1.469711348
220
+ 219,0.724637681,1.225356781
221
+ 220,0.394944708,0.895663808
222
+ 221,0.356125356,0.856844456
223
+ 222,0,0.5007191
224
+ 223,0.654450262,1.155169362
225
+ 224,0.841071188,1.341790288
226
+ 225,0.683060109,1.183779209
227
+ 226,0.816993464,1.317712564
228
+ 227,0.766871166,1.267590266
229
+ 228,0.517598344,1.018317444
230
+ 229,0.798212005,1.298931105
231
+ 230,0,0.5007191
232
+ 231,0.313283208,0.814002308
233
+ 232,0.839715169,1.340434269
234
+ 233,0.517598344,1.018317444
235
+ 234,0.825082508,1.325801608
236
+ 235,0.559284116,1.060003216
237
+ 236,0.429553265,0.930272365
238
+ 237,0.438596491,0.939315591
239
+ 238,0.382262997,0.882982097
240
+ 239,0.947551731,1.448270831
241
+ 240,0.232774674,0.733493774
242
+ 241,1.130828114,1.631547214
243
+ 242,0.356125356,0.856844456
244
+ 243,0.344352617,0.845071717
245
+ 244,0.748502994,1.249222094
246
+ 245,0.753012048,1.253731148
247
+ 246,0.816993464,1.317712564
248
+ 247,0.796178344,1.296897444
249
+ 248,0.843113449,1.343832549
250
+ 249,0,0.5007191
251
+ 250,1.376376376,1.877095476
252
+ 251,0.736160188,1.236879288
253
+ 252,0.690607735,1.191326835
254
+ 253,1.131221719,1.631940819
255
+ 254,0.318066158,0.818785258
256
+ 255,0.356125356,0.856844456
257
+ 256,0.543951262,1.044670362
258
+ 257,0.318066158,0.818785258
259
+ 258,0.576302444,1.077021544
260
+ 259,1.035196687,1.535915787
261
+ 260,0.843113449,1.343832549
262
+ 261,0.636132316,1.136851416
263
+ 262,0.394321767,0.895040867
264
+ 263,0.713121434,1.213840534
265
+ 264,0.796178344,1.296897444
266
+ 265,0.989119683,1.489838783
267
+ 266,0.910746812,1.411465912
268
+ 267,0.909090909,1.409810009
269
+ 268,1.103752759,1.604471859
270
+ 269,0.928505107,1.429224207
271
+ 270,0.58685446,1.08757356
272
+ 271,0.27593819,0.77665729
273
+ 272,0,0.5007191
274
+ 273,0.410509031,0.911228131
275
+ 274,0.440917108,0.941636208
276
+ 275,0.683060109,1.183779209
277
+ 276,0.356125356,0.856844456
278
+ 277,0,0.5007191
279
+ 278,0.493096647,0.993815747
280
+ 279,0.776397516,1.277116616
281
+ 280,1.243781095,1.744500195
282
+ 281,0,0.5007191
283
+ 282,0,0.5007191
284
+ 283,0.850340136,1.351059236
285
+ 284,0.368731563,0.869450663
286
+ 285,0.382262997,0.882982097
287
+ 286,0.249500998,0.750220098
288
+ 287,0.933706816,1.434425916
289
+ 288,0.713121434,1.213840534
290
+ 289,0.279642058,0.780361158
291
+ 290,0.318066158,0.818785258
292
+ 291,0,0.5007191
293
+ 292,0.252525253,0.753244353
294
+ 293,1.204238921,1.704958021
295
+ 294,0.457875458,0.958594558
296
+ 295,0.322997416,0.823716516
297
+ 296,1.638930913,2.139650013
298
+ 297,0.262054507,0.762773607
299
+ 298,0.299760192,0.800479292
300
+ 299,1.134889754,1.635608854
301
+ 300,0.712250712,1.212969812
302
+ 301,0.505050505,1.005769605
303
+ 302,0.891265597,1.391984697
304
+ 303,0,0.5007191
305
+ 304,0.299760192,0.800479292
306
+ 305,1.196888091,1.697607191
307
+ 306,1.208490963,1.709210063
308
+ 307,0.796178344,1.296897444
309
+ 308,0.544662309,1.045381409
310
+ 309,0,0.5007191
311
+ 310,0.272331155,0.773050255
312
+ 311,0.782472613,1.283191713
313
+ 312,0.656167979,1.156887079
314
+ 313,0.816993464,1.317712564
315
+ 314,0.684931507,1.185650607
316
+ 315,0.636132316,1.136851416
317
+ 316,1.214329083,1.715048183
318
+ 317,0.724637681,1.225356781
319
+ 318,0.608272506,1.108991606
320
+ 319,0.822860563,1.323579663
321
+ 320,0,0.5007191
322
+ 321,0.766871166,1.267590266
323
+ 322,0.265392781,0.766111881
324
+ 323,0.344352617,0.845071717
325
+ 324,0.886524823,1.387243923
326
+ 325,0.797993616,1.298712716
327
+ 326,0.954198473,1.454917573
328
+ 327,0.283446712,0.784165812
329
+ 328,1.006441224,1.507160324
330
+ 329,1.272264631,1.772983731
331
+ 330,1.523461304,2.024180404
332
+ 331,0,0.5007191
333
+ 332,0.591016548,1.091735648
334
+ 333,0,0.5007191
335
+ 334,0,0.5007191
336
+ 335,0.582750583,1.083469683
337
+ 336,0.455373406,0.956092506
338
+ 337,0.566893424,1.067612524
339
+ 338,0,0.5007191
340
+ 339,1.016260163,1.516979263
341
+ 340,1.693766938,2.194486038
342
+ 341,1.022494888,1.523213988
343
+ 342,0.322997416,0.823716516
344
+ 343,0.544662309,1.045381409
345
+ 344,0.68119891,1.18191801
346
+ 345,0,0.5007191
347
+ 346,0.73964497,1.24036407
348
+ 347,1.272912424,1.773631524
349
+ 348,0.249500998,0.750220098
350
+ 349,0,0.5007191
351
+ 350,0,0.5007191
352
+ 351,1.322751323,1.823470423
353
+ 352,0.796178344,1.296897444
354
+ 353,0.246548323,0.747267423
355
+ 354,0.769569041,1.270288141
356
+ 355,0.404530744,0.905249844
357
+ 356,1.006441224,1.507160324
358
+ 357,1.047414674,1.548133774
359
+ 358,0.387596899,0.888315999
360
+ 359,1.068376068,1.569095168
361
+ 360,1.068376068,1.569095168
362
+ 361,0.891265597,1.391984697
363
+ 362,0.780640125,1.281359225
364
+ 363,0,0.5007191
365
+ 364,0.511247444,1.011966544
366
+ 365,1.184834123,1.685553223
367
+ 366,0.757575758,1.258294858
368
+ 367,0.845033801,1.345752901
369
+ 368,0.698324022,1.199043122
370
+ 369,0.493096647,0.993815747
371
+ 370,0.476190476,0.976909576
372
+ 371,0.342935528,0.843654628
373
+ 372,0.240847784,0.741566884
374
+ 373,0.497647485,0.998366585
375
+ 374,0.748502994,1.249222094
376
+ 375,1.141552511,1.642271611
377
+ 376,0,0.5007191
378
+ 377,0.944170772,1.444889872
379
+ 378,0,0.5007191
380
+ 379,0,0.5007191
381
+ 380,0.920471281,1.421190381
382
+ 381,0.737463127,1.238182227
383
+ 382,1.124302932,1.625022032
384
+ 383,0.757575758,1.258294858
385
+ 384,0.85733882,1.35805792
386
+ 385,0,0.5007191
387
+ 386,0.414593698,0.915312798
388
+ 387,0.76496462,1.26568372
389
+ 388,0.978090767,1.478809867
390
+ 389,1.769464105,2.270183205
391
+ 390,0.984251969,1.484971069
392
+ 391,0.476190476,0.976909576
393
+ 392,0.283446712,0.784165812
394
+ 393,0,0.5007191
395
+ 394,0.423011844,0.923730944
396
+ 395,1.174536058,1.675255158
397
+ 396,0,0.5007191
398
+ 397,0.249500998,0.750220098
399
+ 398,0.84101214,1.34173124
400
+ 399,0.654450262,1.155169362
401
+ 400,0.681883434,1.182602534
402
+ 401,0,0.5007191
403
+ 402,0.329380764,0.830099864
404
+ 403,0.859106529,1.359825629
405
+ 404,0.252525253,0.753244353
406
+ 405,0.596089652,1.096808752
407
+ 406,1.361655773,1.862374873
408
+ 407,0.729203127,1.229922227
409
+ 408,0.318066158,0.818785258
410
+ 409,0.530785563,1.031504663
411
+ 410,0.574712644,1.075431744
412
+ 411,0.287356322,0.788075422
413
+ 412,0.68812493,1.18884403
414
+ 413,0,0.5007191
415
+ 414,0.838926174,1.339645274
416
+ 415,0.613286233,1.114005333
417
+ 416,0.636132316,1.136851416
418
+ 417,0.603864734,1.104583834
419
+ 418,0.951886466,1.452605566
420
+ 419,0.677506775,1.178225875
421
+ 420,0.318066158,0.818785258
422
+ 421,1.201550388,1.702269488
423
+ 422,1.177024482,1.677743582
424
+ 423,0.757575758,1.258294858
425
+ 424,0.650026001,1.150745101
426
+ 425,0,0.5007191
427
+ 426,0.272331155,0.773050255
428
+ 427,0.511247444,1.011966544
429
+ 428,0.362318841,0.863037941
430
+ 429,0.465549348,0.966268448
431
+ 430,1.020408163,1.521127263
432
+ 431,0.608272506,1.108991606
433
+ 432,0.188536953,0.689256053
434
+ 433,0.258799172,0.759518272
435
+ 434,1.062151008,1.562870108
436
+ 435,0.829187396,1.329906496
437
+ 436,0.788367204,1.289086304
438
+ 437,0.451263538,0.951982638
439
+ 438,0.537634409,1.038353509
440
+ 439,0.830564784,1.331283884
441
+ 440,0.836120401,1.336839501
442
+ 441,0.786163522,1.286882622
443
+ 442,0,0.5007191
444
+ 443,0,0.5007191
445
+ 444,0.262054507,0.762773607
446
+ 445,0.318066158,0.818785258
447
+ 446,0.318066158,0.818785258
448
+ 447,1.048218029,1.548937129
449
+ 448,0.828363154,1.329082254
450
+ 449,0.499001996,0.999721096
451
+ 450,0.279642058,0.780361158
452
+ 451,0.295508274,0.796227374
453
+ 452,0.599520384,1.100239484
454
+ 453,0.530785563,1.031504663
455
+ 454,0.660300691,1.161019791
456
+ 455,0.404530744,0.905249844
457
+ 456,0.656167979,1.156887079
458
+ 457,0.908490254,1.409209354
459
+ 458,0,0.5007191
460
+ 459,0.661375661,1.162094761
461
+ 460,0,0.5007191
462
+ 461,0,0.5007191
463
+ 462,0.481695568,0.982414668
464
+ 463,0.213675214,0.714394314
465
+ 464,0.205254516,0.705973616
466
+ 465,0.283446712,0.784165812
467
+ 466,1.022494888,1.523213988
468
+ 467,1.310272537,1.810991637
469
+ 468,0.511247444,1.011966544
470
+ 469,0.566893424,1.067612524
471
+ 470,0,0.5007191
472
+ 471,1.01010101,1.51082011
473
+ 472,0.722543353,1.223262453
474
+ 473,0,0.5007191
475
+ 474,0.963391137,1.464110237
476
+ 475,1.084128361,1.584847461
477
+ 476,0.457875458,0.958594558
478
+ 477,0.304136253,0.804855353
479
+ 478,0.436300175,0.937019275
480
+ 479,0.438596491,0.939315591
481
+ 480,0,0.5007191
482
+ 481,0,0.5007191
483
+ 482,0,0.5007191
484
+ 483,0.899280576,1.399999676
485
+ 484,1.126126126,1.626845226
486
+ 485,1.070663812,1.571382912
487
+ 486,0.283446712,0.784165812
488
+ 487,0.544662309,1.045381409
489
+ 488,0.27593819,0.77665729
490
+ 489,0.524109015,1.024828115
491
+ 490,0,0.5007191
492
+ 491,0,0.5007191
493
+ 492,1.361655773,1.862374873
494
+ 493,0.615763547,1.116482647
495
+ 494,0.714285714,1.215004814
496
+ 495,0.899280576,1.399999676
497
+ 496,0.636132316,1.136851416
498
+ 497,0.287356322,0.788075422
499
+ 498,0.338753388,0.839472488
500
+ 499,0.318066158,0.818785258
501
+ 500,0.910746812,1.411465912
502
+ 501,1.436781609,1.937500709
503
+ 502,0,0.5007191
504
+ 503,1.177024482,1.677743582
505
+ 504,0.752445448,1.253164548
506
+ 505,0.404530744,0.905249844
507
+ 506,0.872600349,1.373319449
508
+ 507,0.862068966,1.362788066
509
+ 508,1,1.5007191
510
+ 509,0.666666667,1.167385767
511
+ 510,1.783398184,2.284117284
512
+ 511,0,0.5007191
513
+ 512,1.177024482,1.677743582
514
+ 513,0.976856026,1.477575126
515
+ 514,0,0.5007191
516
+ 515,0.688705234,1.189424334
517
+ 516,0.517598344,1.018317444
518
+ 517,0.544662309,1.045381409
519
+ 518,0.96764205,1.46836115
520
+ 519,0,0.5007191
521
+ 520,0.423011844,0.923730944
522
+ 521,0,0.5007191
523
+ 522,0.7852077,1.2859268
524
+ 523,0.599520384,1.100239484
525
+ 524,1.09317188,1.59389098
526
+ 525,0.661375661,1.162094761
527
+ 526,0.350140056,0.850859156
528
+ 527,0.338753388,0.839472488
529
+ 528,0.952380952,1.453100052
530
+ 529,0.738508803,1.239227903
531
+ 530,0.32808399,0.82880309
532
+ 531,1.261829653,1.762548753
533
+ 532,0.308641975,0.809361075
534
+ 533,0.829531315,1.330250415
535
+ 534,0.344352617,0.845071717
536
+ 535,0.32808399,0.82880309
537
+ 536,0.283446712,0.784165812
538
+ 537,0.97924011,1.47995921
539
+ 538,0.487329435,0.988048535
540
+ 539,0.524109015,1.024828115
541
+ 540,0,0.5007191
542
+ 541,0.215889465,0.716608565
543
+ 542,0,0.5007191
544
+ 543,0.324254215,0.824973315
545
+ 544,0.268817204,0.769536304
546
+ 545,1.037037037,1.537756137
547
+ 546,0,0.5007191
548
+ 547,0.974658869,1.475377969
549
+ 548,0.972157412,1.472876512
550
+ 549,0.850340136,1.351059236
551
+ 550,0.926337632,1.427056732
552
+ 551,0.350140056,0.850859156
553
+ 552,0.775193798,1.275912898
554
+ 553,1.104417671,1.605136771
555
+ 554,0.570776256,1.071495356
556
+ 555,0.455373406,0.956092506
557
+ 556,0.660720185,1.161439285
558
+ 557,0.418760469,0.919479569
559
+ 558,0.410509031,0.911228131
560
+ 559,0.874125874,1.374844974
561
+ 560,1.052064983,1.552784083
562
+ 561,0.295508274,0.796227374
563
+ 562,0.539025442,1.039744542
564
+ 563,0.318066158,0.818785258
565
+ 564,0.82781457,1.32853367
566
+ 565,0.881834215,1.382553315
567
+ 566,0.972762646,1.473481746
568
+ 567,0,0.5007191
569
+ 568,0.199362041,0.700081141
570
+ 569,0,0.5007191
571
+ 570,0.810635538,1.311354638
572
+ 571,0.350140056,0.850859156
573
+ 572,0.885296382,1.386015482
574
+ 573,0.786163522,1.286882622
575
+ 574,0,0.5007191
576
+ 575,0,0.5007191
577
+ 576,0.27593819,0.77665729
578
+ 577,0.394944708,0.895663808
579
+ 578,1.398210291,1.898929391
580
+ 579,0.333333333,0.834052433
581
+ 580,0,0.5007191
582
+ 581,0,0.5007191
583
+ 582,0,0.5007191
584
+ 583,0.608272506,1.108991606
585
+ 584,1.090404441,1.591123541
586
+ 585,0.899280576,1.399999676
587
+ 586,0.902276513,1.402995613
588
+ 587,0.574712644,1.075431744
589
+ 588,0.838604562,1.339323662
590
+ 589,0.925925926,1.426645026
591
+ 590,1.212751213,1.713470313
592
+ 591,0.899280576,1.399999676
593
+ 592,0.322997416,0.823716516
594
+ 593,0.481695568,0.982414668
595
+ 594,0.886524823,1.387243923
596
+ 595,1.322751323,1.823470423
597
+ 596,0.724637681,1.225356781
598
+ 597,0.362318841,0.863037941
599
+ 598,0.880067978,1.380787078
600
+ 599,0.308641975,0.809361075
601
+ 600,0.596455351,1.097174451
602
+ 601,0.268817204,0.769536304
603
+ 602,0.319284802,0.820003902
604
+ 603,1.048218029,1.548937129
605
+ 604,1.025354213,1.526073313
606
+ 605,0.82781457,1.32853367
607
+ 606,0.517598344,1.018317444
608
+ 607,0.732600733,1.233319833
609
+ 608,1.204238921,1.704958021
610
+ 609,1.427212179,1.927931279
611
+ 610,0.225225225,0.725944325
612
+ 611,0,0.5007191
613
+ 612,0,0.5007191
614
+ 613,0.279642058,0.780361158
615
+ 614,0.539125077,1.039844177
616
+ 615,0.481695568,0.982414668
617
+ 616,0.407166124,0.907885224
618
+ 617,0.246548323,0.747267423
619
+ 618,0.896057348,1.396776448
620
+ 619,0.262054507,0.762773607
621
+ 620,1.065643649,1.566362749
622
+ 621,0,0.5007191
623
+ 622,0.283446712,0.784165812
624
+ 623,0,0.5007191
625
+ 624,1.177856302,1.678575402
626
+ 625,0.690607735,1.191326835
627
+ 626,1.00040016,1.50111926
628
+ 627,0.322997416,0.823716516
629
+ 628,1.060820368,1.561539468
630
+ 629,0.920810313,1.421529413
631
+ 630,0.883108542,1.383827642
632
+ 631,0.207296849,0.708015949
633
+ 632,0,0.5007191
634
+ 633,0.333333333,0.834052433
635
+ 634,1.454016721,1.954735821
636
+ 635,0.721500722,1.222219822
637
+ 636,0.993009215,1.493728315
638
+ 637,0,0.5007191
639
+ 638,1.13999088,1.64070998
640
+ 639,0.920810313,1.421529413
641
+ 640,0.778816199,1.279535299
642
+ 641,1.184834123,1.685553223
643
+ 642,0.816033425,1.316752525
644
+ 643,1.559714795,2.060433895
645
+ 644,0.946539452,1.447258552
646
+ 645,0.748502994,1.249222094
647
+ 646,0.792443261,1.293162361
648
+ 647,0.617283951,1.118003051
649
+ 648,1.153846154,1.654565254
650
+ 649,1.151012891,1.651731991
651
+ 650,1.492942454,1.993661554
652
+ 651,0.854700855,1.355419955
653
+ 652,0.985027581,1.485746681
654
+ 653,0.295508274,0.796227374
655
+ 654,0.944218478,1.444937578
656
+ 655,0,0.5007191
657
+ 656,0.577901063,1.078620163
658
+ 657,0.776397516,1.277116616
659
+ 658,0.78369906,1.28441816
660
+ 659,0.465549348,0.966268448
661
+ 660,0.944822373,1.445541473
662
+ 661,0.505050505,1.005769605
663
+ 662,0.698870625,1.199589725
664
+ 663,0.382262997,0.882982097
665
+ 664,0.220458554,0.721177654
666
+ 665,0,0.5007191
667
+ 666,0.377643505,0.878362605
668
+ 667,0,0.5007191
669
+ 668,0.265392781,0.766111881
670
+ 669,0.73176443,1.23248353
671
+ 670,1.593806922,2.094526022
672
+ 671,0.27593819,0.77665729
673
+ 672,0.954198473,1.454917573
674
+ 673,0.222816399,0.723535499
675
+ 674,0.249500998,0.750220098
676
+ 675,0.438596491,0.939315591
677
+ 676,0.255623722,0.756342822
678
+ 677,0.39184953,0.89256863
679
+ 678,0,0.5007191
680
+ 679,0.636132316,1.136851416
681
+ 680,0.805931657,1.306650757
682
+ 681,0.287356322,0.788075422
683
+ 682,0.606131707,1.106850807
684
+ 683,0,0.5007191
685
+ 684,0.95959596,1.46031506
686
+ 685,0.566893424,1.067612524
687
+ 686,1.338688086,1.839407186
688
+ 687,0.544662309,1.045381409
689
+ 688,0.666666667,1.167385767
690
+ 689,0.333333333,0.834052433
691
+ 690,0,0.5007191
692
+ 691,1.00922722,1.50994632
693
+ 692,0.945626478,1.446345578
694
+ 693,0.360750361,0.861469461
695
+ 694,0.588235294,1.088954394
696
+ 695,0.314465409,0.815184509
697
+ 696,0.750750751,1.251469851
698
+ 697,0.750750751,1.251469851
699
+ 698,0.628140704,1.128859804
700
+ 699,0.457875458,0.958594558
701
+ 700,0.774473358,1.275192458
702
+ 701,0.291375291,0.792094391
703
+ 702,1.515151515,2.015870615
704
+ 703,1.497005988,1.997725088
705
+ 704,0.258799172,0.759518272
706
+ 705,0.932140194,1.432859294
707
+ 706,0.858000858,1.358719958
708
+ 707,0,0.5007191
709
+ 708,0.716907548,1.217626648
710
+ 709,1.310272537,1.810991637
711
+ 710,1.307320998,1.808040098
712
+ 711,1.01010101,1.51082011
713
+ 712,1.075268817,1.575987917
714
+ 713,0,0.5007191
715
+ 714,0.481695568,0.982414668
716
+ 715,0,0.5007191
717
+ 716,0.177304965,0.678024065
718
+ 717,0,0.5007191
719
+ 718,0.603864734,1.104583834
720
+ 719,0.412541254,0.913260354
721
+ 720,0,0.5007191
722
+ 721,0.530785563,1.031504663
723
+ 722,0,0.5007191
724
+ 723,0.621890547,1.122609647
725
+ 724,0.982431808,1.483150908
726
+ 725,0.766871166,1.267590266
727
+ 726,1.182033097,1.682752197
728
+ 727,0,0.5007191
729
+ 728,0.291375291,0.792094391
730
+ 729,0.790754258,1.291473358
731
+ 730,0.730994152,1.231713252
732
+ 731,0.249500998,0.750220098
733
+ 732,0.464252553,0.964971653
734
+ 733,0,0.5007191
735
+ 734,0.313283208,0.814002308
736
+ 735,0.997719498,1.498438598
737
+ 736,0,0.5007191
738
+ 737,0.537634409,1.038353509
739
+ 738,1.220362622,1.721081722
740
+ 739,0.636132316,1.136851416
741
+ 740,0.252525253,0.753244353
742
+ 741,0.786163522,1.286882622
743
+ 742,0,0.5007191
744
+ 743,0.806451613,1.307170713
745
+ 744,1.243182547,1.743901647
746
+ 745,0.809061489,1.309780589
747
+ 746,0.566893424,1.067612524
748
+ 747,0.94055681,1.44127591
749
+ 748,0,0.5007191
750
+ 749,0.566893424,1.067612524
751
+ 750,0.821018062,1.321737162
752
+ 751,0.706214689,1.206933789
753
+ 752,1,1.5007191
754
+ 753,0.926337632,1.427056732
755
+ 754,0.598086124,1.098805224
756
+ 755,0.986193294,1.486912394
757
+ 756,1.088677751,1.589396851
758
+ 757,1.091703057,1.592422157
759
+ 758,0.445632799,0.946351899
760
+ 759,0.279642058,0.780361158
761
+ 760,0.787474523,1.288193623
762
+ 761,0.283446712,0.784165812
763
+ 762,0.801590355,1.302309455
764
+ 763,1.068376068,1.569095168
765
+ 764,0.222816399,0.723535499
766
+ 765,0.722125939,1.222845039
767
+ 766,0,0.5007191
768
+ 767,0.806451613,1.307170713
769
+ 768,0,0.5007191
770
+ 769,0,0.5007191
771
+ 770,0,0.5007191
772
+ 771,1.728110599,2.228829699
773
+ 772,0.382262997,0.882982097
774
+ 773,0,0.5007191
775
+ 774,0.73964497,1.24036407
776
+ 775,0,0.5007191
777
+ 776,0.287356322,0.788075422
778
+ 777,1.272264631,1.772983731
779
+ 778,0,0.5007191
780
+ 779,0.238095238,0.738814338
781
+ 780,0.896659942,1.397379042
782
+ 781,0.404530744,0.905249844
783
+ 782,0.570776256,1.071495356
784
+ 783,0.67662661,1.17734571
785
+ 784,0.375375375,0.876094475
786
+ 785,0.748502994,1.249222094
787
+ 786,0.507264021,1.007983121
788
+ 787,0.912408759,1.413127859
789
+ 788,0.881834215,1.382553315
790
+ 789,0.268817204,0.769536304
791
+ 790,1.221498371,1.722217471
792
+ 791,0,0.5007191
793
+ 792,1.004984724,1.505703824
794
+ 793,0,0.5007191
795
+ 794,0.464370145,0.965089245
796
+ 795,0.608272506,1.108991606
797
+ 796,0.883256528,1.383975628
798
+ 797,0.559284116,1.060003216
799
+ 798,0.95129376,1.45201286
800
+ 799,0,0.5007191
801
+ 800,0,0.5007191
802
+ 801,0.73313783,1.23385693
803
+ 802,0.891265597,1.391984697
804
+ 803,0.965847628,1.466566728
805
+ 804,0.599520384,1.100239484
806
+ 805,1.354096141,1.854815241
807
+ 806,0.511247444,1.011966544
808
+ 807,0.770609319,1.271328419
809
+ 808,0.272331155,0.773050255
810
+ 809,1.241254796,1.741973896
811
+ 810,1.253132832,1.753851932
812
+ 811,0.80348944,1.30420854
813
+ 812,0.628140704,1.128859804
814
+ 813,0.634582191,1.135301291
815
+ 814,0.706214689,1.206933789
816
+ 815,0.537634409,1.038353509
817
+ 816,0.722983257,1.223702357
818
+ 817,0.635013677,1.135732777
819
+ 818,0.592417062,1.093136162
820
+ 819,0.249500998,0.750220098
821
+ 820,0.357653791,0.858372891
822
+ 821,0.589678272,1.090397372
823
+ 822,0.996810207,1.497529307
824
+ 823,1.360039565,1.860758665
825
+ 824,0.560538117,1.061257217
826
+ 825,0.465549348,0.966268448
827
+ 826,0,0.5007191
828
+ 827,0.925925926,1.426645026
829
+ 828,0.626566416,1.127285516
830
+ 829,0.45045045,0.95116955
831
+ 830,0,0.5007191
832
+ 831,0.730994152,1.231713252
833
+ 832,0.787649653,1.288368753
834
+ 833,0.866414619,1.367133719
835
+ 834,0.436300175,0.937019275
836
+ 835,0.769041467,1.269760567
837
+ 836,0.757575758,1.258294858
838
+ 837,1.234567901,1.735287001
839
+ 838,1.016260163,1.516979263
840
+ 839,0.246548323,0.747267423
841
+ 840,1.271693597,1.772412697
842
+ 841,1.269956459,1.770675559
843
+ 842,0.899280576,1.399999676
844
+ 843,0,0.5007191
845
+ 844,1.016260163,1.516979263
846
+ 845,1.052720229,1.553439329
847
+ 846,0,0.5007191
848
+ 847,0.790424571,1.291143671
849
+ 848,0,0.5007191
850
+ 849,0.272331155,0.773050255
851
+ 850,0.9887676,1.4894867
852
+ 851,0.766871166,1.267590266
853
+ 852,0.504561234,1.005280334
854
+ 853,0.299760192,0.800479292
855
+ 854,1.170589724,1.671308824
856
+ 855,0.838926174,1.339645274
857
+ 856,0.688705234,1.189424334
858
+ 857,0.32808399,0.82880309
859
+ 858,0.279642058,0.780361158
860
+ 859,1.25600699,1.75672609
861
+ 860,0.581395349,1.082114449
862
+ 861,0.443923574,0.944642674
863
+ 862,0.524109015,1.024828115
864
+ 863,0.780640125,1.281359225
865
+ 864,0.291375291,0.792094391
866
+ 865,0.649215747,1.149934847
867
+ 866,0.299760192,0.800479292
868
+ 867,0.875718089,1.376437189
869
+ 868,0,0.5007191
870
+ 869,0.974658869,1.475377969
871
+ 870,1.724137931,2.224857031
872
+ 871,0.505050505,1.005769605
873
+ 872,0.69421304,1.19493214
874
+ 873,0.476190476,0.976909576
875
+ 874,1.212650369,1.713369469
876
+ 875,0.350140056,0.850859156
877
+ 876,0.925191647,1.425910747
878
+ 877,0,0.5007191
879
+ 878,0.588235294,1.088954394
880
+ 879,0.92936803,1.43008713
881
+ 880,0.517598344,1.018317444
882
+ 881,1.008690255,1.509409355
883
+ 882,1.337613697,1.838332797
884
+ 883,0.493096647,0.993815747
885
+ 884,0.709219858,1.209938958
886
+ 885,0,0.5007191
887
+ 886,0.900900901,1.401620001
888
+ 887,0.802093887,1.302812987
889
+ 888,0.429553265,0.930272365
890
+ 889,0.279642058,0.780361158
891
+ 890,1.022494888,1.523213988
892
+ 891,0.696767001,1.197486101
893
+ 892,0.235404896,0.736123996
894
+ 893,0.579374276,1.080093376
895
+ 894,0,0.5007191
896
+ 895,0.574712644,1.075431744
897
+ 896,1.147666412,1.648385512
898
+ 897,0.978090767,1.478809867
899
+ 898,0.299760192,0.800479292
900
+ 899,0.418760469,0.919479569
901
+ 900,0,0.5007191
902
+ 901,0.544662309,1.045381409
903
+ 902,0.780274657,1.280993757
904
+ 903,0.356125356,0.856844456
905
+ 904,0.789889415,1.290608515
906
+ 905,0.677139762,1.177858862
907
+ 906,0.615763547,1.116482647
908
+ 907,0.299760192,0.800479292
909
+ 908,0.333333333,0.834052433
910
+ 909,0.291375291,0.792094391
911
+ 910,0.95712098,1.45784008
912
+ 911,0.205254516,0.705973616
913
+ 912,0.418760469,0.919479569
914
+ 913,1.129177958,1.629897058
915
+ 914,0.515995872,1.016714972
916
+ 915,0.615763547,1.116482647
917
+ 916,0.621890547,1.122609647
918
+ 917,0.524109015,1.024828115
919
+ 918,0.805152979,1.305872079
920
+ 919,0,0.5007191
921
+ 920,0.481695568,0.982414668
922
+ 921,1.097178683,1.597897783
923
+ 922,0.499001996,0.999721096
924
+ 923,1.232741617,1.733460717
925
+ 924,1.232741617,1.733460717
926
+ 925,0.757575758,1.258294858
927
+ 926,0,0.5007191
928
+ 927,0,0.5007191
929
+ 928,1.035196687,1.535915787
930
+ 929,0,0.5007191
931
+ 930,0,0.5007191
932
+ 931,0.279642058,0.780361158
933
+ 932,0.695566326,1.196285426
934
+ 933,0.318066158,0.818785258
935
+ 934,0.574712644,1.075431744
936
+ 935,0.268817204,0.769536304
937
+ 936,0.825082508,1.325801608
938
+ 937,0.3894081,0.8901272
939
+ 938,0.55187638,1.05259548
940
+ 939,0.737286785,1.238005885
941
+ 940,0.517598344,1.018317444
942
+ 941,0.936329588,1.437048688
943
+ 942,0.757575758,1.258294858
944
+ 943,1.610936956,2.111656056
945
+ 944,0.968992248,1.469711348
946
+ 945,0.268817204,0.769536304
947
+ 946,1.039152588,1.539871688
948
+ 947,0,0.5007191
949
+ 948,0.322997416,0.823716516
950
+ 949,0.862068966,1.362788066
951
+ 950,1.122658455,1.623377555
952
+ 951,0.391236307,0.891955407
953
+ 952,0.838926174,1.339645274
954
+ 953,0.318066158,0.818785258
955
+ 954,0.628140704,1.128859804
956
+ 955,0.318066158,0.818785258
957
+ 956,0.933005644,1.433724744
958
+ 957,0,0.5007191
959
+ 958,0.938967136,1.439686236
960
+ 959,0.505050505,1.005769605
961
+ 960,0.812819322,1.313538422
962
+ 961,0.230202578,0.730921678
963
+ 962,0.374027528,0.874746628
964
+ 963,0.559284116,1.060003216
965
+ 964,0.978890024,1.479609124
966
+ 965,0.574712644,1.075431744
967
+ 966,0.755909841,1.256628941
968
+ 967,0.262054507,0.762773607
969
+ 968,0.906555091,1.407274191
970
+ 969,0.862068966,1.362788066
971
+ 970,1.074436995,1.575156095
972
+ 971,0,0.5007191
973
+ 972,0.872817955,1.373537055
974
+ 973,0.382262997,0.882982097
975
+ 974,0.779376499,1.280095599
976
+ 975,0.235404896,0.736123996
977
+ 976,0.94390507,1.44462417
978
+ 977,0.806451613,1.307170713
979
+ 978,0.313283208,0.814002308
980
+ 979,0.333333333,0.834052433
981
+ 980,0.394944708,0.895663808
982
+ 981,0,0.5007191
983
+ 982,0,0.5007191
984
+ 983,0.715922108,1.216641208
985
+ 984,1.472320377,1.973039477
986
+ 985,0.82781457,1.32853367
987
+ 986,1.406926407,1.907645507
988
+ 987,0.27593819,0.77665729
989
+ 988,0.601926164,1.102645264
990
+ 989,0.544662309,1.045381409
991
+ 990,0.530785563,1.031504663
992
+ 991,0,0.5007191
993
+ 992,0.308641975,0.809361075
994
+ 993,0.283446712,0.784165812
995
+ 994,0.295508274,0.796227374
996
+ 995,0.368731563,0.869450663
997
+ 996,0,0.5007191
998
+ 997,0.55187638,1.05259548
999
+ 998,0.249500998,0.750220098
1000
+ 999,0.617283951,1.118003051
1001
+ 1000,0.611127408,1.111846508
A2 #Q8 Chrf Scores for both LSTM-based model vs Seq-to-seq model .png ADDED
A2_Q10_Google_Colab_Seq2seq_based_translator_Analysis.ipynb ADDED
@@ -0,0 +1,592 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {
7
+ "colab": {
8
+ "base_uri": "https://localhost:8080/"
9
+ },
10
+ "id": "8NIm_0b_sjJc",
11
+ "outputId": "615bda96-593f-4851-b6e6-6acb84376b93"
12
+ },
13
+ "outputs": [
14
+ {
15
+ "name": "stdout",
16
+ "output_type": "stream",
17
+ "text": [
18
+ "Requirement already satisfied: sacrebleu in /usr/local/lib/python3.10/dist-packages (2.4.3)\n",
19
+ "Requirement already satisfied: portalocker in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (2.10.1)\n",
20
+ "Requirement already satisfied: regex in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (2024.9.11)\n",
21
+ "Requirement already satisfied: tabulate>=0.8.9 in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (0.9.0)\n",
22
+ "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (1.26.4)\n",
23
+ "Requirement already satisfied: colorama in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (0.4.6)\n",
24
+ "Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (5.3.0)\n"
25
+ ]
26
+ }
27
+ ],
28
+ "source": [
29
+ "!pip install sacrebleu\n",
30
+ "\n",
31
+ "import torch\n",
32
+ "import torch.nn as nn\n",
33
+ "import torch.optim as optim\n",
34
+ "from torch.utils.data import DataLoader, Dataset\n",
35
+ "import numpy as np\n",
36
+ "import matplotlib.pyplot as plt\n",
37
+ "import sacrebleu\n",
38
+ "import json\n",
39
+ "import csv\n",
40
+ "from collections import Counter"
41
+ ]
42
+ },
43
+ {
44
+ "cell_type": "code",
45
+ "execution_count": 9,
46
+ "metadata": {
47
+ "colab": {
48
+ "base_uri": "https://localhost:8080/"
49
+ },
50
+ "id": "XAapN08evSpV",
51
+ "outputId": "61281ff6-7979-48a5-9da9-a92d17f17210"
52
+ },
53
+ "outputs": [
54
+ {
55
+ "name": "stdout",
56
+ "output_type": "stream",
57
+ "text": [
58
+ "EN to IC\n",
59
+ "<s>\n",
60
+ "<en> give three tips for staying healthy </en>\n",
61
+ "<ic> gefðu þrjú ráð til að halda heilsu </ic>\n",
62
+ "</s>\n",
63
+ "IC to EN\n",
64
+ "<s>\n",
65
+ "<ic> gefðu þrjú ráð til að halda heilsu </ic>\n",
66
+ "<en> give three tips for staying healthy </en>\n",
67
+ "</s>\n",
68
+ "\n",
69
+ "EN to IC\n",
70
+ "<s>\n",
71
+ "<en> 1 eat a balanced and nutritious diet make sure your meals are inclusive of a variety of fruits and vegetables lean protein whole grains and healthy fats this helps to provide your body with the essential nutrients to function at its best and can help prevent chronic diseases 2 engage in regular physical activity exercise is crucial for maintaining strong bones muscles and cardiovascular health aim for at least 150 minutes of moderate aerobic exercise or 75 minutes of vigorous exercise each week 3 get enough sleep getting enough quality sleep is crucial for physical and mental wellbeing it helps to regulate mood improve cognitive function and supports healthy growth and immune function aim for 79 hours of sleep each night </en>\n",
72
+ "<ic> 1 borðaðu hollt og næringarríkt mataræði gakktu úr skugga um að máltíðirnar þínar innihaldi margs konar ávexti og grænmeti magurt prótein heilkorn og holla fitu þetta hjálpar til við að veita líkamanum nauðsynleg næringarefni til að virka sem best og getur hjálpað til við að koma í veg fyrir langvinna sjúkdóma 2 taktu þátt í reglulegri hreyfingu hreyfing er mikilvæg til að viðhalda sterkum beinum vöðvum og hjarta og æðaheilbrigði miðaðu við að minnsta kosti 150 mínútur af hóflegri þolþjálfun eða 75 mínútur af öflugri hreyfingu í hverri viku 3 fáðu nægan svefn að fá nægan gæðasvefn skiptir sköpum fyrir líkamlega og andlega vellíðan það hjálpar til við að stjórna skapi bæta vitræna virkni og styðja við heilbrigðan vöxt og ónæmisvirkni miðaðu við 79 tíma svefn á hverri nóttu </ic>\n",
73
+ "</s>\n",
74
+ "IC to EN\n",
75
+ "<s>\n",
76
+ "<ic> 1 borðaðu hollt og næringarríkt mataræði gakktu úr skugga um að máltíðirnar þínar innihaldi margs konar ávexti og grænmeti magurt prótein heilkorn og holla fitu þetta hjálpar til við að veita líkamanum nauðsynleg næringarefni til að virka sem best og getur hjálpað til við að koma í veg fyrir langvinna sjúkdóma 2 taktu þátt í reglulegri hreyfingu hreyfing er mikilvæg til að viðhalda sterkum beinum vöðvum og hjarta og æðaheilbrigði miðaðu við að minnsta kosti 150 mínútur af hóflegri þolþjálfun eða 75 mínútur af öflugri hreyfingu í hverri viku 3 fáðu nægan svefn að fá nægan gæðasvefn skiptir sköpum fyrir líkamlega og andlega vellíðan það hjálpar til við að stjórna skapi bæta vitræna virkni og styðja við heilbrigðan vöxt og ónæmisvirkni miðaðu við 79 tíma svefn á hverri nóttu </ic>\n",
77
+ "<en> 1 eat a balanced and nutritious diet make sure your meals are inclusive of a variety of fruits and vegetables lean protein whole grains and healthy fats this helps to provide your body with the essential nutrients to function at its best and can help prevent chronic diseases 2 engage in regular physical activity exercise is crucial for maintaining strong bones muscles and cardiovascular health aim for at least 150 minutes of moderate aerobic exercise or 75 minutes of vigorous exercise each week 3 get enough sleep getting enough quality sleep is crucial for physical and mental wellbeing it helps to regulate mood improve cognitive function and supports healthy growth and immune function aim for 79 hours of sleep each night </en>\n",
78
+ "</s>\n",
79
+ "\n",
80
+ "EN to IC\n",
81
+ "<s>\n",
82
+ "<en> what are the three primary colors </en>\n",
83
+ "<ic> hverjir eru þrír aðallitirnir </ic>\n",
84
+ "</s>\n",
85
+ "IC to EN\n",
86
+ "<s>\n",
87
+ "<ic> hverjir eru þrír aðallitirnir </ic>\n",
88
+ "<en> what are the three primary colors </en>\n",
89
+ "</s>\n",
90
+ "\n",
91
+ "EN to IC\n",
92
+ "<s>\n",
93
+ "<en> the three primary colors are red blue and yellow these colors are called primary because they cannot be created by mixing other colors and all other colors can be made by combining them in various proportions in the additive color system used for light the primary colors are red green and blue rgb </en>\n",
94
+ "<ic> aðallitirnir þrír eru rauður blár og gulur þessir litir eru kallaðir frumefni vegna þess að ekki er hægt að búa þá til með því að blanda öðrum litum og alla aðra liti er hægt að búa til með því að sameina þá í ýmsum hlutföllum í auklitakerfinu notað fyrir ljós eru aðallitirnir rauður grænn og blár rgb </ic>\n",
95
+ "</s>\n",
96
+ "IC to EN\n",
97
+ "<s>\n",
98
+ "<ic> aðallitirnir þrír eru rauður blár og gulur þessir litir eru kallaðir frumefni vegna þess að ekki er hægt að búa þá til með því að blanda öðrum litum og alla aðra liti er hægt að búa til með því að sameina þá í ýmsum hlutföllum í auklitakerfinu notað fyrir ljós eru aðallitirnir rauður grænn og blár rgb </ic>\n",
99
+ "<en> the three primary colors are red blue and yellow these colors are called primary because they cannot be created by mixing other colors and all other colors can be made by combining them in various proportions in the additive color system used for light the primary colors are red green and blue rgb </en>\n",
100
+ "</s>\n",
101
+ "\n",
102
+ "EN to IC\n",
103
+ "<s>\n",
104
+ "<en> describe the structure of an atom </en>\n",
105
+ "<ic> lýstu byggingu atóms </ic>\n",
106
+ "</s>\n",
107
+ "IC to EN\n",
108
+ "<s>\n",
109
+ "<ic> lýstu byggingu atóms </ic>\n",
110
+ "<en> describe the structure of an atom </en>\n",
111
+ "</s>\n",
112
+ "\n"
113
+ ]
114
+ }
115
+ ],
116
+ "source": [
117
+ "DEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
118
+ "\n",
119
+ "\n",
120
+ "# Load the Icelandic_cleaned.json dataset\n",
121
+ "with open('/content/Icelandic_cleaned.json', 'r', encoding='utf-8') as f:\n",
122
+ " data = json.load(f)\n",
123
+ "\n",
124
+ "# Extract the first 1,000 English and Icelandic sentences for BLEU and CHRF calculation\n",
125
+ "en_sentences = [entry['input'] for entry in data[:1000]]\n",
126
+ "ic_sentences = [entry['output'] for entry in data[:1000]]\n",
127
+ "\n",
128
+ "# Tokenizer and Vectorization\n",
129
+ "tokenizer = lambda x: x.split()\n",
130
+ "\n",
131
+ "def build_vocab(sentences):\n",
132
+ " counter = Counter()\n",
133
+ " for sentence in sentences:\n",
134
+ " counter.update(tokenizer(sentence))\n",
135
+ " return counter\n",
136
+ "\n",
137
+ "en_vocab = build_vocab(en_sentences)\n",
138
+ "ic_vocab = build_vocab(ic_sentences)\n",
139
+ "\n",
140
+ "# Adding special tokens\n",
141
+ "en_vocab = {'<s>': 1, '</s>': 2, '<pad>': 0, '<unk>': 3, **en_vocab}\n",
142
+ "ic_vocab = {'<s>': 1, '</s>': 2, '<pad>': 0, '<unk>': 3, **ic_vocab}\n",
143
+ "\n",
144
+ "def sentence_to_tensor(sentence, vocab, max_len=MAX_LEN):\n",
145
+ " tokens = tokenizer(sentence)\n",
146
+ " indices = [vocab.get(token, vocab['<unk>']) for token in tokens]\n",
147
+ " indices = [vocab['<s>']] + indices + [vocab['</s>']]\n",
148
+ " if len(indices) < max_len:\n",
149
+ " indices += [vocab['<pad>']] * (max_len - len(indices))\n",
150
+ " else:\n",
151
+ " indices = indices[:max_len]\n",
152
+ " return torch.tensor(indices)\n",
153
+ "\n",
154
+ "\n",
155
+ "VOCAB_SIZE = 10000\n",
156
+ "EMBEDDING_DIM = 256\n",
157
+ "HIDDEN_DIM = 512\n",
158
+ "BATCH_SIZE = 32\n",
159
+ "NUM_EPOCHS = 10\n",
160
+ "MAX_LEN = 50\n",
161
+ "\n",
162
+ "# Prepare dataset and dataloaders\n",
163
+ "en_tensor_sentences = [sentence_to_tensor(s, en_vocab) for s in en_sentences]\n",
164
+ "ic_tensor_sentences = [sentence_to_tensor(s, ic_vocab) for s in ic_sentences]\n",
165
+ "\n",
166
+ "# Split data into training and validation sets (80% train, 20% validation)\n",
167
+ "train_size = int(0.8 * len(en_tensor_sentences))\n",
168
+ "train_en, val_en = en_tensor_sentences[:train_size], en_tensor_sentences[train_size:]\n",
169
+ "train_ic, val_ic = ic_tensor_sentences[:train_size], ic_tensor_sentences[train_size:]\n",
170
+ "\n",
171
+ "# Sample Data Printing in Specified Format\n",
172
+ "def print_sample_data(en_sentences, ic_sentences):\n",
173
+ " for i in range(5):\n",
174
+ " en_sample = en_sentences[i]\n",
175
+ " ic_sample = ic_sentences[i]\n",
176
+ "\n",
177
+ " print(\"EN to IC\")\n",
178
+ " print(\"<s>\")\n",
179
+ " print(f\"<en> {en_sample} </en>\")\n",
180
+ " print(f\"<ic> {ic_sample} </ic>\")\n",
181
+ " print(\"</s>\")\n",
182
+ "\n",
183
+ " print(\"IC to EN\")\n",
184
+ " print(\"<s>\")\n",
185
+ " print(f\"<ic> {ic_sample} </ic>\")\n",
186
+ " print(f\"<en> {en_sample} </en>\")\n",
187
+ " print(\"</s>\")\n",
188
+ " print()\n",
189
+ "\n",
190
+ "print_sample_data(en_sentences, ic_sentences)"
191
+ ]
192
+ },
193
+ {
194
+ "cell_type": "code",
195
+ "execution_count": 3,
196
+ "metadata": {
197
+ "id": "nzbNHJI1vSlg"
198
+ },
199
+ "outputs": [],
200
+ "source": [
201
+ "# Custom Dataset\n",
202
+ "class TranslationDataset(Dataset):\n",
203
+ " def __init__(self, en_sentences, ic_sentences):\n",
204
+ " self.en_sentences = en_sentences\n",
205
+ " self.ic_sentences = ic_sentences\n",
206
+ "\n",
207
+ " def __len__(self):\n",
208
+ " return len(self.en_sentences)\n",
209
+ "\n",
210
+ " def __getitem__(self, idx):\n",
211
+ " return self.en_sentences[idx], self.ic_sentences[idx]\n",
212
+ "\n",
213
+ "# Prepare dataloader\n",
214
+ "train_dataset = TranslationDataset(train_en, train_ic)\n",
215
+ "val_dataset = TranslationDataset(val_en, val_ic)\n",
216
+ "\n",
217
+ "# Define a collate_fn to pad sequences dynamically\n",
218
+ "def collate_fn(batch):\n",
219
+ " en_batch, ic_batch = zip(*batch)\n",
220
+ " en_batch = torch.stack(en_batch, dim=0)\n",
221
+ " ic_batch = torch.stack(ic_batch, dim=0)\n",
222
+ " return en_batch, ic_batch\n",
223
+ "\n",
224
+ "train_dataloader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, collate_fn=collate_fn)\n",
225
+ "val_dataloader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False, collate_fn=collate_fn)\n"
226
+ ]
227
+ },
228
+ {
229
+ "cell_type": "code",
230
+ "execution_count": 4,
231
+ "metadata": {
232
+ "id": "3tVw3ao4vSiX"
233
+ },
234
+ "outputs": [],
235
+ "source": [
236
+ "\n",
237
+ "# Seq2Seq Model\n",
238
+ "class Seq2SeqModel(nn.Module):\n",
239
+ " def __init__(self, input_dim, output_dim, embedding_dim, hidden_dim, num_layers=1):\n",
240
+ " super(Seq2SeqModel, self).__init__()\n",
241
+ "\n",
242
+ " self.encoder_embedding = nn.Embedding(input_dim, embedding_dim)\n",
243
+ " self.encoder_lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers, batch_first=True)\n",
244
+ "\n",
245
+ " self.decoder_embedding = nn.Embedding(output_dim, embedding_dim)\n",
246
+ " self.decoder_lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers, batch_first=True)\n",
247
+ " self.fc_out = nn.Linear(hidden_dim, output_dim)\n",
248
+ "\n",
249
+ " def forward(self, src, trg):\n",
250
+ " embedded_src = self.encoder_embedding(src)\n",
251
+ " encoder_output, (hidden, cell) = self.encoder_lstm(embedded_src)\n",
252
+ "\n",
253
+ " embedded_trg = self.decoder_embedding(trg)\n",
254
+ " decoder_output, _ = self.decoder_lstm(embedded_trg, (hidden, cell))\n",
255
+ "\n",
256
+ " output = self.fc_out(decoder_output)\n",
257
+ " return output\n",
258
+ "\n",
259
+ "# Initialize the Seq2Seq model\n",
260
+ "model = Seq2SeqModel(len(en_vocab), len(ic_vocab), EMBEDDING_DIM, HIDDEN_DIM, num_layers=1).to(DEVICE)"
261
+ ]
262
+ },
263
+ {
264
+ "cell_type": "code",
265
+ "execution_count": 5,
266
+ "metadata": {
267
+ "colab": {
268
+ "base_uri": "https://localhost:8080/"
269
+ },
270
+ "id": "caqExHCzvSgZ",
271
+ "outputId": "e03cd84e-4e07-4cae-f804-406b98cfa0dd"
272
+ },
273
+ "outputs": [
274
+ {
275
+ "name": "stdout",
276
+ "output_type": "stream",
277
+ "text": [
278
+ "Epoch 1/10, Training Loss: 4.162079634666443, Validation Loss: 1.783459918839591\n",
279
+ "Epoch 2/10, Training Loss: 1.0344110178947448, Validation Loss: 0.4918278966631208\n",
280
+ "Epoch 3/10, Training Loss: 0.2632215261459351, Validation Loss: 0.12271245462553841\n",
281
+ "Epoch 4/10, Training Loss: 0.07123038023710251, Validation Loss: 0.04314851335116795\n",
282
+ "Epoch 5/10, Training Loss: 0.030836958587169647, Validation Loss: 0.02404651258672987\n",
283
+ "Epoch 6/10, Training Loss: 0.01885295122861862, Validation Loss: 0.01633326443178313\n",
284
+ "Epoch 7/10, Training Loss: 0.013474887125194073, Validation Loss: 0.012323189526796341\n",
285
+ "Epoch 8/10, Training Loss: 0.010358258336782455, Validation Loss: 0.009776035456785135\n",
286
+ "Epoch 9/10, Training Loss: 0.00829771364107728, Validation Loss: 0.008006346212433917\n",
287
+ "Epoch 10/10, Training Loss: 0.006895635910332203, Validation Loss: 0.006732985709926912\n"
288
+ ]
289
+ }
290
+ ],
291
+ "source": [
292
+ "# Define the loss function and optimizer\n",
293
+ "criterion = nn.CrossEntropyLoss(ignore_index=ic_vocab['<pad>'])\n",
294
+ "optimizer = optim.Adam(model.parameters(), lr=0.001)\n",
295
+ "\n",
296
+ "# Function to train the model\n",
297
+ "def train_model(model, train_dataloader, val_dataloader, optimizer, criterion, num_epochs=10):\n",
298
+ " model.to(DEVICE)\n",
299
+ " train_losses, val_losses = [], []\n",
300
+ "\n",
301
+ " for epoch in range(num_epochs):\n",
302
+ " model.train()\n",
303
+ " epoch_train_loss = 0\n",
304
+ " for en_batch, ic_batch in train_dataloader:\n",
305
+ " en_batch, ic_batch = en_batch.to(DEVICE), ic_batch.to(DEVICE)\n",
306
+ " ic_batch = ic_batch.long()\n",
307
+ "\n",
308
+ " optimizer.zero_grad()\n",
309
+ " output = model(en_batch, ic_batch)\n",
310
+ "\n",
311
+ " output_dim = output.shape[-1]\n",
312
+ " output = output.reshape(-1, output_dim)\n",
313
+ " ic_batch = ic_batch.reshape(-1)\n",
314
+ " loss = criterion(output, ic_batch)\n",
315
+ "\n",
316
+ " loss.backward()\n",
317
+ " optimizer.step()\n",
318
+ "\n",
319
+ " epoch_train_loss += loss.item()\n",
320
+ "\n",
321
+ " train_losses.append(epoch_train_loss / len(train_dataloader))\n",
322
+ "\n",
323
+ " model.eval()\n",
324
+ " epoch_val_loss = 0\n",
325
+ " with torch.no_grad():\n",
326
+ " for en_batch, ic_batch in val_dataloader:\n",
327
+ " en_batch, ic_batch = en_batch.to(DEVICE), ic_batch.to(DEVICE)\n",
328
+ " ic_batch = ic_batch.long()\n",
329
+ "\n",
330
+ " output = model(en_batch, ic_batch)\n",
331
+ " output_dim = output.shape[-1]\n",
332
+ " output = output.reshape(-1, output_dim)\n",
333
+ " ic_batch = ic_batch.reshape(-1)\n",
334
+ "\n",
335
+ " loss = criterion(output, ic_batch)\n",
336
+ " epoch_val_loss += loss.item()\n",
337
+ "\n",
338
+ " val_losses.append(epoch_val_loss / len(val_dataloader))\n",
339
+ "\n",
340
+ " print(f'Epoch {epoch+1}/{num_epochs}, Training Loss: {train_losses[-1]}, Validation Loss: {val_losses[-1]}')\n",
341
+ "\n",
342
+ " return train_losses, val_losses\n",
343
+ "\n",
344
+ "train_losses, val_losses = train_model(model, train_dataloader, val_dataloader, optimizer, criterion, num_epochs=NUM_EPOCHS)\n",
345
+ "\n",
346
+ "# Save the trained model\n",
347
+ "torch.save(model.state_dict(), 'seq2seq_translation_model.pth')\n",
348
+ "\n",
349
+ "\n",
350
+ "def translate_new_sentence(model, sentence, src_vocab, tgt_vocab, max_len=MAX_LEN):\n",
351
+ " # Prepare input tensor for the source sentence (English)\n",
352
+ " model.eval() # Set model to evaluation mode\n",
353
+ " en_indices = [src_vocab.get(word, src_vocab['<unk>']) for word in sentence.split()] # Handle unknown words\n",
354
+ " en_tensor = torch.tensor(en_indices).unsqueeze(0).to(DEVICE)\n",
355
+ "\n",
356
+ " # Initialize target sentence for translation (Croatian) with start token\n",
357
+ " tgt_tensor = torch.tensor([tgt_vocab['<s>']]).unsqueeze(0).to(DEVICE)\n",
358
+ "\n",
359
+ " translated_sentence = []\n",
360
+ "\n",
361
+ " for _ in range(max_len):\n",
362
+ " with torch.no_grad():\n",
363
+ " output = model(en_tensor, tgt_tensor)\n",
364
+ "\n",
365
+ " # Get the last output token's prediction (the next word)\n",
366
+ " output_token = output.argmax(dim=-1)[:, -1]\n",
367
+ "\n",
368
+ " # Get the predicted word from the target vocabulary\n",
369
+ " output_token_item = output_token.item()\n",
370
+ "\n",
371
+ " # Check if the token is within the target vocabulary range\n",
372
+ " if output_token_item not in tgt_vocab.values():\n",
373
+ " translated_word = '<unk>' # Map to <unk> if not found\n",
374
+ " else:\n",
375
+ " translated_word = list(tgt_vocab.keys())[list(tgt_vocab.values()).index(output_token_item)]\n",
376
+ "\n",
377
+ " # Append predicted word to the translated sentence\n",
378
+ " translated_sentence.append(translated_word)\n",
379
+ "\n",
380
+ " # If we encounter an end token, stop the translation\n",
381
+ " if translated_word == '</s>':\n",
382
+ " break\n",
383
+ "\n",
384
+ " # Update tgt_tensor for next prediction\n",
385
+ " tgt_tensor = torch.cat((tgt_tensor, output_token.unsqueeze(0)), dim=-1)\n",
386
+ "\n",
387
+ " return ' '.join(translated_sentence)\n",
388
+ "\n",
389
+ "# BLEU and CHRF Scores Calculation\n",
390
+ "def calculate_bleu_chrf(en_sentences, ic_sentences, model, en_vocab, ic_vocab, max_len=MAX_LEN):\n",
391
+ " bleu_scores = []\n",
392
+ " chrf_scores = []\n",
393
+ "\n",
394
+ " for en_sentence, ic_sentence in zip(en_sentences, ic_sentences):\n",
395
+ " translated_sentence = translate_new_sentence(model, en_sentence, en_vocab, ic_vocab, max_len)\n",
396
+ "\n",
397
+ " bleu_score = sacrebleu.corpus_bleu([translated_sentence], [[ic_sentence]]).score\n",
398
+ " bleu_scores.append(bleu_score)\n",
399
+ "\n",
400
+ " chrf_score = sacrebleu.corpus_chrf([translated_sentence], [[ic_sentence]]).score\n",
401
+ " chrf_scores.append(chrf_score)\n",
402
+ "\n",
403
+ " return bleu_scores, chrf_scores\n",
404
+ "\n",
405
+ "lstm_bleu_scores, lstm_chrf_scores = calculate_bleu_chrf(en_sentences, ic_sentences, model, en_vocab, ic_vocab)\n",
406
+ "\n",
407
+ "# Save BLEU and CHRF scores to CSV\n",
408
+ "with open('Seq2Seq_BLEU_CHRF_scores.csv', mode='w', newline='', encoding='utf-8') as file:\n",
409
+ " writer = csv.writer(file)\n",
410
+ " writer.writerow([\"BLEU Score\", \"CHRF Score\"])\n",
411
+ " for bleu, chrf in zip(lstm_bleu_scores, lstm_chrf_scores):\n",
412
+ " writer.writerow([bleu, chrf])\n",
413
+ "\n",
414
+ "\n",
415
+ "\n",
416
+ "\n"
417
+ ]
418
+ },
419
+ {
420
+ "cell_type": "code",
421
+ "execution_count": 10,
422
+ "metadata": {
423
+ "colab": {
424
+ "base_uri": "https://localhost:8080/",
425
+ "height": 487
426
+ },
427
+ "id": "pllSNt5vK-AX",
428
+ "outputId": "ba288b64-8026-4194-94fb-83cf9a54f7c2"
429
+ },
430
+ "outputs": [
431
+ {
432
+ "data": {
433
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0EAAAHWCAYAAACxAYILAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABsR0lEQVR4nO3dd3xT9eLG8eck3ZNCSwEpexUERJbsUZShKMONCi4coOIWvSLiwHWvXuGKOC5OXEx/XhDZAqIiG9mrbMpqS1u6kvP7IzS0tEApbU/afN6vV15NTs54GlLt03O+3ximaZoCAAAAAC9hszoAAAAAAJQmShAAAAAAr0IJAgAAAOBVKEEAAAAAvAolCAAAAIBXoQQBAAAA8CqUIAAAAABehRIEAAAAwKtQggAAAAB4FUoQAI80ZMgQ1apVq0jbjh49WoZhFG8gD7N7924ZhqHPPvus1I9tGIZGjx7tfvzZZ5/JMAzt3r37gtvWqlVLQ4YMKdY8l/Je8Rbbtm3TNddco/DwcBmGoRkzZlgdCQAsRQkCcFEMwyjUbdGiRVZH9XqPPvqoDMPQ9u3bz7nOCy+8IMMwtG7dulJMdvEOHDig0aNHa82aNVZHccspou+8847VUS5o8ODBWr9+vV577TV9+eWXatWqldWRit20adN0yy23qE6dOgoKClLDhg315JNPKjEx0epoADyQj9UBAJQtX375ZZ7HX3zxhebOnZtveWxs7CUd5+OPP5bT6SzStv/4xz/03HPPXdLxy4NBgwZp3Lhxmjx5skaNGlXgOt98842aNm2qZs2aFfk4d955p2699Vb5+/sXeR8XcuDAAb388suqVauWrrjiijzPXcp7xRucOnVKy5cv1wsvvKDhw4dbHafEDB06VNWqVdMdd9yhGjVqaP369Ro/frxmzZqlVatWKTAw0OqIADwIJQjARbnjjjvyPP799981d+7cfMvPlpaWpqCgoEIfx9fXt0j5JMnHx0c+PvznrW3btqpXr56++eabAkvQ8uXLtWvXLr3xxhuXdBy73S673X5J+7gUl/Je8QZHjhyRJFWoUKHY9pmamqrg4OBi219xmDJlirp27ZpnWcuWLTV48GB9/fXXuu+++6wJBsAjcTkcgGLXtWtXXX755Vq5cqU6d+6soKAgPf/885KkmTNn6tprr1W1atXk7++vunXr6pVXXpHD4cizj7PHeeS+9Oijjz5S3bp15e/vr9atW2vFihV5ti1oTJBhGBo+fLhmzJihyy+/XP7+/mrSpIl+/vnnfPkXLVqkVq1aKSAgQHXr1tXEiRMLPc5oyZIluummm1SjRg35+/srJiZGjz/+uE6dOpXv+wsJCdH+/fvVr18/hYSEKCoqSk899VS+1yIxMVFDhgxReHi4KlSooMGDBxf6Ep9BgwZp8+bNWrVqVb7nJk+eLMMwdNtttykzM1OjRo1Sy5YtFR4eruDgYHXq1EkLFy684DEKGhNkmqZeffVVVa9eXUFBQerWrZv+/vvvfNseP35cTz31lJo2baqQkBCFhYWpd+/eWrt2rXudRYsWqXXr1pKku+++233JZc54qILGBKWmpurJJ59UTEyM/P391bBhQ73zzjsyTTPPehfzviiqhIQE3XvvvYqOjlZAQICaN2+uzz//PN963377rVq2bKnQ0FCFhYWpadOm+ve//+1+PisrSy+//LLq16+vgIAAVapUSR07dtTcuXPPeezRo0erZs2akqSnn35ahmHkea1Wr16t3r17KywsTCEhIYqLi9Pvv/+eZx85/76LFy/Www8/rMqVK6t69ern/Z7HjRunJk2aKCgoSBEREWrVqpUmT56cZ539+/frnnvuUXR0tPt1/+9//5tvX/v27VO/fv0UHBysypUr6/HHH9ecOXPyXXZ7dgGSpP79+0uSNm3alGf5hV5ryfVzN2LECPd7qF69enrzzTfznXUs6OdzzZo1lo3ZA1A4/KkUQIk4duyYevfurVtvvVV33HGHoqOjJbl+oQoJCdETTzyhkJAQLViwQKNGjVJycrLefvvtC+538uTJOnnypB544AEZhqG33npLAwYM0M6dOy94RmDp0qWaNm2aHn74YYWGhur999/XwIEDtWfPHlWqVEmS65fCXr16qWrVqnr55ZflcDg0ZswYRUVFFer7/uGHH5SWlqaHHnpIlSpV0p9//qlx48Zp3759+uGHH/Ks63A41LNnT7Vt21bvvPOO5s2bp3/+85+qW7euHnroIUmuMnHDDTdo6dKlevDBBxUbG6vp06dr8ODBhcozaNAgvfzyy5o8ebKuvPLKPMf+/vvv1alTJ9WoUUNHjx7VJ598ottuu03333+/Tp48qU8//VQ9e/bUn3/+me8StAsZNWqUXn31VfXp00d9+vTRqlWrdM011ygzMzPPejt37tSMGTN00003qXbt2jp8+LAmTpyoLl26aOPGjapWrZpiY2M1ZswYjRo1SkOHDlWnTp0kSe3bty/w2KZp6vrrr9fChQt177336oorrtCcOXP09NNPa//+/Xr33XfzrF+Y90VRnTp1Sl27dtX27ds1fPhw1a5dWz/88IOGDBmixMREPfbYY5KkuXPn6rbbblNcXJzefPNNSa5f3JctW+ZeZ/To0Ro7dqzuu+8+tWnTRsnJyfrrr7+0atUqXX311QUef8CAAapQoYIef/xx3XbbberTp49CQkIkSX///bc6deqksLAwPfPMM/L19dXEiRPVtWtXLV68WG3bts2zr4cfflhRUVEaNWqUUlNTz/k9f/zxx3r00Ud144036rHHHlN6errWrVunP/74Q7fffrsk6fDhw7rqqqvcJTQqKkqzZ8/Wvffeq+TkZI0YMcL9+sXFxWnPnj169NFHVa1aNX355ZdasGBBoV7/Q4cOSZIiIyPdywrzWqelpalLly7av3+/HnjgAdWoUUO//fabRo4cqYMHD+q9996TdOk/nwAsZALAJRg2bJh59n9KunTpYkoyP/zww3zrp6Wl5Vv2wAMPmEFBQWZ6erp72eDBg82aNWu6H+/atcuUZFaqVMk8fvy4e/nMmTNNSeb//d//uZe99NJL+TJJMv38/Mzt27e7l61du9aUZI4bN869rG/fvmZQUJC5f/9+97Jt27aZPj4++fZZkIK+v7Fjx5qGYZjx8fF5vj9J5pgxY/Ks26JFC7Nly5buxzNmzDAlmW+99ZZ7WXZ2ttmpUydTkjlp0qQLZmrdurVZvXp10+FwuJf9/PPPpiRz4sSJ7n1mZGTk2e7EiRNmdHS0ec899+RZLsl86aWX3I8nTZpkSjJ37dplmqZpJiQkmH5+fua1115rOp1O93rPP/+8KckcPHiwe1l6enqeXKbp+rf29/fP89qsWLHinN/v2e+VnNfs1VdfzbPejTfeaBqGkec9UNj3RUFy3pNvv/32Odd57733TEnmV1995V6WmZlptmvXzgwJCTGTk5NN0zTNxx57zAwLCzOzs7PPua/mzZub11577XkzXUzOfv36mX5+fuaOHTvcyw4cOGCGhoaanTt3di/L+fft2LHjefPluOGGG8wmTZqcd517773XrFq1qnn06NE8y2+99VYzPDzc/XOU8/p9//337nVSU1PNevXqmZLMhQsXXvA4drvd3Lp1q3tZYV7rV155xQwODs6znWma5nPPPWfa7XZzz549pmkWz88nAGtwORyAEuHv76+777473/Lcg5NPnjypo0ePqlOnTkpLS9PmzZsvuN9bbrlFERER7sc5ZwV27tx5wW179OihunXruh83a9ZMYWFh7m0dDofmzZunfv36qVq1au716tWrp969e19w/1Le7y81NVVHjx5V+/btZZqmVq9enW/9Bx98MM/jTp065fleZs2aJR8fH/eZIck1BueRRx4pVB7JNY5r3759+vXXX93LJk+eLD8/P910003uffr5+UmSnE6njh8/ruzsbLVq1arAS+nOZ968ecrMzNQjjzyS5xLCnL/u5+bv7y+bzfW/IofDoWPHjikkJEQNGza86OPmmDVrlux2ux599NE8y5988kmZpqnZs2fnWX6h98WlmDVrlqpUqaLbbrvNvczX11ePPvqoUlJStHjxYkmu8TqpqannvbStQoUK+vvvv7Vt27ZLzuVwOPTLL7+oX79+qlOnjnt51apVdfvtt2vp0qVKTk7Os839999fqLFfFSpU0L59+/JdpprDNE1NnTpVffv2lWmaOnr0qPvWs2dPJSUluf/tZ82apapVq+rGG290bx8UFKShQ4deMMfkyZP16aef6sknn1T9+vXz5LvQa/3DDz+oU6dOioiIyJOvR48ecjgc7p+l4vj5BGANShCAEnHZZZe5f6nO7e+//1b//v0VHh6usLAwRUVFuSdVSEpKuuB+a9SokedxTiE6ceLERW+bs33OtgkJCTp16pTq1auXb72ClhVkz549GjJkiCpWrOge59OlSxdJ+b+/gICAfJfZ5c4jSfHx8apatar7EqYcDRs2LFQeSbr11ltlt9vdYzLS09M1ffp09e7dO0+h/Pzzz9WsWTP3eJOoqCj973//K9S/S27x8fGSlOcXT0mKiorKczzJVbjeffdd1a9fX/7+/oqMjFRUVJTWrVt30cfNffxq1aopNDQ0z/KcGQtz8uW40PviUsTHx6t+/fruoneuLA8//LAaNGig3r17q3r16rrnnnvyjUsaM2aMEhMT1aBBAzVt2lRPP/10kac2P3LkiNLS0gp8H8XGxsrpdGrv3r15lteuXbtQ+3722WcVEhKiNm3aqH79+ho2bJiWLVuW59iJiYn66KOPFBUVleeW84eThIQESa7Xp169evnG413o/b9kyRLde++96tmzp1577bU8zxXmtd62bZt+/vnnfPl69OiRL9+l/nwCsAZjggCUiIKmo01MTFSXLl0UFhamMWPGqG7dugoICNCqVav07LPPFmqa43P9Jdo8a8B7cW9bGA6HQ1dffbWOHz+uZ599Vo0aNVJwcLD279+vIUOG5Pv+SmtGtcqVK+vqq6/W1KlT9Z///Ef/93//p5MnT2rQoEHudb766isNGTJE/fr109NPP63KlSvLbrdr7Nix2rFjR4lle/311/Xiiy/qnnvu0SuvvKKKFSvKZrNpxIgRpTbtdUm/LwqjcuXKWrNmjebMmaPZs2dr9uzZmjRpku666y73JAqdO3fWjh07NHPmTP3yyy/65JNP9O677+rDDz8slZnPCjvFdGxsrLZs2aKffvpJP//8s6ZOnaoPPvhAo0aN0ssvv+z+d73jjjvOOXbmUqZsX7t2ra6//npdfvnlmjJlSr6ZIgvzWjudTl199dV65plnCjxGgwYNipwPgGegBAEoNYsWLdKxY8c0bdo0de7c2b18165dFqY6o3LlygoICCjww0XP94GjOdavX6+tW7fq888/11133eVefr7Lbi6kZs2amj9/vlJSUvL8tXnLli0XtZ9Bgwbp559/1uzZszV58mSFhYWpb9++7uenTJmiOnXqaNq0aXn+6v7SSy8VKbPk+mt67kutjhw5ku/sypQpU9StWzd9+umneZYnJibmGcxemJn5ch9/3rx5OnnyZJ6zQTmXW+bkKw01a9bUunXr5HQ685wNKiiLn5+f+vbtq759+8rpdOrhhx/WxIkT9eKLL7rPRFasWFF333237r77bqWkpKhz584aPXr0RZegqKgoBQUFFfg+2rx5s2w2m2JiYoryLUuSgoODdcstt+iWW25RZmamBgwYoNdee00jR45UVFSUQkND5XA43GdWzqVmzZrasGGDTNPM8x441/t/x44d6tWrlypXrqxZs2blO0OT40Kvdd26dZWSklKofMXx8wmg9HE5HIBSk/MX99x/Yc/MzNQHH3xgVaQ87Ha7evTooRkzZujAgQPu5du3b883juRc20t5vz/TNPNNvXsx+vTpo+zsbE2YMMG9zOFwaNy4cRe1n379+ikoKEgffPCBZs+erQEDBiggIOC82f/44w8tX778ojP36NFDvr6+GjduXJ795cyolZvdbs93xuWHH37Q/v378yzL+UyawkwN3qdPHzkcDo0fPz7P8nfffVeGYRR6fFdx6NOnjw4dOqTvvvvOvSw7O1vjxo1TSEiI+1LJY8eO5dnOZrO5z4ZkZGQUuE5ISIjq1avnfv5i2O12XXPNNZo5c2aeqc0PHz6syZMnq2PHjgoLC7vo/RaU08/PT40bN5ZpmsrKypLdbtfAgQM1depUbdiwId/2OZ9rJLlevwMHDmjKlCnuZWlpafroo4/ybXfo0CFdc801stlsmjNnzjlndCzMa33zzTdr+fLlmjNnTr7tExMTlZ2d7c5XHD+fAEofZ4IAlJr27dsrIiJCgwcP1qOPPirDMPTll1+W6mVHFzJ69Gj98ssv6tChgx566CH3L9OXX3651qxZc95tGzVqpLp16+qpp57S/v37FRYWpqlTp17S2JK+ffuqQ4cOeu6557R79241btxY06ZNu+jxMiEhIerXr597XFDuS+Ek6brrrtO0adPUv39/XXvttdq1a5c+/PBDNW7cWCkpKRd1rJzPOxo7dqyuu+469enTR6tXr9bs2bPznN3JOe6YMWN09913q3379lq/fr2+/vrrPGeQJKlu3bqqUKGCPvzwQ4WGhio4OFht27YtcJxK37591a1bN73wwgvavXu3mjdvrl9++UUzZ87UiBEj8kyCUBzmz5+v9PT0fMv79eunoUOHauLEiRoyZIhWrlypWrVqacqUKVq2bJnee+8995mq++67T8ePH1f37t1VvXp1xcfHa9y4cbriiivc44caN26srl27qmXLlqpYsaL++usvTZkyRcOHDy9S7ldffVVz585Vx44d9fDDD8vHx0cTJ05URkaG3nrrrSK/Htdcc42qVKmiDh06KDo6Wps2bdL48eN17bXXur/fN954QwsXLlTbtm11//33q3Hjxjp+/LhWrVqlefPm6fjx45JckzGMHz9ed911l1auXKmqVavqyy+/LPCDl3v16qWdO3fqmWee0dKlS7V06VL3c9HR0e5pxAvzWj/99NP68ccfdd1112nIkCFq2bKlUlNTtX79ek2ZMkW7d+9WZGRksf18ArBA6U9IB6A8OdcU2eeaInfZsmXmVVddZQYGBprVqlUzn3nmGXPOnDn5prs91xTZBU1HrLOmbD7XFNnDhg3Lt23NmjXzTNlsmqY5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X1RWVpYk15mYl19+WWvXrpVhGDIMw5357Mvh1q9fr+7duyswMFCVKlXS0KFDlZKS4n5+yJAh6tevn9555x1VrVpVlSpV0rBhw9zHKoo9e/bohhtuUEhIiMLCwnTzzTfr8OEzsySvXbtW3bp1U2hoqMLCwtSyZUv99ddfkqT4+Hj17dtXERERCg4OVpMmTTRr1qwiZykMnxLdO9QjNlq/bDysBZsP67Ee9a2OAwAAUHqy0qTXq1lz7OcPSH7BF1zNx8dHd911lz777DO98MILMgxDkvTDDz/I4XDotttuU0pKilq2bKlnn31WYWFh+t///qc777xTdevWVZs2bS54DKfTqQEDBig6Olp//PGHkpKS8owfyhEaGqrPPvtM1apV0/r163X//fcrNDRUzzzzjG655RZt2LBBP//8s+bNmydJCg8Pz7eP1NRU9ezZU+3atdOKFSuUkJCg++67T8OHD89T9BYuXKiqVatq4cKF2r59u2655RZdccUVuv/++y/4/RT0/eUUoMWLFys7O1vDhg3TLbfcokWLFkmSBg0apBYtWmjChAmy2+1as2aNfH19Jbk+NzQzM1O//vqrgoODtXHjRoWEhFx0jotBCSphXRtFSZLW7ktSwsl0VQ4t3HTgAAAAKB333HOP3n77bS1evFhdu3aV5LoUbuDAge7Pp3zqqafc6z/yyCOaM2eOvv/++0KVoHnz5mnz5s2aM2eOqlVzlcLXX3893zief/zjH+77tWrV0lNPPaVvv/1WzzzzjAIDAxUSEiIfHx9VqVLlnMeaPHmy0tPT9cUXXyg42FUCx48fr759++rNN99UdLRrzHpERITGjx8vu92uRo0a6dprr9X8+fOLVILmz5+v9evXa9euXe7P8fziiy/UpEkTrVixQq1bt9aePXv09NNPq1GjRpKk+vXPnBzYs2ePBg4cqKZNm0qS6tSpc9EZLhYlqIRVDg1Q8+rhWrsvSYs2H9HNrT33A14BAACKlW+Q64yMVccupEaNGql9+/b673//q65du2r79u1asmSJxowZI0lyOBx6/fXX9f3332v//v3KzMxURkZGocf8bNq0STExMe4CJEnt2rXLt953332n999/Xzt27FBKSoqys7Mv+iNhNm3apObNm7sLkCR16NBBTqdTW7ZscZegJk2a5JmNuWrVqlq/fv1FHSv3MWNiYtwFSJIaN26sChUqaNOmTWrdurWeeOIJ3Xffffryyy/Vo0cP3XTTTapbt64k6dFHH9VDDz2kX375RT169NDAgQOLNA7rYnjUmKDyqnsj15tt/ubDF1gTAACgHDEM1yVpVtxOX9ZWWPfee6+mTp2qkydPatKkSapbt666dOkiSXr77bf173//W88++6wWLlyoNWvWqGfPnsrMzCy2l2r58uUaNGiQ+vTpo59++kmrV6/WCy+8UKzHyC3nUrQchmHI6XSWyLEk18x2f//9t6699lotWLBAjRs31vTp0yVJ9913n3bu3Kk777xT69evV6tWrTRu3LgSyyJRgkpFXKzr84KWbDuqjOz8HwILAAAAa918882y2WyaPHmyvvjiC91zzz3u8UHLli3TDTfcoDvuuEPNmzdXnTp1tHXr1kLvOzY2Vnv37tXBgwfdy37//fc86/z222+qWbOmXnjhBbVq1Ur169dXfHx8nnX8/PzkcJz/d8nY2FitXbtWqamp7mXLli2TzWZTw4YNC535YuR8f3v37nUv27hxoxITE9W4cWP3sgYNGujxxx/XL7/8ogEDBmjSpEnu52JiYvTggw9q2rRpevLJJ/Xxxx+XSNYclKBS0KRamKLD/JWW6dAfO49bHQcAAABnCQkJ0S233KKRI0fq4MGDGjJkiPu5+vXra+7cufrtt9+0adMmPfDAA3lmPruQHj16qEGDBho8eLDWrl2rJUuW6IUXXsizTv369bVnzx59++232rFjh95//333mZIctWrV0q5du7RmzRodPXpUGRkZ+Y41aNAgBQQEaPDgwdqwYYMWLlyoRx55RHfeeaf7UriicjgcWrNmTZ7bpk2b1KNHDzVt2lSDBg3SqlWr9Oeff+quu+5Sly5d1KpVK506dUrDhw/XokWLFB8fr2XLlmnFihWKjY2VJI0YMUJz5szRrl27tGrVKi1cuND9XEmhBJUCwzDUvZHrbNCCzUyVDQAA4InuvfdenThxQj179swzfucf//iHrrzySvXs2VNdu3ZVlSpV1K9fv0Lv12azafr06Tp16pTatGmj++67T6+99lqeda6//no9/vjjGj58uK644gr99ttvevHFF/OsM3DgQPXq1UvdunVTVFRUgdN0BwUFac6cOTp+/Lhat26tG2+8UXFxcRo/fvzFvRgFSElJUYsWLfLc+vbtK8MwNHPmTEVERKhz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CLA6DryA0+lUq1at9Prrr0uSWrRooQ0bNujDDz+kBKHYff/99/r66681efJkNWnSRGvWrNGIESNUrVo13m/lHCXoEkVGRsput+vw4cN5lh8+fFhVqlSxKBW8wfDhw/XTTz/p119/VfXq1a2Og3Jq5cqVSkhI0JVXXule5nA49Ouvv2r8+PHKyMiQ3W63MCHKm6pVq6px48Z5lsXGxmrq1KkWJUJ59vTTT+u5557TrbfeKklq2rSp4uPjNXbsWEpQOceYoEvk5+enli1bav78+e5lTqdT8+fPV7t27SxMhvLKNE0NHz5c06dP14IFC1S7dm2rI6Eci4uL0/r167VmzRr3rVWrVho0aJDWrFlDAUKx69ChQ75p/7du3aqaNWtalAjlWVpammy2vL8O2+12OZ1OixKhtHAmqBg88cQTGjx4sFq1aqU2bdrovffeU2pqqu6++26ro6EcGjZsmCZPnqyZM2cqNDRUhw4dkiSFh4crMDDQ4nQob0JDQ/ONNwsODlalSpUYh4YS8fjjj6t9+/Z6/fXXdfPNN+vPP//URx99pI8++sjqaCiH+vbtq9dee001atRQkyZNtHr1av3rX//SPffcY3U0lDCmyC4m48eP19tvv61Dhw7piiuu0Pvvv6+2bdtaHQvlkGEYBS6fNGmShgwZUrph4JW6du3KFNkoUT/99JNGjhypbdu2qXbt2nriiSd0//33Wx0L5dDJkyf14osvavr06UpISFC1atV02223adSoUfLz87M6HkoQJQgAAACAV2FMEAAAAACvQgkCAAAA4FUoQQAAAAC8CiUIAAAAgFehBAEAAADwKpQgAAAAAF6FEgQAAADAq1CCAAAAAHgVShAAwGsYhqEZM2ZYHQMAYDFKEACgVAwZMkSGYeS79erVy+poAAAv42N1AACA9+jVq5cmTZqUZ5m/v79FaQAA3oozQQCAUuPv768qVarkuUVEREhyXao2YcIE9e7dW4GBgapTp46mTJmSZ/v169ere/fuCgwMVKVKlTR06FClpKTkWee///2vmjRpIn9/f1WtWlXDhw/P8/zRo0fVv39/BQUFqX79+vrxxx/dz504cUKDBg1SVFSUAgMDVb9+/XylDQBQ9lGCAAAe48UXX9TAgQO1du1aDRo0SLfeeqs2bdokSUpNTVXPnj0VERGhFStW6IcfftC8efPylJwJEyZo2LBhGjp0qNavX68ff/xR9erVy3OMl19+WTfffLPWrVunPn36aNCgQTp+/Lj7+Bs3btTs2bO1adMmTZgwQZGRkaX3AgAASoVhmqZpdQgAQPk3ZMgQffXVVwoICMiz/Pnnn9fzzz8vwzD04IMPasKECe7nrrrqKl155ZX64IMP9PHHH+vZZ5/V3r17FRwcLEmaNWuW+vbtqwMHDig6OlqXXXaZ7r77br366qsFZjAMQ//4xz/0yiuvSHIVq5CQEM2ePVu9evXS9ddfr8jISP33v/8toVcBAOAJGBMEACg13bp1y1NyJKlixYru++3atcvzXLt27bRmzRpJ0qZNm9S8eXN3AZKkDh06yOl0asuWLTIMQwcOHFBcXNx5MzRr1sx9Pzg4WGFhYUpISJAkPfTQQxo4cKBWrVqla665Rv369VP79u2L9L0CADwXJQgAUGqCg4PzXZ5WXAIDAwu1nq+vb57HhmHI6XRKknr37q34+HjNmjVLc+fOVVxcnIYNG6Z33nmn2PMCAKzDmCAAgMf4/fff8z2OjY2VJMXGxmrt2rVKTU11P79s2TLZbDY1bNhQoaGhqlWrlubPn39JGaKiojR48GB99dVXeu+99/TRRx9d0v4AAJ6HM0EAgFKTkZGhQ4cO5Vnm4+Pjnnzghx9+UKtWrdSxY0d9/fXX+vPPP/Xpp59KkgYNGqSXXnpJgwcP1ujRo3XkyBE98sgjuvPOOxUdHS1JGj16tB588EFVrlxZvXv31smTJ7Vs2TI98sgjhco3atQotWzZUk2aNFFGRoZ++ukndwkDAJQflCAAQKn5+eefVbVq1TzLGjZsqM2bN0tyzdz27bff6uGHH1bVqlX1zTffqHHjxpKkoKAgzZkzR4899phat26toKAgDRw4UP/617/c+xo8eLDS09P17rvv6qmnnlJkZKRuvPHGQufz8/PTyJEjtXv3bgUGBqpTp0769ttvi+E7BwB4EmaHAwB4BMMwNH36dPXr18/qKACAco4xQQAAAAC8CiUIAAAAgFdhTBAAwCNwdTYAoLRwJggAAACAV6EEAQAAAPAqlCAAAAAAXoUSBAAAAMCrUIIAAAAAeBVKEAAAAACvQgkCAAAA4FUoQQAAAAC8yv8D7RuF3U+kXuwAAAAASUVORK5CYII=\n",
434
+ "text/plain": [
435
+ "<Figure size 1000x500 with 1 Axes>"
436
+ ]
437
+ },
438
+ "metadata": {},
439
+ "output_type": "display_data"
440
+ }
441
+ ],
442
+ "source": [
443
+ "\n",
444
+ "\n",
445
+ "# Plot the training and validation loss\n",
446
+ "def plot_losses(train_losses, val_losses):\n",
447
+ " plt.figure(figsize=(10, 5))\n",
448
+ " plt.plot(train_losses, label='Training Loss')\n",
449
+ " plt.plot(val_losses, label='Validation Loss')\n",
450
+ " plt.xlabel('Epochs')\n",
451
+ " plt.ylabel('Loss')\n",
452
+ " plt.legend()\n",
453
+ " plt.title('Training and Validation Loss for seq2seq')\n",
454
+ " plt.show()\n",
455
+ "\n",
456
+ "plot_losses(train_losses, val_losses)"
457
+ ]
458
+ },
459
+ {
460
+ "cell_type": "code",
461
+ "execution_count": 28,
462
+ "metadata": {
463
+ "colab": {
464
+ "base_uri": "https://localhost:8080/"
465
+ },
466
+ "id": "w4FDUt1Vshjm",
467
+ "outputId": "540d70b3-62f1-44f5-fab0-0c5cb9285578"
468
+ },
469
+ "outputs": [
470
+ {
471
+ "name": "stdout",
472
+ "output_type": "stream",
473
+ "text": [
474
+ "Original: This is a test sentence.\n",
475
+ "Translated: <s> gefðu þrjú ráð halda heilsu borðaðu hollt næringarríkt mataræði gakktu máltíðirnar þínar innihaldi margs konar ávexti grænmeti magurt prótein heilkorn holla fitu þetta veita líkamanum nauðsynleg næringarefni virka best hjálpað koma veg langvinna sjúkdóma taktu þátt reglulegri hreyfing mikilvæg viðhalda sterkum beinum vöðvum hjarta æðaheilbrigði minnsta kosti 150 hóflegri þolþjálfun 75 öflugri viku fáðu fá gæðasvefn skiptir sköpum andlega vellíðan stjórna skapi bæta vitræna virkni heilbrigðan vöxt ónæmisvirkni 79 nóttu hverjir gulur þessir litir kallaðir blanda öðrum litum alla aðra liti sameina ýmsum hlutföllum auklitakerfinu notað ljós grænn rgb byggingu atóm grunnbygging alls efnis samsett þremur tegundum agna rafeindum lýsa má uppbyggingu miðjunni umkringdur rafeindaskýi kjarni gerður róteindir jákvætt nifteindir hlutlausar án hleðslu báðar þessar staðsettar miðju inniheldur mestan hluta umhverfis rafeindaský rafeindir neikvætt stöðugri kringum kjarnann skipt skeljar svigrúm hver skel geymt ákveðinn ystu skelinni kallast gildisskel efnafræðilega eiginleika hlutlausu atómi kjarnanum jafn þannig jákvæða neikvæða hleðslan jafnast atómið hefur enga heildarhleðslu einnig kallaður atómnúmer hvaða frumeind hvernig getum dregið meðal orkunotkun spara orku minnkum magn losnar virkjunum þessu orkusparandi tæki lýsingu einangra slökkva ljósum rafeindabúnaði þau notaðu bílar vörubílar helstu uppsprettur hjólreiðar fækka bílum veginum aftur dregur útblæstri ábyrgur úrgangi úrgangur brenndur niðurbrotinn hann skaðlegar lofttegundir fargaðu spilliefnum réttan endurvinna plast pappír gler mögulegt 4 orkugjafa endurnýjanlegir orkugjafar sólar vindorka valda lítilli engri styðjið orkufyrirtæki verkefni íhugið setja upp endurnýjanleg orkukerfi þínu 5 akið ef þarft skaltu ganga bílnum sé vel haldið forðast hraða hröðun hemlun lausagangi 6 meðvitaður vöruval sumar venjur gefa sér meiri en aðrar veldu umhverfisvænum umbúðum reyndu lágmarka þína úðabrúsa skaðleg þurftir erfiða ai aðstoðarmaður hef eigin persónulegu reynslu tilvist hins vegar forritaður ákvarðanir byggðar reikniritum rökfræði gögnum tímar lendi aðstæðum erfitt geta verið misvísandi upplýsingar margar mögulegar niðurstöður slíkum tilfellum hæfileika greina vega áhættu ávinning hvers valkosts komast niðurstöðu líklegast tilætluðum árangri\n"
476
+ ]
477
+ }
478
+ ],
479
+ "source": [
480
+ "# Translate a new sentence\n",
481
+ "def translate_new_sentence(model, en_sentence, en_vocab, ic_vocab, max_len=MAX_LEN):\n",
482
+ " model.eval()\n",
483
+ " en_tensor = sentence_to_tensor(en_sentence, en_vocab, max_len).unsqueeze(0).to(DEVICE)\n",
484
+ "\n",
485
+ " # Start with the <s> token as input to the decoder\n",
486
+ " ic_input = torch.tensor([ic_vocab['<s>']]).unsqueeze(0).to(DEVICE)\n",
487
+ "\n",
488
+ " translated_sentence = []\n",
489
+ " with torch.no_grad():\n",
490
+ " for _ in range(max_len):\n",
491
+ " output = model(en_tensor, ic_input)\n",
492
+ " output_token = output.argmax(dim=-1)[:, -1].item() # Get the most likely next token\n",
493
+ "\n",
494
+ " translated_sentence.append(output_token)\n",
495
+ " if output_token == ic_vocab['</s>']: # End token\n",
496
+ " break\n",
497
+ "\n",
498
+ " # Update the input for the next time step (use the predicted token)\n",
499
+ " ic_input = torch.tensor([output_token]).unsqueeze(0).to(DEVICE) # Convert output_token to tensor\n",
500
+ "\n",
501
+ " # Convert token IDs back to words\n",
502
+ " translated_sentence = [k for k, v in ic_vocab.items() if v in translated_sentence]\n",
503
+ " return \" \".join(translated_sentence)\n",
504
+ "\n",
505
+ "# Example sentence translation\n",
506
+ "en_example_sentence = \"This is a test sentence.\"\n",
507
+ "translated_ic_sentence = translate_new_sentence(model, en_example_sentence, en_vocab, ic_vocab)\n",
508
+ "print(f\"Original: {en_example_sentence}\")\n",
509
+ "print(f\"Translated: {translated_ic_sentence}\")\n"
510
+ ]
511
+ },
512
+ {
513
+ "cell_type": "code",
514
+ "execution_count": null,
515
+ "metadata": {
516
+ "id": "YbfHsa5PpW8G"
517
+ },
518
+ "outputs": [],
519
+ "source": []
520
+ },
521
+ {
522
+ "cell_type": "code",
523
+ "execution_count": null,
524
+ "metadata": {
525
+ "id": "N93ucaxdpW_d"
526
+ },
527
+ "outputs": [],
528
+ "source": []
529
+ },
530
+ {
531
+ "cell_type": "code",
532
+ "execution_count": null,
533
+ "metadata": {
534
+ "id": "NWPzmQ3zpXCi"
535
+ },
536
+ "outputs": [],
537
+ "source": []
538
+ },
539
+ {
540
+ "cell_type": "code",
541
+ "execution_count": null,
542
+ "metadata": {
543
+ "id": "HCxdDaispXHV"
544
+ },
545
+ "outputs": [],
546
+ "source": []
547
+ },
548
+ {
549
+ "cell_type": "code",
550
+ "execution_count": null,
551
+ "metadata": {
552
+ "id": "pHS_C_VTpXKu"
553
+ },
554
+ "outputs": [],
555
+ "source": []
556
+ },
557
+ {
558
+ "cell_type": "code",
559
+ "execution_count": null,
560
+ "metadata": {
561
+ "id": "lNvPqrwPpXNc"
562
+ },
563
+ "outputs": [],
564
+ "source": []
565
+ }
566
+ ],
567
+ "metadata": {
568
+ "colab": {
569
+ "provenance": [],
570
+ "toc_visible": true
571
+ },
572
+ "kernelspec": {
573
+ "display_name": "Python 3",
574
+ "language": "python",
575
+ "name": "python3"
576
+ },
577
+ "language_info": {
578
+ "codemirror_mode": {
579
+ "name": "ipython",
580
+ "version": 3
581
+ },
582
+ "file_extension": ".py",
583
+ "mimetype": "text/x-python",
584
+ "name": "python",
585
+ "nbconvert_exporter": "python",
586
+ "pygments_lexer": "ipython3",
587
+ "version": "3.6.8"
588
+ }
589
+ },
590
+ "nbformat": 4,
591
+ "nbformat_minor": 1
592
+ }
A2_Q9_Google_Colab_for_LSTM_based_translator.ipynb ADDED
@@ -0,0 +1,473 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 4,
6
+ "metadata": {
7
+ "colab": {
8
+ "base_uri": "https://localhost:8080/"
9
+ },
10
+ "id": "SApoUTbo2am6",
11
+ "outputId": "5b6b852f-890d-43d3-8a2c-56fff0a4363b"
12
+ },
13
+ "outputs": [
14
+ {
15
+ "name": "stdout",
16
+ "output_type": "stream",
17
+ "text": [
18
+ "Requirement already satisfied: sacrebleu in /usr/local/lib/python3.10/dist-packages (2.4.3)\n",
19
+ "Requirement already satisfied: portalocker in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (2.10.1)\n",
20
+ "Requirement already satisfied: regex in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (2024.9.11)\n",
21
+ "Requirement already satisfied: tabulate>=0.8.9 in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (0.9.0)\n",
22
+ "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (1.26.4)\n",
23
+ "Requirement already satisfied: colorama in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (0.4.6)\n",
24
+ "Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from sacrebleu) (5.3.0)\n"
25
+ ]
26
+ }
27
+ ],
28
+ "source": [
29
+ "!pip install sacrebleu\n",
30
+ "\n",
31
+ "import torch\n",
32
+ "import torch.nn as nn\n",
33
+ "import torch.optim as optim\n",
34
+ "from torch.utils.data import DataLoader, Dataset\n",
35
+ "import numpy as np\n",
36
+ "import matplotlib.pyplot as plt\n",
37
+ "import sacrebleu\n",
38
+ "import json\n",
39
+ "import csv\n",
40
+ "from collections import Counter"
41
+ ]
42
+ },
43
+ {
44
+ "cell_type": "code",
45
+ "execution_count": 11,
46
+ "metadata": {
47
+ "id": "yQlU_Iua2cKa"
48
+ },
49
+ "outputs": [],
50
+ "source": [
51
+ "DEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
52
+ "\n",
53
+ "\n",
54
+ "# Load the Icelandic_cleaned.json dataset\n",
55
+ "with open('/content/Icelandic_cleaned.json', 'r', encoding='utf-8') as f:\n",
56
+ " data = json.load(f)\n",
57
+ "\n",
58
+ "# Extract the first 1,000 English and Icelandic sentences for BLEU and CHRF calculation\n",
59
+ "en_sentences = [entry['input'] for entry in data[:1000]]\n",
60
+ "ic_sentences = [entry['output'] for entry in data[:1000]]\n",
61
+ "\n",
62
+ "# Tokenizer and Vectorization\n",
63
+ "tokenizer = lambda x: x.split()\n",
64
+ "\n",
65
+ "def build_vocab(sentences):\n",
66
+ " counter = Counter()\n",
67
+ " for sentence in sentences:\n",
68
+ " counter.update(tokenizer(sentence))\n",
69
+ " return counter\n",
70
+ "\n",
71
+ "en_vocab = build_vocab(en_sentences)\n",
72
+ "ic_vocab = build_vocab(ic_sentences)\n",
73
+ "\n",
74
+ "# Adding special tokens\n",
75
+ "en_vocab = {'<s>': 1, '</s>': 2, '<pad>': 0, '<unk>': 3, **en_vocab}\n",
76
+ "ic_vocab = {'<s>': 1, '</s>': 2, '<pad>': 0, '<unk>': 3, **ic_vocab}\n",
77
+ "\n",
78
+ "def sentence_to_tensor(sentence, vocab, max_len=MAX_LEN):\n",
79
+ " tokens = tokenizer(sentence)\n",
80
+ " indices = [vocab.get(token, vocab['<unk>']) for token in tokens]\n",
81
+ " indices = [vocab['<s>']] + indices + [vocab['</s>']]\n",
82
+ " if len(indices) < max_len:\n",
83
+ " indices += [vocab['<pad>']] * (max_len - len(indices))\n",
84
+ " else:\n",
85
+ " indices = indices[:max_len]\n",
86
+ " return torch.tensor(indices)\n",
87
+ "\n",
88
+ "VOCAB_SIZE = 10000\n",
89
+ "EMBEDDING_DIM = 256\n",
90
+ "HIDDEN_DIM = 512\n",
91
+ "BATCH_SIZE = 32\n",
92
+ "NUM_EPOCHS = 10\n",
93
+ "MAX_LEN = 50\n",
94
+ "\n",
95
+ "# Prepare dataset and dataloaders\n",
96
+ "en_tensor_sentences = [sentence_to_tensor(s, en_vocab) for s in en_sentences]\n",
97
+ "ic_tensor_sentences = [sentence_to_tensor(s, ic_vocab) for s in ic_sentences]\n",
98
+ "\n",
99
+ "# Split data into training and validation sets (80% train, 20% validation)\n",
100
+ "train_size = int(0.8 * len(en_tensor_sentences))\n",
101
+ "train_en, val_en = en_tensor_sentences[:train_size], en_tensor_sentences[train_size:]\n",
102
+ "train_ic, val_ic = ic_tensor_sentences[:train_size], ic_tensor_sentences[train_size:]\n"
103
+ ]
104
+ },
105
+ {
106
+ "cell_type": "code",
107
+ "execution_count": 6,
108
+ "metadata": {
109
+ "id": "-cSiMFUW2wFf"
110
+ },
111
+ "outputs": [],
112
+ "source": [
113
+ "# Custom Dataset\n",
114
+ "class TranslationDataset(Dataset):\n",
115
+ " def __init__(self, en_sentences, ic_sentences):\n",
116
+ " self.en_sentences = en_sentences\n",
117
+ " self.ic_sentences = ic_sentences\n",
118
+ "\n",
119
+ " def __len__(self):\n",
120
+ " return len(self.en_sentences)\n",
121
+ "\n",
122
+ " def __getitem__(self, idx):\n",
123
+ " return self.en_sentences[idx], self.ic_sentences[idx]\n",
124
+ "\n",
125
+ "# Prepare dataloader\n",
126
+ "train_dataset = TranslationDataset(train_en, train_ic)\n",
127
+ "val_dataset = TranslationDataset(val_en, val_ic)\n",
128
+ "\n",
129
+ "# Define a collate_fn to pad sequences dynamically\n",
130
+ "def collate_fn(batch):\n",
131
+ " en_batch, ic_batch = zip(*batch)\n",
132
+ " en_batch = torch.stack(en_batch, dim=0)\n",
133
+ " ic_batch = torch.stack(ic_batch, dim=0)\n",
134
+ " return en_batch, ic_batch\n",
135
+ "\n",
136
+ "train_dataloader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, collate_fn=collate_fn)\n",
137
+ "val_dataloader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False, collate_fn=collate_fn)"
138
+ ]
139
+ },
140
+ {
141
+ "cell_type": "code",
142
+ "execution_count": 7,
143
+ "metadata": {
144
+ "id": "-dgY3hG521B1"
145
+ },
146
+ "outputs": [],
147
+ "source": [
148
+ "# LSTM Model\n",
149
+ "class LSTMModel(nn.Module):\n",
150
+ " def __init__(self, input_dim, output_dim, embedding_dim, hidden_dim, num_layers=1):\n",
151
+ " super(LSTMModel, self).__init__()\n",
152
+ "\n",
153
+ " self.encoder_embedding = nn.Embedding(input_dim, embedding_dim)\n",
154
+ " self.encoder_lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers, batch_first=True)\n",
155
+ "\n",
156
+ " self.decoder_embedding = nn.Embedding(output_dim, embedding_dim)\n",
157
+ " self.decoder_lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers, batch_first=True)\n",
158
+ " self.fc_out = nn.Linear(hidden_dim, output_dim)\n",
159
+ "\n",
160
+ " def forward(self, src, trg):\n",
161
+ " embedded_src = self.encoder_embedding(src)\n",
162
+ " encoder_output, (hidden, cell) = self.encoder_lstm(embedded_src)\n",
163
+ "\n",
164
+ " embedded_trg = self.decoder_embedding(trg)\n",
165
+ " decoder_output, _ = self.decoder_lstm(embedded_trg, (hidden, cell))\n",
166
+ "\n",
167
+ " output = self.fc_out(decoder_output)\n",
168
+ " return output\n",
169
+ "\n",
170
+ "# Initialize the LSTM model\n",
171
+ "model = LSTMModel(len(en_vocab), len(ic_vocab), EMBEDDING_DIM, HIDDEN_DIM, num_layers=1).to(DEVICE)\n"
172
+ ]
173
+ },
174
+ {
175
+ "cell_type": "code",
176
+ "execution_count": 8,
177
+ "metadata": {
178
+ "colab": {
179
+ "base_uri": "https://localhost:8080/"
180
+ },
181
+ "id": "tA4A8Lfp0l1c",
182
+ "outputId": "d45efe1a-ff8f-40da-d276-c7089b7b9333"
183
+ },
184
+ "outputs": [
185
+ {
186
+ "name": "stdout",
187
+ "output_type": "stream",
188
+ "text": [
189
+ "Epoch 1/10, Training Loss: 4.24646101474762, Validation Loss: 1.915126085281372\n",
190
+ "Epoch 2/10, Training Loss: 1.1425018000602722, Validation Loss: 0.5995665192604065\n",
191
+ "Epoch 3/10, Training Loss: 0.3298293137550354, Validation Loss: 0.16065824457577296\n",
192
+ "Epoch 4/10, Training Loss: 0.09441208809614182, Validation Loss: 0.05612730234861374\n",
193
+ "Epoch 5/10, Training Loss: 0.038212009370326996, Validation Loss: 0.029360934027603695\n",
194
+ "Epoch 6/10, Training Loss: 0.022309018671512602, Validation Loss: 0.01924761331507138\n",
195
+ "Epoch 7/10, Training Loss: 0.015515815429389478, Validation Loss: 0.014102236367762089\n",
196
+ "Epoch 8/10, Training Loss: 0.011751469224691391, Validation Loss: 0.011091723372893674\n",
197
+ "Epoch 9/10, Training Loss: 0.009352730493992567, Validation Loss: 0.00901335131909166\n",
198
+ "Epoch 10/10, Training Loss: 0.0077053593099117275, Validation Loss: 0.007507234279598508\n"
199
+ ]
200
+ }
201
+ ],
202
+ "source": [
203
+ "# Define the loss function and optimizer\n",
204
+ "criterion = nn.CrossEntropyLoss(ignore_index=ic_vocab['<pad>'])\n",
205
+ "optimizer = optim.Adam(model.parameters(), lr=0.001)\n",
206
+ "\n",
207
+ "# Function to train the model\n",
208
+ "def train_model(model, train_dataloader, val_dataloader, optimizer, criterion, num_epochs=10):\n",
209
+ " model.to(DEVICE)\n",
210
+ " train_losses, val_losses = [], []\n",
211
+ "\n",
212
+ " for epoch in range(num_epochs):\n",
213
+ " model.train()\n",
214
+ " epoch_train_loss = 0\n",
215
+ " for en_batch, ic_batch in train_dataloader:\n",
216
+ " en_batch, ic_batch = en_batch.to(DEVICE), ic_batch.to(DEVICE)\n",
217
+ " ic_batch = ic_batch.long()\n",
218
+ "\n",
219
+ " optimizer.zero_grad()\n",
220
+ " output = model(en_batch, ic_batch)\n",
221
+ "\n",
222
+ " output_dim = output.shape[-1]\n",
223
+ " output = output.reshape(-1, output_dim)\n",
224
+ " ic_batch = ic_batch.reshape(-1)\n",
225
+ " loss = criterion(output, ic_batch)\n",
226
+ "\n",
227
+ " loss.backward()\n",
228
+ " optimizer.step()\n",
229
+ "\n",
230
+ " epoch_train_loss += loss.item()\n",
231
+ "\n",
232
+ " train_losses.append(epoch_train_loss / len(train_dataloader))\n",
233
+ "\n",
234
+ " model.eval()\n",
235
+ " epoch_val_loss = 0\n",
236
+ " with torch.no_grad():\n",
237
+ " for en_batch, ic_batch in val_dataloader:\n",
238
+ " en_batch, ic_batch = en_batch.to(DEVICE), ic_batch.to(DEVICE)\n",
239
+ " ic_batch = ic_batch.long()\n",
240
+ "\n",
241
+ " output = model(en_batch, ic_batch)\n",
242
+ " output_dim = output.shape[-1]\n",
243
+ " output = output.reshape(-1, output_dim)\n",
244
+ " ic_batch = ic_batch.reshape(-1)\n",
245
+ "\n",
246
+ " loss = criterion(output, ic_batch)\n",
247
+ " epoch_val_loss += loss.item()\n",
248
+ "\n",
249
+ " val_losses.append(epoch_val_loss / len(val_dataloader))\n",
250
+ "\n",
251
+ " print(f'Epoch {epoch+1}/{num_epochs}, Training Loss: {train_losses[-1]}, Validation Loss: {val_losses[-1]}')\n",
252
+ "\n",
253
+ " return train_losses, val_losses\n",
254
+ "\n",
255
+ "train_losses, val_losses = train_model(model, train_dataloader, val_dataloader, optimizer, criterion, num_epochs=NUM_EPOCHS)\n",
256
+ "\n",
257
+ "# Save the trained model\n",
258
+ "torch.save(model.state_dict(), 'lstm_Icendanic_model.pth')\n",
259
+ "\n",
260
+ "\n"
261
+ ]
262
+ },
263
+ {
264
+ "cell_type": "code",
265
+ "execution_count": 13,
266
+ "metadata": {
267
+ "colab": {
268
+ "base_uri": "https://localhost:8080/",
269
+ "height": 564
270
+ },
271
+ "id": "QZfm6mkBKtGq",
272
+ "outputId": "c6d0d436-cd99-4aad-fe29-e823217011a3"
273
+ },
274
+ "outputs": [
275
+ {
276
+ "data": {
277
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9wAAAIjCAYAAADx4xNlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABz8UlEQVR4nO3dd3hUZd7G8fvMpFdCSKihd6Q3AUGQoICiIDZEBeuqYNdXsCBiYS27i8KK6Lpgww7ooogBAQVFUARRegud0FIhbea8f0wyZEiAJCQ5M8n3c11z5cxz2m+GSfSe8zzPMUzTNAUAAAAAAMqUzeoCAAAAAACojAjcAAAAAACUAwI3AAAAAADlgMANAAAAAEA5IHADAAAAAFAOCNwAAAAAAJQDAjcAAAAAAOWAwA0AAAAAQDkgcAMAAAAAUA4I3ABQSY0ePVoNGzYs1b4TJ06UYRhlW5CX2bVrlwzD0KxZsyr83IZhaOLEie7ns2bNkmEY2rVr1zn3bdiwoUaPHl2m9ZzPZwUlt3XrVl166aWKjIyUYRiaN2+e1SUBAMoJgRsAKphhGMV6LF261OpSq7z7779fhmFo27ZtZ9zmySeflGEY+uOPPyqwspLbv3+/Jk6cqLVr11pdilv+lx6vvvqq1aVUqFGjRmn9+vV64YUX9P7776tLly7ldq4zvcd9+/Yt1t+h/C+GsrOz9dprr6ljx46KiIhQtWrV1KZNG911113atGmT+7j5Xx4ZhqHly5cXqsc0TcXFxckwDF1xxRXl9roBwFv4WV0AAFQ177//vsfz9957TwkJCYXaW7VqdV7nefvtt+V0Oku171NPPaVx48ad1/krg5EjR2rq1KmaPXu2JkyYUOQ2H330kdq2bat27dqV+jw333yzbrjhBgUGBpb6GOeyf/9+Pfvss2rYsKE6dOjgse58PisomZMnT+rnn3/Wk08+qbFjx1pWx5NPPqk77rjD/Xz16tV6/fXX9cQTT3j87cn/XA8fPlwLFizQiBEjdOeddyonJ0ebNm3S/Pnz1bNnT7Vs2dLj+EFBQZo9e7Yuuugij/Zly5Zp79695fpZBwBvQuAGgAp20003eTxfuXKlEhISCrWf7sSJEwoJCSn2efz9/UtVnyT5+fnJz4//RHTv3l1NmzbVRx99VGTg/vnnn7Vz5079/e9/P6/z2O122e328zrG+TifzwpK5vDhw5KkatWqldkxMzIyFBoaWqJ9BgwY4PE8KChIr7/+ugYMGKC+fft6rFu9erXmz5+vF154QU888YTHumnTpik5ObnQ8QcPHqzPPvtMr7/+usffktmzZ6tz5846cuRIieoFAF9Fl3IA8EJ9+/bVBRdcoN9++019+vRRSEiI+390v/zyS11++eWqU6eOAgMD1aRJEz333HNyOBwexzh9XG7BrqVvvfWWmjRposDAQHXt2lWrV6/22LeoMdyGYWjs2LGaN2+eLrjgAgUGBqpNmzb69ttvC9W/dOlSdenSRUFBQWrSpIlmzJhR7HHhP/74o6699lrVr19fgYGBiouL00MPPaSTJ08Wen1hYWHat2+fhg4dqrCwMMXExOjRRx8t9F4kJydr9OjRioyMVLVq1TRq1KgiQ0JRRo4cqU2bNmnNmjWF1s2ePVuGYWjEiBHKzs7WhAkT1LlzZ0VGRio0NFS9e/fWkiVLznmOosZwm6ap559/XvXq1VNISIj69eunv/76q9C+x44d06OPPqq2bdsqLCxMERERGjRokNatW+feZunSperatask6dZbb3V3+c0fv17UGO6MjAw98sgjiouLU2BgoFq0aKFXX31Vpml6bFeSz0VpJSUl6fbbb1fNmjUVFBSk9u3b69133y203ccff6zOnTsrPDxcERERatu2rV577TX3+pycHD377LNq1qyZgoKCFB0drYsuukgJCQkex9m0aZOuueYaVa9eXUFBQerSpYu++uorj22Ke6yCJk6cqAYNGkiSHnvsMRmG4fG+//777xo0aJAiIiIUFham/v37a+XKlR7HyP+sLFu2TPfee69iY2NVr169Yr+XpbF9+3ZJUq9evQqts9vtio6OLtQ+YsQIHT161OP9yM7O1ueff64bb7yx/IoFAC/D5QsA8FJHjx7VoEGDdMMNN+imm25SzZo1Jbn+hzssLEwPP/ywwsLC9P3332vChAlKTU3VK6+8cs7jzp49W2lpafrb3/4mwzD08ssv6+qrr9aOHTvOeaVz+fLlmjNnju69916Fh4fr9ddf1/Dhw7V79273/3T//vvvGjhwoGrXrq1nn31WDodDkyZNUkxMTLFe92effaYTJ07onnvuUXR0tFatWqWpU6dq7969+uyzzzy2dTgcuuyyy9S9e3e9+uqrWrRokf7xj3+oSZMmuueeeyS5gutVV12l5cuX6+6771arVq00d+5cjRo1qlj1jBw5Us8++6xmz56tTp06eZz7008/Ve/evVW/fn0dOXJE//nPf9xdbtPS0vTOO+/osssu06pVqwp14z6XCRMm6Pnnn9fgwYM1ePBgrVmzRpdeeqmys7M9ttuxY4fmzZuna6+9Vo0aNdKhQ4c0Y8YMXXzxxdqwYYPq1KmjVq1aadKkSZowYYLuuusu9e7dW5LUs2fPIs9tmqauvPJKLVmyRLfffrs6dOighQsX6rHHHtO+ffv0r3/9y2P74nwuSuvkyZPq27evtm3bprFjx6pRo0b67LPPNHr0aCUnJ+uBBx6QJCUkJGjEiBHq37+/XnrpJUnSxo0btWLFCvc2EydO1OTJk3XHHXeoW7duSk1N1a+//qo1a9a4r/j+9ddf6tWrl+rWratx48YpNDRUn376qYYOHaovvvhCw4YNK/axTnf11VerWrVqeuihhzRixAgNHjxYYWFh7vP27t1bERER+r//+z/5+/trxowZ6tu3r5YtW6bu3bt7HOvee+9VTEyMJkyYoIyMjPN6j88l/0uCDz/8UL169SpW75eGDRuqR48e+uijjzRo0CBJ0oIFC5SSkqIbbrhBr7/+ernWDABewwQAWGrMmDHm6X+OL774YlOS+eabbxba/sSJE4Xa/va3v5khISFmZmamu23UqFFmgwYN3M937txpSjKjo6PNY8eOudu//PJLU5L5v//9z932zDPPFKpJkhkQEGBu27bN3bZu3TpTkjl16lR325AhQ8yQkBBz37597ratW7eafn5+hY5ZlKJe3+TJk03DMMzExESP1yfJnDRpkse2HTt2NDt37ux+Pm/ePFOS+fLLL7vbcnNzzd69e5uSzJkzZ56zpq5du5r16tUzHQ6Hu+3bb781JZkzZsxwHzMrK8tjv+PHj5s1a9Y0b7vtNo92SeYzzzzjfj5z5kxTkrlz507TNE0zKSnJDAgIMC+//HLT6XS6t3viiSdMSeaoUaPcbZmZmR51mabr3zowMNDjvVm9evUZX+/pn5X89+z555/32O6aa64xDcPw+AwU93NRlPzP5CuvvHLGbaZMmWJKMj/44AN3W3Z2ttmjRw8zLCzMTE1NNU3TNB944AEzIiLCzM3NPeOx2rdvb15++eVnral///5m27ZtPX6XnE6n2bNnT7NZs2YlOlZRzvSahw4dagYEBJjbt293t+3fv98MDw83+/Tp427L/6xcdNFFZ32t5zrf6T777DNTkrlkyZJC65xOp/tvUs2aNc0RI0aY//73vz1+H0+vb/Xq1ea0adPM8PBw9+/0tddea/br1880TdNs0KBBqd4/APA1dCkHAC8VGBioW2+9tVB7cHCwezktLU1HjhxR7969deLECY/Zgs/k+uuvV1RUlPt5/tXOHTt2nHPf+Ph4NWnSxP28Xbt2ioiIcO/rcDi0aNEiDR06VHXq1HFv17RpU/dVrnMp+PoyMjJ05MgR9ezZU6Zp6vfffy+0/d133+3xvHfv3h6v5ZtvvpGfn5/7irfk6gZ73333FaseyTXufu/evfrhhx/cbbNnz1ZAQICuvfZa9zEDAgIkSU6nU8eOHVNubq66dOlSZHf0s1m0aJGys7N13333eXTDf/DBBwttGxgYKJvN9Z9zh8Oho0ePKiwsTC1atCjxefN98803stvtuv/++z3aH3nkEZmmqQULFni0n+tzcT6++eYb1apVSyNGjHC3+fv76/7771d6erqWLVsmyTUmOiMj46xduqtVq6a//vpLW7duLXL9sWPH9P333+u6665z/24dOXJER48e1WWXXaatW7dq3759xTpWSTgcDn333XcaOnSoGjdu7G6vXbu2brzxRi1fvlypqake+9x5550VNu7fMAwtXLhQzz//vKKiovTRRx9pzJgxatCgga6//vozDs+47rrrdPLkSc2fP19paWmaP38+3ckBVDkEbgDwUnXr1nUHuIL++usvDRs2TJGRkYqIiFBMTIx7wrWUlJRzHrd+/foez/PD9/Hjx0u8b/7++fsmJSXp5MmTatq0aaHtimoryu7duzV69GhVr17dPS774osvllT49QUFBRXqql6wHklKTExU7dq13V1387Vo0aJY9UjSDTfcILvdrtmzZ0uSMjMzNXfuXA0aNMjjy4t3331X7dq1c4/pjYmJ0ddff12sf5eCEhMTJUnNmjXzaI+JifE4n+QK9//617/UrFkzBQYGqkaNGoqJidEff/xR4vMWPH+dOnUUHh7u0Z4/e3V+ffnO9bk4H4mJiWrWrJn7S4Uz1XLvvfeqefPmGjRokOrVq6fbbrut0DjySZMmKTk5Wc2bN1fbtm312GOPedzObdu2bTJNU08//bRiYmI8Hs8884wk12e8OMcqicOHD+vEiRNFfiZbtWolp9OpPXv2eLQ3atSoVOcqrcDAQD355JPauHGj9u/fr48++kgXXnihPv300zPOth4TE6P4+HjNnj1bc+bMkcPh0DXXXFOhdQOA1QjcAOClCl7pzZecnKyLL75Y69at06RJk/S///1PCQkJ7jGrxbm105muipmnTYZV1vsWh8Ph0IABA/T111/r8ccf17x585SQkOCe3Ov011dRV/hiY2M1YMAAffHFF8rJydH//vc/paWlaeTIke5tPvjgA40ePVpNmjTRO++8o2+//VYJCQm65JJLyvWWWy+++KIefvhh9enTRx988IEWLlyohIQEtWnTpsJu9VXen4viiI2N1dq1a/XVV1+5x58PGjTIY6x+nz59tH37dv33v//VBRdcoP/85z/q1KmT/vOf/0g69fl69NFHlZCQUOQj/4ujcx2rvBX196Gi1K5dWzfccIN++OEHNWvWTJ9++qlyc3OL3PbGG2/UggUL9Oabb2rQoEFlOjs7APgCJk0DAB+ydOlSHT16VHPmzFGfPn3c7Tt37rSwqlNiY2MVFBSkbdu2FVpXVNvp1q9fry1btujdd9/VLbfc4m4/Wzfhc2nQoIEWL16s9PR0j6vcmzdvLtFxRo4cqW+//VYLFizQ7NmzFRERoSFDhrjXf/7552rcuLHmzJnj0Q08/8poSWuWpK1bt3p0MT58+HChq8aff/65+vXrp3feecejPTk5WTVq1HA/L84M8QXPv2jRIqWlpXlc5c4fspBfX0Vo0KCB/vjjDzmdTo+r3EXVEhAQoCFDhmjIkCFyOp269957NWPGDD399NPuoFy9enXdeuutuvXWW5Wenq4+ffpo4sSJuuOOO9zvtb+/v+Lj489Z29mOVRIxMTEKCQkp8jO5adMm2Ww2xcXFleiYFcHf31/t2rXT1q1bdeTIEdWqVavQNsOGDdPf/vY3rVy5Up988okFVQKAtbjCDQA+JP9KYsErh9nZ2XrjjTesKsmD3W5XfHy85s2bp/3797vbt23bVmjc75n2lzxfn2maHrd2KqnBgwcrNzdX06dPd7c5HA5NnTq1RMcZOnSoQkJC9MYbb2jBggW6+uqrFRQUdNbaf/nlF/38888lrjk+Pl7+/v6aOnWqx/GmTJlSaFu73V7oSvJnn33mHmucL/8+zcW5HdrgwYPlcDg0bdo0j/Z//etfMgyj2OPxy8LgwYN18OBBj7CWm5urqVOnKiwszD3c4OjRox772Ww2tWvXTpKUlZVV5DZhYWFq2rSpe31sbKz69u2rGTNm6MCBA4Vqyb+HdnGOVRJ2u12XXnqpvvzyS49bwx06dEizZ8/WRRddpIiIiBIft6xs3bpVu3fvLtSenJysn3/+WVFRUWe8C0FYWJimT5+uiRMnenxBBQBVBVe4AcCH9OzZU1FRURo1apTuv/9+GYah999/v0K77p7LxIkT9d1336lXr16655573MHtggsu0Nq1a8+6b8uWLdWkSRM9+uij2rdvnyIiIvTFF1+c11jgIUOGqFevXho3bpx27dql1q1ba86cOSUe3xwWFqahQ4e6x3EX7E4uSVdccYXmzJmjYcOG6fLLL9fOnTv15ptvqnXr1kpPTy/RufLvJz558mRdccUVGjx4sH7//XctWLDA46p1/nknTZqkW2+9VT179tT69ev14YcfelwZl6QmTZqoWrVqevPNNxUeHq7Q0FB17969yLHAQ4YMUb9+/fTkk09q165dat++vb777jt9+eWXevDBBz0mSCsLixcvVmZmZqH2oUOH6q677tKMGTM0evRo/fbbb2rYsKE+//xzrVixQlOmTHFfgb/jjjt07NgxXXLJJapXr54SExM1depUdejQwT3eu3Xr1urbt686d+6s6tWr69dff9Xnn3/uMQb53//+ty666CK1bdtWd955pxo3bqxDhw7p559/1t69e933Ny/OsUri+eefV0JCgi666CLde++98vPz04wZM5SVlaWXX365VMcs6Gzv8QUXXHDWfdetW6cbb7xRgwYNUu/evVW9enXt27dP7777rvbv368pU6acdXhHcW/BBwCVEYEbAHxIdHS05s+fr0ceeURPPfWUoqKidNNNN6l///667LLLrC5PktS5c2ctWLBAjz76qJ5++mnFxcVp0qRJ2rhx4zlnUff399f//vc/3X///Zo8ebKCgoI0bNgwjR07Vu3bty9VPTabTV999ZUefPBBffDBBzIMQ1deeaX+8Y9/qGPHjiU61siRIzV79mzVrl1bl1xyice60aNH6+DBg5oxY4YWLlyo1q1b64MPPtBnn32mpUuXlrju559/XkFBQXrzzTe1ZMkSde/eXd99950uv/xyj+2eeOIJZWRkaPbs2frkk0/UqVMnff311xo3bpzHdv7+/nr3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AAAAUE4I3BUsOixQnRtESZIWc5UbAAAAACotArcF8ruVf8c4bgAAAAAl0LdvXz344IPu5w0bNtSUKVPOuo9hGJo3b955n7usjlOVELgtEJ93e7CVO44qLTPH4moAAAAAlLchQ4Zo4MCBRa778ccfZRiG/vjjjxIfd/Xq1brrrrvOtzwPEydOVIcOHQq1HzhwQIMGDSrTc51u1qxZqlatWrmeoyIRuC3QJCZMjWuEKsdh6octR6wuBwAAAEA5u/3225WQkKC9e/cWWjdz5kx16dJF7dq1K/FxY2JiFBISUhYlnlOtWrUUGBhYIeeqLAjcFsm/ys1s5QAAAMB5Mk0pO8Oah2kWq8QrrrhCMTExmjVrlkd7enq6PvvsM91+++06evSoRowYobp16yokJERt27bVRx99dNbjnt6lfOvWrerTp4+CgoLUunVrJSQkFNrn8ccfV/PmzRUSEqLGjRvr6aefVk6Oq+ftrFmz9Oyzz2rdunUyDEOGYbhrPr1L+fr163XJJZcoODhY0dHRuuuuu5Senu5eP3r0aA0dOlSvvvqqateurejoaI0ZM8Z9rtLYvXu3rrrqKoWFhSkiIkLXXXedDh06lanWrVunfv36KTw8XBEREercubN+/fVXSVJiYqKGDBmiqKgohYaGqk2bNvrmm29KXUtx+JXr0XFGA1rX1Fs/7ND3m5KU63DKz853HwAAAECp5JyQXqxjzbmf2C8FhJ5zMz8/P91yyy2aNWuWnnzySRmGIUn67LPP5HA4NGLECKWnp6tz5856/PHHFRERoa+//lo333yzmjRpom7dup3zHE6nU1dffbVq1qypX375RSkpKR7jvfOFh4dr1qxZqlOnjtavX68777xT4eHh+r//+z9df/31+vPPP/Xtt99q0aJFkqTIyMhCx8jIyNBll12mHj16aPXq1UpKStIdd9yhsWPHenypsGTJEtWuXVtLlizRtm3bdP3116tDhw668847z/l6inp9+WF72bJlys3N1ZgxY3T99ddr6dKlkqSRI0eqY8eOmj59uux2u9auXSt/f39J0pgxY5Sdna0ffvhBoaGh2rBhg8LCwkpcR0kQuC3SqX6UokL8dfxEjlbvOq4eTaKtLgkAAABAObrtttv0yiuvaNmyZerbt68kV3fy4cOHKzIyUpGRkXr00Ufd2993331auHChPv3002IF7kWLFmnTpk1auHCh6tRxfQHx4osvFhp3/dRTT7mXGzZsqEcffVQff/yx/u///k/BwcEKCwuTn5+fatWqdcZzzZ49W5mZmXrvvfcUGur6wmHatGkaMmSIXnrpJdWs6erRGxUVpWnTpslut6tly5a6/PLLtXjx4lIF7sWLF2v9+vXauXOn4uLiJEnvvfee2rRpo9WrV6tr167avXu3HnvsMbVs2VKS1KxZM/f+u3fv1vDhw9W2bVtJUuPGjUtcQ0kRuC1itxm6pGVNfbFmrxZtPETgBgAAAErLP8R1pdmqcxdTy5Yt1bNnT/33v/9V3759tW3bNv3444+aNGmSJMnhcOjFF1/Up59+qn379ik7O1tZWVnFHqO9ceNGxcXFucO2JPXo0aPQdp988olef/11bd++Xenp6crNzVVERESxX0f+udq3b+8O25LUq1cvOZ1Obd682R2427RpI7vd7t6mdu3aWr9+fYnOVfCccXFx7rAtSa1bt1a1atW0ceNGde3aVQ8//LDuuOMOvf/++4qPj9e1116rJk2aSJLuv/9+3XPPPfruu+8UHx+v4cOHl2rcfEl4TT/mv//97zIMo8guD5XVgNaxklzjuM1ijv0AAAAAcBrDcHXrtuKR1zW8uG6//XZ98cUXSktL08yZM9WkSRNdfPHFkqRXXnlFr732mh5//HEtWbJEa9eu1WWXXabs7Owye6t+/vlnjRw5UoMHD9b8+fP1+++/68knnyzTcxSU3507n2EYcjqd5XIuyTXD+l9//aXLL79c33//vVq3bq25c+dKku644w7t2LFDN998s9avX68uXbpo6tSp5VaL5CWBe/Xq1ZoxY0a5f7vgbXo3i1GAn02JR09oW1L6uXcAAAAA4NOuu+462Ww2zZ49W++9955uu+0293juFStW6KqrrtJNN92k9u3bq3HjxtqyZUuxj92qVSvt2bNHBw4ccLetXLnSY5uffvpJDRo00JNPPqkuXbqoWbNmSkxM9NgmICBADofjnOdat26dMjIy3G0rVqyQzWZTixYtil1zSeS/vj179rjbNmzYoOTkZLVu3drd1rx5cz300EP67rvvdPXVV2vmzJnudXFxcbr77rs1Z84cPfLII3r77bfLpdZ8lgfu9PR0jRw5Um+//baioqKsLqdChQb6qVdeV/IEZisHAAAAKr2wsDBdf/31Gj9+vA4cOKDR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\n",
278
+ "text/plain": [
279
+ "<Figure size 1200x600 with 1 Axes>"
280
+ ]
281
+ },
282
+ "metadata": {},
283
+ "output_type": "display_data"
284
+ }
285
+ ],
286
+ "source": [
287
+ "import matplotlib.pyplot as plt\n",
288
+ "\n",
289
+ "# Set figure size before plotting\n",
290
+ "plt.figure(figsize=(12, 6)) # Adjust the size as desired, e.g., 12x6 inches\n",
291
+ "\n",
292
+ "# Plot training and validation losses\n",
293
+ "plt.plot(train_losses, label=\"Training Loss\")\n",
294
+ "plt.plot(val_losses, label=\"Validation Loss\")\n",
295
+ "plt.xlabel(\"Epochs\")\n",
296
+ "plt.ylabel(\"Loss\")\n",
297
+ "plt.legend()\n",
298
+ "plt.title(\"Training and Validation Losses for LTSM\")\n",
299
+ "plt.show()\n"
300
+ ]
301
+ },
302
+ {
303
+ "cell_type": "code",
304
+ "execution_count": 10,
305
+ "metadata": {
306
+ "colab": {
307
+ "base_uri": "https://localhost:8080/"
308
+ },
309
+ "id": "Tzcfd66K095C",
310
+ "outputId": "9868591d-54a3-494b-ba6d-a18dccaf9ca3"
311
+ },
312
+ "outputs": [
313
+ {
314
+ "name": "stdout",
315
+ "output_type": "stream",
316
+ "text": [
317
+ "BLEU and CHRF scores saved to 'Seq2Seq_BLEU_CHRF_scores.csv'\n"
318
+ ]
319
+ }
320
+ ],
321
+ "source": [
322
+ "def translate_new_sentence(model, sentence, src_vocab, tgt_vocab, max_len=MAX_LEN):\n",
323
+ " # Prepare input tensor for the source sentence (English)\n",
324
+ " model.eval() # Set model to evaluation mode\n",
325
+ " en_indices = [src_vocab.get(word, src_vocab['<unk>']) for word in sentence.split()] # Handle unknown words\n",
326
+ " en_tensor = torch.tensor(en_indices).unsqueeze(0).to(DEVICE)\n",
327
+ "\n",
328
+ " # Initialize target sentence for translation (Icelandic) with start token\n",
329
+ " tgt_tensor = torch.tensor([tgt_vocab['<s>']]).unsqueeze(0).to(DEVICE)\n",
330
+ "\n",
331
+ " translated_sentence = []\n",
332
+ "\n",
333
+ " for _ in range(max_len):\n",
334
+ " with torch.no_grad():\n",
335
+ " output = model(en_tensor, tgt_tensor)\n",
336
+ "\n",
337
+ " # Get the last output token's prediction (the next word)\n",
338
+ " output_token = output.argmax(dim=-1)[:, -1]\n",
339
+ "\n",
340
+ " # Get the predicted word from the target vocabulary\n",
341
+ " output_token_item = output_token.item()\n",
342
+ "\n",
343
+ " # Check if the token is within the target vocabulary range\n",
344
+ " if output_token_item not in tgt_vocab.values():\n",
345
+ " translated_word = '<unk>' # Map to <unk> if not found\n",
346
+ " else:\n",
347
+ " translated_word = list(tgt_vocab.keys())[list(tgt_vocab.values()).index(output_token_item)]\n",
348
+ "\n",
349
+ " # Append predicted word to the translated sentence\n",
350
+ " translated_sentence.append(translated_word)\n",
351
+ "\n",
352
+ " # If we encounter an end token, stop the translation\n",
353
+ " if translated_word == '</s>':\n",
354
+ " break\n",
355
+ "\n",
356
+ " # Update tgt_tensor for next prediction\n",
357
+ " tgt_tensor = torch.cat((tgt_tensor, output_token.unsqueeze(0)), dim=-1)\n",
358
+ "\n",
359
+ " return ' '.join(translated_sentence)\n",
360
+ "\n",
361
+ "# BLEU and CHRF Scores Calculation\n",
362
+ "def calculate_bleu_chrf(en_sentences, ic_sentences, model, en_vocab, ic_vocab, max_len=MAX_LEN):\n",
363
+ " bleu_scores = []\n",
364
+ " chrf_scores = []\n",
365
+ "\n",
366
+ " for en_sentence, ic_sentence in zip(en_sentences, ic_sentences):\n",
367
+ " translated_sentence = translate_new_sentence(model, en_sentence, en_vocab, ic_vocab, max_len)\n",
368
+ "\n",
369
+ " # Calculate BLEU score\n",
370
+ " bleu_score = sacrebleu.corpus_bleu([translated_sentence], [[ic_sentence]]).score\n",
371
+ " bleu_scores.append(bleu_score)\n",
372
+ "\n",
373
+ " # Calculate CHRF score\n",
374
+ " chrf_score = sacrebleu.corpus_chrf([translated_sentence], [[ic_sentence]]).score\n",
375
+ " chrf_scores.append(chrf_score)\n",
376
+ "\n",
377
+ " return bleu_scores, chrf_scores\n",
378
+ "\n",
379
+ "# Calculate BLEU and CHRF for the translation model\n",
380
+ "lstm_bleu_scores, lstm_chrf_scores = calculate_bleu_chrf(en_sentences, ic_sentences, model, en_vocab, ic_vocab, max_len=MAX_LEN)\n",
381
+ "\n",
382
+ "# Save BLEU and CHRF scores to CSV\n",
383
+ "import csv\n",
384
+ "\n",
385
+ "with open('LTSM_BLEU_CHRF_scores.csv', mode='w', newline='', encoding='utf-8') as file:\n",
386
+ " writer = csv.writer(file)\n",
387
+ " writer.writerow([\"BLEU Score\", \"CHRF Score\"])\n",
388
+ " for bleu, chrf in zip(lstm_bleu_scores, lstm_chrf_scores):\n",
389
+ " writer.writerow([bleu, chrf])\n",
390
+ "\n",
391
+ "print(\"BLEU and CHRF scores saved to 'LTSM_BLEU_CHRF_scores.csv'\")\n",
392
+ "\n"
393
+ ]
394
+ },
395
+ {
396
+ "cell_type": "code",
397
+ "execution_count": 3,
398
+ "metadata": {
399
+ "colab": {
400
+ "base_uri": "https://localhost:8080/"
401
+ },
402
+ "id": "nyVtO9D02Qp5",
403
+ "outputId": "1e52fbf8-3a94-4bf7-ab83-bbbb45051124"
404
+ },
405
+ "outputs": [
406
+ {
407
+ "name": "stdout",
408
+ "output_type": "stream",
409
+ "text": [
410
+ "Original: This is a test sentence.\n",
411
+ "Translated: <s> gefðu þrjú ráð halda heilsu borðaðu hollt næringarríkt mataræði gakktu máltíðirnar þínar innihaldi margs konar ávexti grænmeti magurt prótein heilkorn holla fitu þetta veita líkamanum nauðsynleg næringarefni virka best hjálpað koma veg langvinna sjúkdóma taktu þátt reglulegri hreyfing mikilvæg viðhalda sterkum beinum vöðvum hjarta æðaheilbrigði minnsta kosti 150 hóflegri þolþjálfun 75 öflugri viku fáðu fá gæðasvefn skiptir sköpum andlega vellíðan stjórna skapi bæta vitræna virkni heilbrigðan vöxt ónæmisvirkni 79 nóttu hverjir gulur þessir litir kallaðir blanda öðrum litum alla aðra liti sameina ýmsum hlutföllum auklitakerfinu notað ljós grænn rgb byggingu atóm grunnbygging alls efnis samsett þremur tegundum agna rafeindum lýsa má uppbyggingu miðjunni umkringdur rafeindaskýi kjarni gerður róteindir jákvætt nifteindir hlutlausar án hleðslu báðar þessar staðsettar miðju inniheldur mestan hluta umhverfis rafeindaský rafeindir neikvætt stöðugri kringum kjarnann skipt skeljar svigrúm hver skel geymt ákveðinn ystu skelinni kallast gildisskel efnafræðilega eiginleika hlutlausu atómi kjarnanum jafn þannig jákvæða neikvæða hleðslan jafnast atómið hefur enga heildarhleðslu einnig kallaður atómnúmer hvaða frumeind hvernig getum dregið meðal orkunotkun spara orku minnkum magn losnar virkjunum þessu orkusparandi tæki lýsingu einangra slökkva ljósum rafeindabúnaði þau notaðu bílar vörubílar helstu uppsprettur hjólreiðar fækka bílum veginum aftur dregur útblæstri ábyrgur úrgangi úrgangur brenndur niðurbrotinn hann skaðlegar lofttegundir fargaðu spilliefnum réttan endurvinna plast pappír gler mögulegt 4 orkugjafa endurnýjanlegir orkugjafar sólar vindorka valda lítilli engri styðjið orkufyrirtæki verkefni íhugið setja upp endurnýjanleg orkukerfi þínu 5 akið ef þarft skaltu ganga bílnum sé vel haldið forðast hraða hröðun hemlun lausagangi 6 meðvitaður vöruval sumar venjur gefa sér meiri en aðrar veldu umhverfisvænum umbúðum reyndu lágmarka þína úðabrúsa skaðleg þurftir erfiða ai aðstoðarmaður hef eigin persónulegu reynslu tilvist hins vegar forritaður ákvarðanir byggðar reikniritum rökfræði gögnum tímar lendi aðstæðum erfitt geta verið misvísandi upplýsingar margar mögulegar niðurstöður slíkum tilfellum hæfileika greina vega áhættu ávinning hvers valkosts komast niðurstöðu líklegast tilætluðum árangri\n"
412
+ ]
413
+ }
414
+ ],
415
+ "source": [
416
+ "# Translate a new sentence\n",
417
+ "def translate_new_sentence(model, en_sentence, en_vocab, ic_vocab, max_len=MAX_LEN):\n",
418
+ " model.eval()\n",
419
+ " en_tensor = sentence_to_tensor(en_sentence, en_vocab, max_len).unsqueeze(0).to(DEVICE)\n",
420
+ "\n",
421
+ " # Start with the <s> token as input to the decoder\n",
422
+ " ic_input = torch.tensor([ic_vocab['<s>']]).unsqueeze(0).to(DEVICE)\n",
423
+ "\n",
424
+ " translated_sentence = []\n",
425
+ " with torch.no_grad():\n",
426
+ " for _ in range(max_len):\n",
427
+ " output = model(en_tensor, ic_input)\n",
428
+ " output_token = output.argmax(dim=-1)[:, -1].item() # Get the most likely next token\n",
429
+ "\n",
430
+ " translated_sentence.append(output_token)\n",
431
+ " if output_token == ic_vocab['</s>']: # End token\n",
432
+ " break\n",
433
+ "\n",
434
+ " # Update the input for the next time step (use the predicted token)\n",
435
+ " ic_input = torch.tensor([output_token]).unsqueeze(0).to(DEVICE) # Convert output_token to tensor\n",
436
+ "\n",
437
+ " # Convert token IDs back to words\n",
438
+ " translated_sentence = [k for k, v in ic_vocab.items() if v in translated_sentence]\n",
439
+ " return \" \".join(translated_sentence)\n",
440
+ "\n",
441
+ "# Example sentence translation\n",
442
+ "en_example_sentence = \"This is a test sentence.\"\n",
443
+ "translated_ic_sentence = translate_new_sentence(model, en_example_sentence, en_vocab, ic_vocab)\n",
444
+ "print(f\"Original: {en_example_sentence}\")\n",
445
+ "print(f\"Translated: {translated_ic_sentence}\")\n"
446
+ ]
447
+ }
448
+ ],
449
+ "metadata": {
450
+ "colab": {
451
+ "provenance": []
452
+ },
453
+ "kernelspec": {
454
+ "display_name": "Python 3",
455
+ "language": "python",
456
+ "name": "python3"
457
+ },
458
+ "language_info": {
459
+ "codemirror_mode": {
460
+ "name": "ipython",
461
+ "version": 3
462
+ },
463
+ "file_extension": ".py",
464
+ "mimetype": "text/x-python",
465
+ "name": "python",
466
+ "nbconvert_exporter": "python",
467
+ "pygments_lexer": "ipython3",
468
+ "version": "3.6.8"
469
+ }
470
+ },
471
+ "nbformat": 4,
472
+ "nbformat_minor": 1
473
+ }
Colab Links.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ LTSM;;
2
+ https://colab.research.google.com/drive/1U0-d3rWZp_z-p7r3L4yE1vxeS3RL-NfG?usp=sharing
3
+
4
+ Seq2seq
5
+
6
+ https://colab.research.google.com/drive/11mcIrgKqm536dE0vL-5zMg-pPQFnSQG4?usp=sharing