This commit is contained in:
Jakub 2021-06-23 22:39:58 +02:00
parent fdf03fd960
commit 3ff980254a
5 changed files with 10145 additions and 0 deletions

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

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

242
main.py Normal file
View File

@ -0,0 +1,242 @@
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")
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))
vocab_itos = vocab_itos[:15005]
vocab_itos[15001] = "<UNK>"
vocab_itos[15002] = "<BOS>"
vocab_itos[15003] = "<EOS>"
vocab_itos[15004] = "<PAD>"
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)
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 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
test-A/out.tsv Normal file
View File

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

1793
train/train_test.tsv Normal file

File diff suppressed because it is too large Load Diff

7168
train/train_train.tsv Normal file

File diff suppressed because it is too large Load Diff