Compare commits

..

2 Commits

Author SHA1 Message Date
Jakub
10c7156f46 Panda3 2021-07-03 22:26:56 +02:00
Jakub
3ff980254a test 2021-06-23 22:39:58 +02:00
6 changed files with 10127 additions and 0 deletions

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

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

BIN
geval Normal file

Binary file not shown.

224
main.py Normal file
View File

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

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