thinkpad broke so i had to make this commit

This commit is contained in:
Wiktor Tylman 2021-06-20 23:06:15 +02:00
parent fdf03fd960
commit b5c924ebf6
3 changed files with 1174 additions and 0 deletions

232
app.py Normal file
View File

@ -0,0 +1,232 @@
'''
modified code from classes
'''
import numpy as np
import torch
from tqdm.notebook import tqdm
from sklearn.model_selection import train_test_split
import nltk
from nltk.tokenize import word_tokenize
nltk.download('punkt')
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print('Using {} device'.format(device))
with open("train/train.tsv", "r") as lalka_path:
lines = lalka_path.readlines()
train, test = train_test_split(lines, test_size = 0.2)
with open("train/train_train.tsv", "w") as out_train_file:
for i in train:
out_train_file.write(i)
with open("train/train_test.tsv", "w") as out_test_file:
for i in test:
out_test_file.write(i)
lalka_path_train= 'train/train_train.tsv'
lalka_path_valid= 'train/train_test.tsv'
corpora_train = open(lalka_path_train).read()
corpora_train_tokenized = list(word_tokenize(corpora_train))
corpora_train_tokenized = [token.lower() for token in corpora_train_tokenized]
vocab_itos = sorted(set(corpora_train_tokenized))
print(len(vocab_itos))
vocab_itos = vocab_itos[:15005]
vocab_itos[15001] = "<UNK>"
vocab_itos[15002] = "<BOS>"
vocab_itos[15003] = "<EOS>"
vocab_itos[15004] = "<PAD>"
print(len(vocab_itos))
vocab_stoi = dict()
for i, token in enumerate(vocab_itos):
vocab_stoi[token] = i
NGRAMS = 5
def get_token_id(dataset):
token_ids = [vocab_stoi['<PAD>']] * (NGRAMS-1) + [vocab_stoi['<BOS>']]
for token in dataset:
try:
token_ids.append(vocab_stoi[token])
except KeyError:
token_ids.append(vocab_stoi['<UNK>'])
token_ids.append(vocab_stoi['<EOS>'])
return token_ids
train_ids = get_token_id(corpora_train_tokenized)
def get_samples(dataset):
samples = []
for i in range(len(dataset)-NGRAMS):
samples.append(dataset[i:i+NGRAMS])
return samples
train_ids = get_samples(train_ids)
train_ids = torch.tensor(train_ids, device = device)
corpora_valid = open(lalka_path_valid).read()
corpora_valid_tokenized = list(word_tokenize(corpora_valid))
corpora_valid_tokenized = [token.lower() for token in corpora_valid_tokenized]
valid_ids = get_token_id(corpora_valid_tokenized)
valid_ids = torch.tensor(get_samples(valid_ids), dtype = torch.long, device = device)
class GRU(torch.nn.Module):
def __init__(self):
super(GRU, self).__init__()
self.emb = torch.nn.Embedding(len(vocab_itos),100)
self.rec = torch.nn.GRU(100, 256, 1, batch_first = True)
self.fc1 = torch.nn.Linear( 256 ,len(vocab_itos))
#self.dropout = torch.nn.Dropout(0.5)
def forward(self, x):
emb = self.emb(x)
#emb = self.dropout(emb)
output, h_n = self.rec(emb)
hidden = h_n.squeeze(0)
out = self.fc1(hidden)
#out = self.dropout(out)
return out
lm = GRU().to(device)
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(lm.parameters(),lr=0.0001)
BATCH_SIZE = 128
EPOCHS = 15
def get_ppl(dataset_ids):
lm.eval()
batches = 0
loss_sum =0
acc_score = 0
for i in range(0, len(dataset_ids)-BATCH_SIZE+1, BATCH_SIZE):
X = dataset_ids[i:i+BATCH_SIZE,:NGRAMS-1]
Y = dataset_ids[i:i+BATCH_SIZE,NGRAMS-1]
predictions = lm(X)
# equally distributted
# predictions = torch.zeros_like(predictions)
loss = criterion(predictions,Y)
loss_sum += loss.item()
batches += 1
return np.exp(loss_sum / batches)
history_ppl_train = []
history_ppl_valid = []
for epoch in range(EPOCHS):
batches = 0
loss_sum =0
acc_score = 0
lm.train()
#for i in range(0, len(train_ids)-BATCH_SIZE+1, BATCH_SIZE):
for i in tqdm(range(0, len(train_ids)-BATCH_SIZE+1, BATCH_SIZE)):
X = train_ids[i:i+BATCH_SIZE,:NGRAMS-1]
Y = train_ids[i:i+BATCH_SIZE,NGRAMS-1]
predictions = lm(X)
loss = criterion(predictions,Y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
loss_sum += loss.item()
batches += 1
ppl_train = get_ppl(train_ids)
ppl_valid = get_ppl(valid_ids)
history_ppl_train.append(ppl_train)
history_ppl_valid.append(ppl_valid)
print('epoch: ', epoch)
print('train ppl: ', ppl_train)
print('valid ppl: ', ppl_valid)
print()
tokenized = list(word_tokenize('Gości innych nie widział oprócz spółleśników'))
tokenized = [token.lower() for token in tokenized]
ids = []
for word in tokenized:
if word in vocab_stoi:
ids.append(vocab_stoi[word])
else:
ids.append(vocab_stoi['<UNK>'])
lm.eval()
ids = torch.tensor(ids, dtype = torch.long, device = device)
preds= lm(ids.unsqueeze(0))
vocab_itos[torch.argmax(torch.softmax(preds,1),1).item()]
tokenized = list(word_tokenize('Lalka'))
tokenized = [token.lower() for token in tokenized]
ids = []
for word in tokenized:
if word in vocab_stoi:
ids.append(vocab_stoi[word])
else:
ids.append(vocab_stoi['<UNK>'])
ids = torch.tensor([ids], dtype = torch.long, device = device)
candidates_number = 10
for i in range(30):
preds= lm(ids)
candidates = torch.topk(torch.softmax(preds,1),candidates_number)[1][0].cpu().numpy()
candidate = 15001
while candidate > 15000:
candidate = candidates[np.random.randint(candidates_number)]
print(vocab_itos[candidate])
ids = torch.cat((ids, torch.tensor([[candidate]], device = device)), 1)
with open("dev-0/in.tsv", "r") as dev_path:
nr_of_dev_lines = len(dev_path.readlines())
with open("test-A/in.tsv", "r") as test_a_path:
nr_of_test_a_lines = len(test_a_path.readlines())
with open("dev-0/out.tsv", "w") as out_dev_file:
for i in range(nr_of_dev_lines):
preds= lm(ids)
candidates = torch.topk(torch.softmax(preds,1),candidates_number)[1][0].cpu().numpy()
candidate = 15001
while candidate > 15000:
candidate = candidates[np.random.randint(candidates_number)]
print(vocab_itos[candidate])
ids = torch.cat((ids, torch.tensor([[candidate]], device = device)), 1)
out_dev_file.write(vocab_itos[candidate] + '\n')
with open("test-A/out.tsv", "w") as out_test_file:
for i in range(nr_of_dev_lines):
preds= lm(ids)
candidates = torch.topk(torch.softmax(preds,1),candidates_number)[1][0].cpu().numpy()
candidate = 15001
while candidate > 15000:
candidate = candidates[np.random.randint(candidates_number)]
print(vocab_itos[candidate])
ids = torch.cat((ids, torch.tensor([[candidate]], device = device)), 1)
out_test_file.write(vocab_itos[candidate] + '\n')

471
dev-0/out.tsv Normal file
View File

@ -0,0 +1,471 @@
na
lewo
:
a
co
o
nim
nie
mam
do
niego
na
jego
i
ja
mam
?
.
i
nawet
.
na
drugi
,
na
drugi
o
.
po
mnie
o
mnie
i
nawet
od
czasu
do
pana
:
czy
.
i
o
nie
jest
.
ale
na
lewo
do
mnie
;
na
niego
:
a
na
drugi
.
ale
,
o
co
?
)
.
ja
,
jak
ja
:
na
drugi
;
nie
na
jej
do
mnie
nie
na
myśl
nie
może
,
na
drugi
i
nie
było
do
czasu
.
i
o
,
jak
mnie
.
nie
może
do
pana
,
ale
pan
nie
na
myśl
:
i
nie
może
i
już
.
nie
i
do
,
na
lewo
;
,
bo
do
mnie
do
pana
nie
na
niej
do
,
ażeby
i
o
mnie
.
nie
ma
nie
jest
?
)
i
ja
:
czy
pan
.
na
jego
;
,
co
pan
na
jej
.
ale
nie
ma
do
paryża
o
o
czym
?
,
nie
o
pani
?
,
bo
na
jego
do
paryża
i
nie
będzie
na
mnie
?
po
chwili
na
lewo
?
a
jeżeli
na
myśl
.
nie
ma
?
pan
,
o
ile
?
po
mnie
,
i
nie
jest
;
nie
.
i
na
niego
,
o
nie
i
do
panny
do
.
po
czym
od
niego
;
na
jego
?
ale
o
nie
,
ale
co
?
po
co
nie
ma
do
,
a
na
jego
?
nie
jest
na
niego
,
bo
nie
nie
o
mnie
o
,
który
na
niego
?
nie
i
jeszcze
o
mnie
i
o
nie
było
o
o
niej
na
jej
na
jego
;
i
o
i
o
pani
i
na
niego
;
o
mnie
i
już
do
pani
nie
na
niego
na
jego
,
na
którym
do
.
potem
do
mnie
?
na
lewo
na
,
która
.
pan
na
co
o
niej
nie
może
,
ażeby
.
panna
na
myśl
,
ale
i
nawet
.
ale
jak
mnie
o
.
po
i
nie
.
i
nie
mógł
i
nawet
nie
jest
.
ale
do
panny
.
ale
nawet
,
ażeby
pan
?
po
mnie
do
pana
,
jak
,
jak
na
jej
i
ja
do
,
jak
mnie
na
jego
;
,
ażeby
i
ja
i
po
,
na
co
,
ale
o
czym
nie
,
co
.
a
pan
do
,
a
ja
już
od
pani
,
a
nie
i
pan
,
o
ile
i
jeszcze
.
po
mnie
na
niej
.
ale
nawet
mnie
?
na
mnie
:
co
o
i
nawet
i
o
czym
;
a
ja
jest
nie
mam
!
,
bo
na
co
?
nie
może
do
niej
!
,
a
jeżeli
,
nie
nie
może
na
niego
.
pan
ignacy
o
i
o
niej
!
1 na
2 lewo
3 :
4 a
5 co
6 o
7 nim
8 nie
9 mam
10 do
11 niego
12 na
13 jego
14 i
15 ja
16 mam
17 ?
18 .
19 i
20 nawet
21 .
22 na
23 drugi
24 ,
25 na
26 drugi
27 o
28 .
29 po
30 mnie
31 o
32 mnie
33 i
34 nawet
35 od
36 czasu
37 do
38 pana
39 :
40 czy
41 .
42 i
43 o
44 nie
45 jest
46 .
47 ale
48 na
49 lewo
50 do
51 mnie
52 ;
53 na
54 niego
55 :
56 a
57 na
58 drugi
59 .
60 ale
61 ,
62 o
63 co
64 ?
65 )
66 .
67 ja
68 ,
69 jak
70 ja
71 :
72 na
73 drugi
74 ;
75 nie
76 na
77 jej
78 do
79 mnie
80 nie
81 na
82 myśl
83 nie
84 może
85 ,
86 na
87 drugi
88 i
89 nie
90 było
91 do
92 czasu
93 .
94 i
95 o
96 ,
97 jak
98 mnie
99 .
100 nie
101 może
102 do
103 pana
104 ,
105 ale
106 pan
107 nie
108 na
109 myśl
110 :
111 i
112 nie
113 może
114 i
115 już
116 .
117 nie
118 i
119 do
120 ,
121 na
122 lewo
123 ;
124 ,
125 bo
126 do
127 mnie
128 do
129 pana
130 nie
131 na
132 niej
133 do
134 ,
135 ażeby
136 i
137 o
138 mnie
139 .
140 nie
141 ma
142 nie
143 jest
144 ?
145 )
146 i
147 ja
148 :
149 czy
150 pan
151 .
152 na
153 jego
154 ;
155 ,
156 co
157 pan
158 na
159 jej
160 .
161 ale
162 nie
163 ma
164 do
165 paryża
166 o
167 o
168 czym
169 ?
170 ,
171 nie
172 o
173 pani
174 ?
175 ,
176 bo
177 na
178 jego
179 do
180 paryża
181 i
182 nie
183 będzie
184 na
185 mnie
186 ?
187 po
188 chwili
189 na
190 lewo
191 ?
192 a
193 jeżeli
194 na
195 myśl
196 .
197 nie
198 ma
199 ?
200 pan
201 ,
202 o
203 ile
204 ?
205 po
206 mnie
207 ,
208 i
209 nie
210 jest
211 ;
212 nie
213 .
214 i
215 na
216 niego
217 ,
218 o
219 nie
220 i
221 do
222 panny
223 do
224 .
225 po
226 czym
227 od
228 niego
229 ;
230 na
231 jego
232 ?
233 ale
234 o
235 nie
236 ,
237 ale
238 co
239 ?
240 po
241 co
242 nie
243 ma
244 do
245 ,
246 a
247 na
248 jego
249 ?
250 nie
251 jest
252 na
253 niego
254 ,
255 bo
256 nie
257 nie
258 o
259 mnie
260 o
261 ,
262 który
263 na
264 niego
265 ?
266 nie
267 i
268 jeszcze
269 o
270 mnie
271 i
272 o
273 nie
274 było
275 o
276 o
277 niej
278 na
279 jej
280 na
281 jego
282 ;
283 i
284 o
285 i
286 o
287 pani
288 i
289 na
290 niego
291 ;
292 o
293 mnie
294 i
295 już
296 do
297 pani
298 nie
299 na
300 niego
301 na
302 jego
303 ,
304 na
305 którym
306 do
307 .
308 potem
309 do
310 mnie
311 ?
312 na
313 lewo
314 na
315 ,
316 która
317 .
318 pan
319 na
320 co
321 o
322 niej
323 nie
324 może
325 ,
326 ażeby
327 .
328 panna
329 na
330 myśl
331 ,
332 ale
333 i
334 nawet
335 .
336 ale
337 jak
338 mnie
339 o
340 .
341 po
342 i
343 nie
344 .
345 i
346 nie
347 mógł
348 i
349 nawet
350 nie
351 jest
352 .
353 ale
354 do
355 panny
356 .
357 ale
358 nawet
359 ,
360 ażeby
361 pan
362 ?
363 po
364 mnie
365 do
366 pana
367 ,
368 jak
369 ,
370 jak
371 na
372 jej
373 i
374 ja
375 do
376 ,
377 jak
378 mnie
379 na
380 jego
381 ;
382 ,
383 ażeby
384 i
385 ja
386 i
387 po
388 ,
389 na
390 co
391 ,
392 ale
393 o
394 czym
395 nie
396 ,
397 co
398 .
399 a
400 pan
401 do
402 ,
403 a
404 ja
405 już
406 od
407 pani
408 ,
409 a
410 nie
411 i
412 pan
413 ,
414 o
415 ile
416 i
417 jeszcze
418 .
419 po
420 mnie
421 na
422 niej
423 .
424 ale
425 nawet
426 mnie
427 ?
428 na
429 mnie
430 :
431 co
432 o
433 i
434 nawet
435 i
436 o
437 czym
438 ;
439 a
440 ja
441 jest
442 nie
443 mam
444 !
445 ,
446 bo
447 na
448 co
449 ?
450 nie
451 może
452 do
453 niej
454 !
455 ,
456 a
457 jeżeli
458 ,
459 nie
460 nie
461 może
462 na
463 niego
464 .
465 pan
466 ignacy
467 o
468 i
469 o
470 niej
471 !

471
test-A/out.tsv Normal file
View File

@ -0,0 +1,471 @@
)
,
jak
na
mnie
.
i
o
o
.
ale
o
i
ja
o
mnie
?
)
o
,
a
ja
już
,
o
pani
i
jeszcze
o
o
o
,
bo
i
co
pan
ignacy
i
już
od
,
ażeby
nie
.
o
i
o
.
pan
jest
na
,
jak
nie
było
;
o
niej
na
myśl
o
i
,
ażeby
do
niego
nie
ma
.
ja
o
o
.
ja
o
jej
?
a
a
nie
.
o
nie
.
i
pan
jest
?
po
pokoju
;
o
niej
.
ja
na
mnie
.
i
już
na
jej
,
ale
,
co
nie
ma
nie
,
o
,
co
nie
będzie
na
jego
.
pan
jest
nie
może
o
i
nawet
do
domu
?
,
o
co
na
jej
;
i
nie
o
czym
o
pani
.
o
niej
!
.
i
jeszcze
do
niego
.
o
czym
na
niej
:
co
.
nie
jest
?
na
mnie
i
pan
do
niej
?
na
kilka
i
pan
nie
ma
nie
ma
i
nie
.
,
o
czym
.
nie
i
do
panny
,
bo
pan
.
nie
było
na
nią
do
,
nie
jest
na
niej
.
nie
o
.
a
ja
już
pan
.
ale
nawet
o
,
co
do
niego
i
po
chwili
na
nią
na
mnie
i
o
,
nie
ma
i
nie
ma
?
,
jak
ja
?
a
nie
.
nie
będzie
,
co
pan
,
na
lewo
do
pana
i
,
i
na
lewo
!
i
jeszcze
na
mnie
,
o
pani
i
ja
i
nawet
na
myśl
.
nie
może
o
,
o
co
o
czym
:
pan
nie
jest
i
o
pani
na
co
dzień
.
na
co
i
nie
ma
?
nie
może
do
domu
na
jej
?
)
!
na
niego
,
ale
nie
.
ale
i
pan
ignacy
o
.
a
co
,
ale
nawet
mnie
:
,
na
którym
?
i
ja
już
nie
było
.
ale
na
co
pan
,
o
pani
meliton
o
,
i
nie
na
jego
do
paryża
i
nie
,
a
co
i
już
nie
na
jej
o
czym
.
pan
.
i
co
na
,
a
może
pan
o
.
o
co
.
a
nawet
,
i
nawet
do
nas
;
ale
o
czym
nie
,
o
nie
i
jeszcze
do
mnie
o
na
mnie
;
nie
było
.
pan
na
jej
i
po
do
domu
!
po
kilka
o
niej
i
już
nic
;
o
mnie
i
ja
:
i
co
?
pan
jest
?
po
i
po
mnie
do
mnie
:
i
już
,
co
do
pani
nie
o
o
pierwszej
,
ale
ja
już
na
jej
i
jeszcze
.
nie
może
,
o
pani
meliton
na
,
na
i
,
i
jeszcze
jak
i
o
pani
1 )
2 ,
3 jak
4 na
5 mnie
6 .
7 i
8 o
9 o
10 .
11 ale
12 o
13 i
14 ja
15 o
16 mnie
17 ?
18 )
19 o
20 ,
21 a
22 ja
23 już
24 ,
25 o
26 pani
27 i
28 jeszcze
29 o
30 o
31 o
32 ,
33 bo
34 i
35 co
36 pan
37 ignacy
38 i
39 już
40 od
41 ,
42 ażeby
43 nie
44 .
45 o
46 i
47 o
48 .
49 pan
50 jest
51 na
52 ,
53 jak
54 nie
55 było
56 ;
57 o
58 niej
59 na
60 myśl
61 o
62 i
63 ,
64 ażeby
65 do
66 niego
67 nie
68 ma
69 .
70 ja
71 o
72 o
73 .
74 ja
75 o
76 jej
77 ?
78 a
79 a
80 nie
81 .
82 o
83 nie
84 .
85 i
86 pan
87 jest
88 ?
89 po
90 pokoju
91 ;
92 o
93 niej
94 .
95 ja
96 na
97 mnie
98 .
99 i
100 już
101 na
102 jej
103 ,
104 ale
105 ,
106 co
107 nie
108 ma
109 nie
110 ,
111 o
112 ,
113 co
114 nie
115 będzie
116 na
117 jego
118 .
119 pan
120 jest
121 nie
122 może
123 o
124 i
125 nawet
126 do
127 domu
128 ?
129 ,
130 o
131 co
132 na
133 jej
134 ;
135 i
136 nie
137 o
138 czym
139 o
140 pani
141 .
142 o
143 niej
144 !
145 .
146 i
147 jeszcze
148 do
149 niego
150 .
151 o
152 czym
153 na
154 niej
155 :
156 co
157 .
158 nie
159 jest
160 ?
161 na
162 mnie
163 i
164 pan
165 do
166 niej
167 ?
168 na
169 kilka
170 i
171 pan
172 nie
173 ma
174 nie
175 ma
176 i
177 nie
178 .
179 ,
180 o
181 czym
182 .
183 nie
184 i
185 do
186 panny
187 ,
188 bo
189 pan
190 .
191 nie
192 było
193 na
194 nią
195 do
196 ,
197 nie
198 jest
199 na
200 niej
201 .
202 nie
203 o
204 .
205 a
206 ja
207 już
208 pan
209 .
210 ale
211 nawet
212 o
213 ,
214 co
215 do
216 niego
217 i
218 po
219 chwili
220 na
221 nią
222 na
223 mnie
224 i
225 o
226 ,
227 nie
228 ma
229 i
230 nie
231 ma
232 ?
233 ,
234 jak
235 ja
236 ?
237 a
238 nie
239 .
240 nie
241 będzie
242 ,
243 co
244 pan
245 ,
246 na
247 lewo
248 do
249 pana
250 i
251 ,
252 i
253 na
254 lewo
255 !
256 i
257 jeszcze
258 na
259 mnie
260 ,
261 o
262 pani
263 i
264 ja
265 i
266 nawet
267 na
268 myśl
269 .
270 nie
271 może
272 o
273 ,
274 o
275 co
276 o
277 czym
278 :
279 pan
280 nie
281 jest
282 i
283 o
284 pani
285 na
286 co
287 dzień
288 .
289 na
290 co
291 i
292 nie
293 ma
294 ?
295 nie
296 może
297 do
298 domu
299 na
300 jej
301 ?
302 )
303 !
304 na
305 niego
306 ,
307 ale
308 nie
309 .
310 ale
311 i
312 pan
313 ignacy
314 o
315 .
316 a
317 co
318 ,
319 ale
320 nawet
321 mnie
322 :
323 ,
324 na
325 którym
326 ?
327 i
328 ja
329 już
330 nie
331 było
332 .
333 ale
334 na
335 co
336 pan
337 ,
338 o
339 pani
340 meliton
341 o
342 ,
343 i
344 nie
345 na
346 jego
347 do
348 paryża
349 i
350 nie
351 ,
352 a
353 co
354 i
355 już
356 nie
357 na
358 jej
359 o
360 czym
361 .
362 pan
363 .
364 i
365 co
366 na
367 ,
368 a
369 może
370 pan
371 o
372 .
373 o
374 co
375 .
376 a
377 nawet
378 ,
379 i
380 nawet
381 do
382 nas
383 ;
384 ale
385 o
386 czym
387 nie
388 ,
389 o
390 nie
391 i
392 jeszcze
393 do
394 mnie
395 o
396 na
397 mnie
398 ;
399 nie
400 było
401 .
402 pan
403 na
404 jej
405 i
406 po
407 do
408 domu
409 !
410 po
411 kilka
412 o
413 niej
414 i
415 już
416 nic
417 ;
418 o
419 mnie
420 i
421 ja
422 :
423 i
424 co
425 ?
426 pan
427 jest
428 ?
429 po
430 i
431 po
432 mnie
433 do
434 mnie
435 :
436 i
437 już
438 ,
439 co
440 do
441 pani
442 nie
443 o
444 o
445 pierwszej
446 ,
447 ale
448 ja
449 już
450 na
451 jej
452 i
453 jeszcze
454 .
455 nie
456 może
457 ,
458 o
459 pani
460 meliton
461 na
462 ,
463 na
464 i
465 ,
466 i
467 jeszcze
468 jak
469 i
470 o
471 pani