Compare commits

...

2 Commits

Author SHA1 Message Date
7d61ed9133 Merge branch 'master' of https://git.wmi.amu.edu.pl/s426289/lalka-lm
x
2021-06-24 00:28:18 +02:00
6170338a40 12 2021-06-24 00:27:56 +02:00
7 changed files with 10121 additions and 0 deletions

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

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

216
main.py Normal file
View File

@ -0,0 +1,216 @@
import numpy as np
import torch
from sklearn.model_selection import train_test_split
from nltk.tokenize import word_tokenize
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>"
with open("train/train.tsv", "r") as lalka:
lines = lalka.readlines()
with open("train/train_train.tsv", "w") as out_train:
for i in train:
out_train.write(i)
with open("train/train_test.tsv", "w") as out_test:
for i in test:
out_test.write(i)
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))
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)
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 range(0, len(train_ids)-BATCH_SIZE+1, BATCH_SIZE):
for i in 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)
tokenized = list(word_tokenize('Gości innych nie widział oprócz spółleśników'))
tokenized = tokenized[-NGRAMS :-1 ]
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)
dev= open("dev-0/in.tsv", "r")
dev_ = len(dev.readlines())
a = open("test-A/in.tsv", "r")
a_ = len(a.readlines())
with open("dev-0/out.tsv", "w") as out_dev:
for i in range(dev_):
prediction = lm(id_list)
candidates = torch.topk(torch.softmax(prediction, 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:
for i in range(dev_):
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')

1
test-A/.~lock.in.tsv# Normal file
View File

@ -0,0 +1 @@
,kasia,kasia-XPS-15-9550,23.06.2021 23:50,file:///home/kasia/.config/libreoffice/4;

1
test-A/.~lock.out.tsv# Normal file
View File

@ -0,0 +1 @@
,kasia,kasia-XPS-15-9550,24.06.2021 00:25,file:///home/kasia/.config/libreoffice/4;

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

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

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