Upload 11 files
Browse files- A2 #Q1 Dataset format.png +0 -0
- A2 #Q2 LSTM Model Class.png +0 -0
- A2 #Q3 Seq-to-Seq Model class.png +0 -0
- A2 #Q4 Training curves.docx +0 -0
- A2 #Q5 BLEU Scores for both LSTM-based model vs Seq-to-seq model (Plot).png +0 -0
- A2 #Q6 BLEU Scores CSV file.csv +1001 -0
- A2 #Q7 Chrf Scores CSV.csv +1001 -0
- A2 #Q8 Chrf Scores for both LSTM-based model vs Seq-to-seq model .png +0 -0
- A2_Q10_Google_Colab_Seq2seq_based_translator_Analysis.ipynb +592 -0
- A2_Q9_Google_Colab_for_LSTM_based_translator.ipynb +473 -0
- Colab Links.txt +6 -0
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+9WZGRksf18ArBA6U9IB6A8OdcU2eeaInfZsmXmVVddZQYGBprVqlUzn3nmGXPOnDn5prs91xTZBU1HrLOmbD7XFNnDhg3Lt23NmjXzTNlsmqY5f/58s0WLFqafn59Zt25d85NPPjGffPJJMyAg4ByvwhkbN240e/ToYYaEhJiRkZHm/fff755yOfd0uYMHDzaDg4PzbV9Q9mPHjpl33nmnGRYWZoaHh5t33nmnuXr16ouegvd///ufKcmsWrVqvmmpnU6n+frrr5s1a9Y0/f39zRYtWpg//fRTvn8H07zwFNmmaZoOh8N8+eWXzapVq5qBgYFm165dzQ0bNuR7vdPT080nn3zSvV6HDh3M5cuXm126dDG7dOmS57gzZ840Gzdu7J6uPOd7LyjjyZMnzccff9ysVq2a6evra9avX998++2380zZnfO9FPZ9cbac9+S5bl9++aVpmqZ5+PBh8+677zYjIyNNPz8/s2nTpvn+3aZMmWJec801ZuXKlU0/Pz+zRo0a5gMPPGAePHjQvc6rr75qtmnTxqxQoYIZGBhoNmrUyHzttdfMzMzMQuUs6Gdn1apVZs+ePc2QkBAzKCjI7Natm/nbb7/lWSfn33fFihXnPU6OiRMnmp07dzYrVapk+vv7m3Xr1jWffvppMykpKc96hw8fNocNG2bGxMSYvr6+ZpUqVcy4uDjzo48+yrNefHy8ef3115tBQUFmZGSk+dhjj7mneM/934zz/Vvkfi8V5rU2Tdd7aOTIkWa9evVMPz8/MzIy0mzfvr35zjvv5HnNi+vnE0DpMkzTg/4ECwAeql+/fsU2PTGAS7No0SJ169ZNCxcuVNeuXa2Ok8/u3btVu3ZtTZo0SUOGDLE6DoACMCYIAM5y6tSpPI+3bdumWbNmeeQvWwAA4OIxJggAzlKnTh0NGTJEderUUXx8vCZMmCA/P79zTpcLAADKFkoQAJylV69e+uabb3To0CH5+/urXbt2ev311/N9+CcAACibGBMEAAAAwKswJggAAACAV6EEAQAAAPAqZXpMkNPp1IEDBxQaGirDMKyOAwAAAMAipmnq5MmTqlatmmy285/rKdMl6MCBA4qJibE6BgAAAAAPsXfvXlWvXv2865TpEhQaGirJ9Y2GhYVZnAYAAACAVZKTkxUTE+PuCOdTpktQziVwYWFhlCAAAAAAhRomw8QIAAAAALwKJQgAAACAV6EEAQAAAPAqZXpMEAAAADyPw+FQVlaW1TFQztjtdvn4+BTLR+NQggAAAFBsUlJStG/fPpmmaXUUlENBQUGqWrWq/Pz8Lmk/lCAAAAAUC4fDoX379ikoKEhRUVF8mD2KjWmayszM1JEjR7Rr1y7Vr1//gh+Iej6UIAAAABSLrKwsmaapqKgoBQYGWh0H5UxgYKB8fX0VHx+vzMxMBQQEFHlfTIwAAACAYsUZIJSUSzn7k2c/xbIXAAAAACgjKEEAAAAAvAolCAAAAChmtWrV0nvvvVfo9RctWiTDMJSYmFhimXAGJQgAAABeyzCM895Gjx5dpP2uWLFCQ4cOLfT67du318GDBxUeHl6k4xUWZcuF2eGKkdPpmg/fZmMwIAAAQFlw8OBB9/3vvvtOo0aN0pYtW9zLQkJC3PdN05TD4ZCPz4V/hY6KirqoHH5+fqpSpcpFbYOi40xQMXlj9mZdNXa+/th13OooAAAAHsE0TaVlZltyK+yHtVapUsV9Cw8Pl2EY7sebN29WaGioZs+erZYtW8rf319Lly7Vjh07dMMNNyg6OlohISFq3bq15s2bl2e/Z18OZxiGPvnkE/Xv319BQUGqX7++fvzxR/fzZ5+h+eyzz1ShQgXNmTNHsbGxCgkJUa9evfKUtuzsbD366KOqUKGCKlWqpGeffVaDBw9Wv379ivxvduLECd11112KiIhQUFCQevfurW3btrmfj4+PV9++fRUREaHg4GA1adJEs2bNcm87aNAg9xTp9evX16RJk4qcpSRxJqiYHDmZoYSTGVqw+bDa1a1kdRwAAADLncpyqPGoOZYce+OYngryK55fdZ977jm98847qlOnjiIiIrR371716dNHr732mvz9/fXFF1+ob9++2rJli2rUqHHO/bz88st666239Pbbb2vcuHEaNGiQ4uPjVbFixQLXT0tL0zvvvKMvv/xSNptNd9xxh5566il9/fXXkqQ333xTX3/9tSZNmqTY2Fj9+9//1owZM9StW7cif69DhgzRtm3b9OOPPyosLEzPPvus+vTpo40bN8rX11fDhg1TZmamfv31VwUHB2vjxo3us2UvvviiNm7cqNmzZysyMlLbt2/XqVOnipylJFGCiklcbGVNXbVP8zcn6IVrG1sdBwAAAMVkzJgxuvrqq92PK1asqObNm7sfv/LKK5o+fbp+/PFHDR8+/Jz7GTJkiG677TZJ0uuvv673339ff/75p3r16lXg+llZWfrwww9Vt25dSdLw4cM1ZswY9/Pjxo3TyJEj1b9/f0nS+PHj3WdliiKn/Cxbtkzt27eXJH399deKiYnRjBkzdNNNN2nPnj0aOHCgmjZtKkmqU6eOe/s9e/aoRYsWatWqlSTX2TBPRQkqJp3qR8rHZmjnkVTtOpqq2pHBVkcCAACwVKCvXRvH9LTs2MUl55f6HCkpKRo9erT+97//6eDBg8rOztapU6e0Z8+e8+6nWbNm7vvBwcEKCwtTQkLCOdcPCgpyFyBJqlq1qnv9pKQkHT58WG3atHE/b7fb1bJlSzmdzov6/nJs2rRJPj4+atu2rXtZpUqV1LBhQ23atEmS9Oijj+qhhx7SL7/8oh49emjgwIHu7+uhhx7SwIEDtWrVKl1zzTXq16+fu0x5GsYEFZPQAF+1reM6lblg87nfzAAAAN7CMAwF+flYcjOM4puoKjg47x+3n3rqKU2fPl2vv/66lixZojVr1qhp06bKzMw87358fX3zvT7nKywFrV/YsU4l5b777tPOnTt15513av369WrVqpXGjRsnSerdu7fi4+P1+OOP68CBA4qLi9NTTz1lad5zoQQVo+6NoiVJ8zcdtjgJAAAASsqyZcs0ZMgQ9e/fX02bNlWVKlW0e/fuUs0QHh6u6OhorVixwr3M4XBo1apVRd5nbGyssrOz9ccff7iXHTt2TFu2bFHjxmeGe8TExOjBBx/UtGnT9OSTT+rjjz92PxcVFaXBgwfrq6++0nvvvaePPvqoyHlKEpfDFaO4RpX1yk8b9eeu40pOz1JYgO+FNwIAAECZUr9+fU2bNk19+/aVYRh68cUXi3wJ2qV45JFHNHbsWNWrV0+NGjXSuHHjdOLEiUKdBVu/fr1CQ0Pdjw3DUPPmzXXDDTfo/vvv18SJExUaGqrnnntOl112mW644QZJ0ogRI9S7d281aNBAJ06c0MKFCxUbGytJGjVqlFq2bKkmTZooIyNDP/30k/s5T0MJKka1IoNVJypYO4+kasnWo7q2WVWrIwEAAKCY/etf/9I999yj9u3bKzIyUs8++6ySk5NLPcezzz6rQ4cO6a677pLdbtfQoUPVs2dP2e0XHg/VuXPnPI/tdruys7M1adIkPfbYY7ruuuuUmZmpzp07a9asWe5L8xwOh4YNG6Z9+/YpLCxMvXr10rvvvivJ9VlHI0eO1O7duxUYGKhOnTrp22+/Lf5vvBgYptUXFl6C5ORkhYeHKykpSWFhYVbHkSS9PmuTPvp1pwZceZn+dfMVVscBAAAoNenp6dq1a5dq166tgIAAq+N4HafTqdjYWN1888165ZVXrI5TIs73HruYbsCYoGLWvVFlSdKiLUfkcJbZfgkAAAAPFx8fr48//lhbt27V+vXr9dBDD2nXrl26/fbbrY7m8ShBxaxlzQiFBfjoeGqm1uxNtDoOAAAAyimbzabPPvtMrVu3VocOHbR+/XrNmzfPY8fheBKPKUFvvPGGDMPQiBEjrI5ySXztNnVp6DobtGAzs8QBAACgZMTExGjZsmVKSkpScnKyfvvtt3xjfVAwjyhBK1as0MSJE/N8gFRZFnf6krj5m/i8IAAAAMDTWF6CUlJSNGjQIH388ceKiIiwOk6x6NIgSjZD2nzopPYnnrI6DgAAAIBcLC9Bw4YN07XXXqsePXpccN2MjAwlJyfnuXmiiGA/tazpKnQLNnM2CAAAAPAklpagb7/9VqtWrdLYsWMLtf7YsWMVHh7uvsXExJRwwqLr3ihakrRgE+OCAAAAAE9iWQnau3evHnvsMX399deFnkd+5MiRSkpKct/27t1bwimLLi7WNS5o2Y5jSsvMtjgNAAAAgByWlaCVK1cqISFBV155pXx8fOTj46PFixfr/fffl4+PjxwOR75t/P39FRYWlufmqepXDlH1iEBlZjv12/ZjVscBAAAAcJplJSguLk7r16/XmjVr3LdWrVpp0KBBWrNmjex2u1XRioVhGGdmiWNcEAAAQLnWtWvXPB/1UqtWLb333nvn3cYwDM2YMeOSj11c+/EmlpWg0NBQXX755XluwcHBqlSpki6//HKrYhWr7rGnxwVtPizTNC1OAwAAgLP17dtXvXr1KvC5JUuWyDAMrVu37qL3u2LFCg0dOvRS4+UxevRoXXHFFfmWHzx4UL179y7WY53ts88+U4UKFUr0GKXJ8tnhyrO2tSsqyM+uw8kZ+vuAZ85kBwAA4M3uvfdezZ07V/v27cv33KRJk9SqVasifZZlVFSUgoKCiiPiBVWpUkX+/v6lcqzywqNK0KJFiy542rAsCfC1q2O9SEl8cCoAAPBCpillplpzK+RVONddd52ioqL02Wef5VmekpKiH374Qffee6+OHTum2267TZdddpmCgoLUtGlTffPNN+fd79mXw23btk2dO3dWQECAGjdurLlz5+bb5tlnn1WDBg0UFBSkOnXq6MUXX1RWVpYk15mYl19+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
|