Compare commits

..

1 Commits

Author SHA1 Message Date
Ufnow
e24be08915 done 2021-06-23 00:46:51 +02:00
6 changed files with 10105 additions and 0 deletions

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

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

BIN
geval Normal file

Binary file not shown.

202
script.py Normal file
View File

@ -0,0 +1,202 @@
import numpy as np
import torch
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")
train_a = "train/train.tsv"
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>"
BATCH_SIZE = 128
EPOCHS = 15
history_ppl_train = []
history_ppl_valid = []
vocab_stoi = dict()
for i, token in enumerate(vocab_itos):
vocab_stoi[token] = i
NGRAMS = 5
def set_ppl(dataset_id_list):
lm.eval()
batches = 0
loss_sum = 0
for i in range(0, len(dataset_id_list) - BATCH_SIZE + 1, BATCH_SIZE):
X = dataset_id_list[i:i + BATCH_SIZE, :NGRAMS - 1]
Y = dataset_id_list[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)
def open_files(path_a, path_b, path_c):
with open(path_a, "r") as path:
lines = path.readlines()
train, test = train_test_split(lines, test_size=0.2)
with open(path_b, "w") as out_train_file:
for i in train:
out_train_file.write(i)
with open(path_c, "w") as out_test_file:
for i in test:
out_test_file.write(i)
def get_samples(dataset):
samples = []
for i in range(len(dataset) - NGRAMS):
samples.append(dataset[i:i + NGRAMS])
return samples
def get_token_id(dataset):
token_id_list = [vocab_stoi['<PAD>']] * (NGRAMS - 1) + [vocab_stoi['<BOS>']]
for token in dataset:
try:
token_id_list.append(vocab_stoi[token])
except KeyError:
token_id_list.append(vocab_stoi['<UNK>'])
token_id_list.append(vocab_stoi['<EOS>'])
return token_id_list
open_files(train_a, lalka_path_train, lalka_path_valid)
train_id_list = get_token_id(corpora_train_tokenized)
train_id_list = get_samples(train_id_list)
train_id_list = torch.tensor(train_id_list, 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_id_list = get_token_id(corpora_valid_tokenized)
valid_id_list = torch.tensor(get_samples(valid_id_list), 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))
def forward(self, x):
emb = self.emb(x)
output, h_n = self.rec(emb)
hidden = h_n.squeeze(0)
out = self.fc1(hidden)
return out
lm = GRU().to(device)
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(lm.parameters(), lr=0.0001)
for epoch in range(EPOCHS):
batches = 0
loss_sum = 0
acc_score = 0
lm.train()
for i in range(0, len(train_id_list) - BATCH_SIZE + 1, BATCH_SIZE):
X = train_id_list[i:i + BATCH_SIZE, :NGRAMS - 1]
Y = train_id_list[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 = set_ppl(train_id_list)
ppl_valid = set_ppl(valid_id_list)
history_ppl_train.append(ppl_train)
history_ppl_valid.append(ppl_valid)
tokenized = list(word_tokenize('Gości innych nie widział oprócz spółleśników'))
tokenized = [token.lower() for token in tokenized]
id_list = []
for word in tokenized:
if word in vocab_stoi:
id_list.append(vocab_stoi[word])
else:
id_list.append(vocab_stoi['<UNK>'])
lm.eval()
id_list = torch.tensor(id_list, dtype=torch.long, device=device)
preds = lm(id_list.unsqueeze(0))
vocab_itos[torch.argmax(torch.softmax(preds, 1), 1).item()]
tokenized = list(word_tokenize('Lalka'))
tokenized = [token.lower() for token in tokenized]
id_list = []
for word in tokenized:
if word in vocab_stoi:
id_list.append(vocab_stoi[word])
else:
id_list.append(vocab_stoi['<UNK>'])
id_list = torch.tensor([id_list], dtype=torch.long, device=device)
candidates_number = 10
for i in range(30):
preds = lm(id_list)
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)]
id_list = torch.cat((id_list, 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(id_list)
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)]
id_list = torch.cat((id_list, 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(id_list)
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)]
id_list = torch.cat((id_list, 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 @@
?
a
może
o
jej
.
na
kilka
dni
i
po
południu
,
ale
ja
o
.
po
i
po
prostu
na
mnie
.
pani
na
jej
,
jak
ja
i
ja
?
po
południu
nie
miał
do
nas
nie
było
go
o
nie
mam
.
i
co
do
mnie
!
a
po
i
ja
,
na
niego
i
co
?
,
a
i
nawet
:
do
nas
,
na
jego
nie
był
.
a
jeżeli
do
domu
!
nie
było
do
pani
meliton
.
gdy
na
kilka
na
jej
?
)
,
na
kilka
na
jej
,
nie
miał
do
czasu
na
jej
!
)
.
ale
ja
nie
mam
.
pani
na
jej
nie
będzie
i
na
jego
do
.
pani
nie
był
?
nie
,
co
pan
!
o
jej
.
ale
na
mnie
,
który
?
)
o
na
jego
i
po
kilka
?
.
gdy
,
i
na
co
o
,
bo
.
i
już
o
nim
do
nas
:
na
mnie
i
nawet
nie
było
go
.
i
gdy
na
mnie
na
kilka
dni
.
po
co
do
niej
:
o
,
i
na
nią
:
czy
pan
ignacy
!
)
.
ja
,
czy
o
nie
był
o
czym
do
głowy
!
po
co
?
o
.
po
.
na
lewo
.
nie
jestem
,
nie
na
nią
o
nim
na
co
i
nie
na
mnie
do
niej
?
)
i
o
czym
?
nie
ma
pan
o
na
kilka
,
ażeby
,
ażeby
.
ale
już
nie
było
do
niego
:
po
,
a
na
co
dzień
i
ja
!
)
na
jego
dzień
?
a
może
o
jego
i
na
co
do
nas
.
nie
,
i
o
nie
było
.
nie
będzie
mi
po
.
co
i
po
chwili
na
kilka
.
i
o
.
i
o
na
kilka
na
jego
,
który
nie
na
drugi
:
co
.
ja
.
o
jego
nie
ma
do
domu
,
bo
na
myśl
:
i
o
.
po
prostu
,
bo
,
a
,
i
ja
do
czasu
,
i
jeszcze
do
niego
?
na
kilka
:
.
ale
co
dzień
,
co
pan
na
niego
:
i
już
do
czasu
,
nie
jest
na
niego
,
a
jeżeli
ja
o
jej
.
a
może
do
niego
do
pani
baronowej
i
nie
jest
,
który
do
panny
,
ale
ja
o
.
a
ja
!
ale
o
nie
,
nie
miał
do
paryża
!
.
i
na
jego
do
niego
;
po
nie
ma
pani
na
nią
.
a
ja
.
nie
będzie
o
nie
będzie
do
niego
,
ażeby
na
jego
nie
było
go
,
bo
już
o
czym
;
bo
na
nią
do
niej
i
nie
na
.
pani
?
)
,
ale
o
na
kilka
.
pani
,
co
,
1 ?
2 a
3 może
4 o
5 jej
6 .
7 na
8 kilka
9 dni
10 i
11 po
12 południu
13 ,
14 ale
15 ja
16 o
17 .
18 po
19 i
20 po
21 prostu
22 na
23 mnie
24 .
25 pani
26 na
27 jej
28 ,
29 jak
30 ja
31 i
32 ja
33 ?
34 po
35 południu
36 nie
37 miał
38 do
39 nas
40 nie
41 było
42 go
43 o
44 nie
45 mam
46 .
47 i
48 co
49 do
50 mnie
51 !
52 a
53 po
54 i
55 ja
56 ,
57 na
58 niego
59 i
60 co
61 ?
62 ,
63 a
64 i
65 nawet
66 :
67 do
68 nas
69 ,
70 na
71 jego
72 nie
73 był
74 .
75 a
76 jeżeli
77 do
78 domu
79 !
80 nie
81 było
82 do
83 pani
84 meliton
85 .
86 gdy
87 na
88 kilka
89 na
90 jej
91 ?
92 )
93 ,
94 na
95 kilka
96 na
97 jej
98 ,
99 nie
100 miał
101 do
102 czasu
103 na
104 jej
105 !
106 )
107 .
108 ale
109 ja
110 nie
111 mam
112 .
113 pani
114 na
115 jej
116 nie
117 będzie
118 i
119 na
120 jego
121 do
122 .
123 pani
124 nie
125 był
126 ?
127 nie
128 ,
129 co
130 pan
131 !
132 o
133 jej
134 .
135 ale
136 na
137 mnie
138 ,
139 który
140 ?
141 )
142 o
143 na
144 jego
145 i
146 po
147 kilka
148 ?
149 .
150 gdy
151 ,
152 i
153 na
154 co
155 o
156 ,
157 bo
158 .
159 i
160 już
161 o
162 nim
163 do
164 nas
165 :
166 na
167 mnie
168 i
169 nawet
170 nie
171 było
172 go
173 .
174 i
175 gdy
176 na
177 mnie
178 na
179 kilka
180 dni
181 .
182 po
183 co
184 do
185 niej
186 :
187 o
188 ,
189 i
190 na
191 nią
192 :
193 czy
194 pan
195 ignacy
196 !
197 )
198 .
199 ja
200 ,
201 czy
202 o
203 nie
204 był
205 o
206 czym
207 do
208 głowy
209 !
210 po
211 co
212 ?
213 o
214 .
215 po
216 .
217 na
218 lewo
219 .
220 nie
221 jestem
222 ,
223 nie
224 na
225 nią
226 o
227 nim
228 na
229 co
230 i
231 nie
232 na
233 mnie
234 do
235 niej
236 ?
237 )
238 i
239 o
240 czym
241 ?
242 nie
243 ma
244 pan
245 o
246 na
247 kilka
248 ,
249 ażeby
250 ,
251 ażeby
252 .
253 ale
254 już
255 nie
256 było
257 do
258 niego
259 :
260 po
261 ,
262 a
263 na
264 co
265 dzień
266 i
267 ja
268 !
269 )
270 na
271 jego
272 dzień
273 ?
274 a
275 może
276 o
277 jego
278 i
279 na
280 co
281 do
282 nas
283 .
284 nie
285 ,
286 i
287 o
288 nie
289 było
290 .
291 nie
292 będzie
293 mi
294 po
295 .
296 co
297 i
298 po
299 chwili
300 na
301 kilka
302 .
303 i
304 o
305 .
306 i
307 o
308 na
309 kilka
310 na
311 jego
312 ,
313 który
314 nie
315 na
316 drugi
317 :
318 co
319 .
320 ja
321 .
322 o
323 jego
324 nie
325 ma
326 do
327 domu
328 ,
329 bo
330 na
331 myśl
332 :
333 i
334 o
335 .
336 po
337 prostu
338 ,
339 bo
340 ,
341 a
342 ,
343 i
344 ja
345 do
346 czasu
347 ,
348 i
349 jeszcze
350 do
351 niego
352 ?
353 na
354 kilka
355 :
356 .
357 ale
358 co
359 dzień
360 ,
361 co
362 pan
363 na
364 niego
365 :
366 i
367 już
368 do
369 czasu
370 ,
371 nie
372 jest
373 na
374 niego
375 ,
376 a
377 jeżeli
378 ja
379 o
380 jej
381 .
382 a
383 może
384 do
385 niego
386 do
387 pani
388 baronowej
389 i
390 nie
391 jest
392 ,
393 który
394 do
395 panny
396 ,
397 ale
398 ja
399 o
400 .
401 a
402 ja
403 !
404 ale
405 o
406 nie
407 ,
408 nie
409 miał
410 do
411 paryża
412 !
413 .
414 i
415 na
416 jego
417 do
418 niego
419 ;
420 po
421 nie
422 ma
423 pani
424 na
425 nią
426 .
427 a
428 ja
429 .
430 nie
431 będzie
432 o
433 nie
434 będzie
435 do
436 niego
437 ,
438 ażeby
439 na
440 jego
441 nie
442 było
443 go
444 ,
445 bo
446 już
447 o
448 czym
449 ;
450 bo
451 na
452 nią
453 do
454 niej
455 i
456 nie
457 na
458 .
459 pani
460 ?
461 )
462 ,
463 ale
464 o
465 na
466 kilka
467 .
468 pani
469 ,
470 co
471 ,

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