рдкрд╛рдпрдерди + рдХреЗрд░рд╕ + LSTM: рдЖрдзреЗ рдШрдВрдЯреЗ рдореЗрдВ рдПрдХ рдкрд╛рда рдЕрдиреБрд╡рд╛рджрдХ рдХрд░реЗрдВ

рд╣рд╛рдп, рд╣реИрдмреНрд░ред

рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд╛рда рдкрд╣рдЪрд╛рди рдмрдирд╛рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ред рдЖрдЬ рд╣рдо рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ рдЬрд░реНрдорди рддрдХ рдЧреНрд░рдВрдереЛрдВ рдХрд╛ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рджрдХ рд▓рд┐рдЦреЗрдВрдЧреЗред



рдЬреЛ рд▓реЛрдЧ рдЗрд╕ рдХрд╛рдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд░рдг рдХрдЯреМрддреА рдХреЗ рдЕрдзреАрди рд╣реИред

рдиреЛрдЯ : рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╢реИрдХреНрд╖рд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╢реНрди "рдХреНрдпреЛрдВ" рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рд░реНрдл рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдПред рдореИрдВ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдпрд╣ рдпрд╛ рд╡рд╣ рддрд░реАрдХрд╛ рдмреЗрд╣рддрд░ рд╣реИ рдпрд╛ рдмрджрддрд░ рд╣реИ, рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдиреАрдЪреЗ рджреА рдЧрдИ рд╡рд┐рдзрд┐, рдмреЗрд╢рдХ, рд╕рд░рд▓реАрдХреГрдд рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрдзреЗ рдШрдВрдЯреЗ рдореЗрдВ рджреВрд╕рд░рд╛ рд▓рд┐рдВрдЧреНрд╡реЛ рд▓рд┐рдЦреЗрдВрдЧреЗред

рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣


рдЯреИрдм рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдЕрдВрдЧреНрд░реЗрдЬреА рдФрд░ рдЬрд░реНрдорди рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рд╡рд╛рд▓реЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдорд┐рд▓реА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

Hi. Hallo! Hi. Gr├╝├Я Gott! Run! Lauf! Wow! Potzdonner! Wow! Donnerwetter! Fire! Feuer! Help! Hilfe! Help! Zu H├╝lf! Stop! Stopp! Wait! Warte! Go on. Mach weiter. Hello! Hallo! I ran. Ich rannte. I see. Ich verstehe. ... 

рдлрд╝рд╛рдЗрд▓ рдореЗрдВ 192 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ 13 рдПрдордмреА рд╣реИред рд╣рдо рдкрд╛рда рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рдФрд░ рдЬрд░реНрдорди рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдмреНрд▓реЙрдХ рдореЗрдВ рддреЛрдбрд╝рддреЗ рд╣реИрдВред

 def read_text(filename): with open(filename, mode='rt', encoding='utf-8') as file: text = file.read() sents = text.strip().split('\n') return [i.split('\t') for i in sents] data = read_text("deutch.txt") deu_eng = np.array(data) deu_eng = deu_eng[:30000,:] print("Dictionary size:", deu_eng.shape) # Remove punctuation deu_eng[:,0] = [s.translate(str.maketrans('', '', string.punctuation)) for s in deu_eng[:,0]] deu_eng[:,1] = [s.translate(str.maketrans('', '', string.punctuation)) for s in deu_eng[:,1]] # convert text to lowercase for i in range(len(deu_eng)): deu_eng[i,0] = deu_eng[i,0].lower() deu_eng[i,1] = deu_eng[i,1].lower() 

рд╣рдордиреЗ рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди рдХреЛ рд╕рднреА рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрдиреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред

рдЕрдЧрд▓рд╛ рдХрджрдо рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╢рдмреНрдж рдХреНрдпрд╛ рд╣реИрдВ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП, keras рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдЯреЛрдХрдирд░рд╛рдЗрдЬрд╝рд░ рд╡рд░реНрдЧ рд╣реИ, рдЬреЛ рд╢рдмреНрджреЛрдВ рдХреЛ рдбрд┐рдЬрд┐рдЯрд▓ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╕ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдЪрд┐рддреНрд░ рд╣реИ:

 from keras.preprocessing.text import Tokenizer from keras.preprocessing.sequence import pad_sequences s = "To be or not to be" eng_tokenizer = Tokenizer() eng_tokenizer.fit_on_texts([s]) seq = eng_tokenizer.texts_to_sequences([s]) seq = pad_sequences(seq, maxlen=8, padding='post') print(seq) 

рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рд╣реЛрдиреЗ рдпрд╛ рди рд╣реЛрдиреЗ" рдХреЛ рд╕рд░рдгреА [1 2 3 4 1 2 0 0] рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, 1 = рд╕реЗ, 2 = рд╣реЛрдирд╛, 3 = рдпрд╛, 4 = рдирд╣реАрдВред рд╣рдо рдЗрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЬрдорд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг


рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛ рдбрд┐рдЬрд┐рдЯрд▓ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рд╣реИред рд╣рдо рдЗрдирдкреБрдЯ (рдЕрдВрдЧреНрд░реЗрдЬреА рд▓рд╛рдЗрдиреЛрдВ) рдФрд░ рдЖрдЙрдЯрдкреБрдЯ (рдЬрд░реНрдорди рд▓рд╛рдЗрдиреЛрдВ) рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдХреЛ рджреЛ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЗрдХрд╛рдИ рднреА рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

 # split data into train and test set train, test = train_test_split(deu_eng, test_size=0.2, random_state=12) # prepare training data trainX = encode_sequences(eng_tokenizer, eng_length, train[:, 0]) trainY = encode_sequences(deu_tokenizer, deu_length, train[:, 1]) # prepare validation data testX = encode_sequences(eng_tokenizer, eng_length, test[:, 0]) testY = encode_sequences(deu_tokenizer, deu_length, test[:, 1]) 

рдЕрдм рд╣рдо рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдПрдХ рдореЙрдбрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ LSTM рдкрд░рддреЗрдВ рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдореЗрдореЛрд░реА рд╕реЗрд▓реНрд╕ рд╣реЛрддреА рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╡рддрдГ "рдирд┐рдпрдорд┐рдд" рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬреЛ рд▓реЛрдЧ рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 def make_model(in_vocab, out_vocab, in_timesteps, out_timesteps, n): model = Sequential() model.add(Embedding(in_vocab, n, input_length=in_timesteps, mask_zero=True)) model.add(LSTM(n)) model.add(Dropout(0.3)) model.add(RepeatVector(out_timesteps)) model.add(LSTM(n, return_sequences=True)) model.add(Dropout(0.3)) model.add(Dense(out_vocab, activation='softmax')) model.compile(optimizer=optimizers.RMSprop(lr=0.001), loss='sparse_categorical_crossentropy') return model eng_vocab_size = len(eng_tokenizer.word_index) + 1 deu_vocab_size = len(deu_tokenizer.word_index) + 1 eng_length, deu_length = 8, 8 model = make_model(eng_vocab_size, deu_vocab_size, eng_length, deu_length, 512) num_epochs = 40 model.fit(trainX, trainY.reshape(trainY.shape[0], trainY.shape[1], 1), epochs=num_epochs, batch_size=512, validation_split=0.2, callbacks=None, verbose=1) model.save('en-de-model.h5') 

рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╣реА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддреЗрдЬ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреЛрд░ i7 + GeForce 1060 рдкрд░ 30 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдЖрдзреЗ рдШрдВрдЯреЗ рд▓рдЧрддреЗ рд╣реИрдВред рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдЕрдВрдд рдореЗрдВ (рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ), рдореЙрдбрд▓ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо predict_classes рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЗрдирдкреБрдЯ рд╣рдо рдХреБрдЫ рд╕рд░рд▓ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред Get_word рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рдмреНрджреЛрдВ рдХреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 model = load_model('en-de-model.h5') def get_word(n, tokenizer): if n == 0: return "" for word, index in tokenizer.word_index.items(): if index == n: return word return "" phrs_enc = encode_sequences(eng_tokenizer, eng_length, ["the weather is nice today", "my name is tom", "how old are you", "where is the nearest shop"]) preds = model.predict_classes(phrs_enc) print("Preds:", preds.shape) print(preds[0]) print(get_word(preds[0][0], deu_tokenizer), get_word(preds[0][1], deu_tokenizer), get_word(preds[0][2], deu_tokenizer), get_word(preds[0][3], deu_tokenizer)) print(preds[1]) print(get_word(preds[1][0], deu_tokenizer), get_word(preds[1][1], deu_tokenizer), get_word(preds[1][2], deu_tokenizer), get_word(preds[1][3], deu_tokenizer)) print(preds[2]) print(get_word(preds[2][0], deu_tokenizer), get_word(preds[2][1], deu_tokenizer), get_word(preds[2][2], deu_tokenizer), get_word(preds[2][3], deu_tokenizer)) print(preds[3]) print(get_word(preds[3][0], deu_tokenizer), get_word(preds[3][1], deu_tokenizer), get_word(preds[3][2], deu_tokenizer), get_word(preds[3][3], deu_tokenizer)) 

рдкрд░рд┐рдгрд╛рдо


рдЕрдм, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдмрд╕реЗ рдЙрддреНрд╕реБрдХ рдЪреАрдЬ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреИрд╕реЗ рд╕реАрдЦрддрд╛ рд╣реИ рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рдФрд░ рдЬрд░реНрдорди рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЛ "рдпрд╛рдж" рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ 2 рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЛ рдЖрд╕рд╛рди рдФрд░ 2 рдХрдард┐рди рдЕрдВрддрд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ред

5 рдорд┐рдирдЯ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг

"рдЖрдЬ рдореМрд╕рдо рдЕрдЪреНрдЫрд╛ рд╣реИ" - "рджрд╛рд╕ ist рдЯреЙрдо"
"рдореЗрд░рд╛ рдирд╛рдо рдЯреЙрдо рд╣реИ" - "рд╡рд╛рдИ рдлрд░ рдЯреЙрдо рдЯреЙрдо"
"рдЖрдкрдХреА рдЙрдореНрд░ рдХрд┐рддрдиреА рд╣реИ" - "wie geht ist es"
"рд╕рдмрд╕реЗ рдирдЬрд╝рджреАрдХреА рджреБрдХрд╛рди рдХрд╣рд╛рдБ рд╣реИ" - "wo ist der"

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдм рддрдХ рдХреБрдЫ "рд╣рд┐рдЯ" рд╣реИрдВред рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдЖрдк рдХрд┐рддрдиреЗ рд╕рд╛рд▓ рдХреЗ рд╣реИрдВ" рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ "рдХреИрд╕реЗ рдЖрдк рд╣реИрдВ" рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЗ рд╕рд╛рде рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЕрдиреБрд╡рд╛рдж "wie geht ist es" (рдЖрдк рдХреИрд╕реЗ рд╣реИрдВ?) рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛ред рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдореЗрдВ "рдХрд╣рд╛рдВ рд╣реИ ..." рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдиреЗ рдХреЗрд╡рд▓ рдХреНрд░рд┐рдпрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИ, рдЬрд╣рд╛рдВ рдЕрдиреБрд╡рд╛рдж "wo ist der" (рдЬрд╣рд╛рдВ рдпрд╣ рд╣реИ?) рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛, рдЬреЛ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЕрд░реНрде рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдореВрд╣ A1 рдореЗрдВ рдЬрд░реНрдорди рдирд╡рд╛рдЧрдВрддреБрдХ рдореЗрдВ рднреА рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ;)

10 рдорд┐рдирдЯ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг

"рдЖрдЬ рдореМрд╕рдо рдЕрдЪреНрдЫрд╛ рд╣реИ" - "рджрд╛рд╕ рд╣реИрд╕ рдмреЗрд░реЗрдЯ"
"рдореЗрд░рд╛ рдирд╛рдо рдЯреЙрдо рд╣реИ" - "mei hee hei tome tom"
"рдЖрдк рдХрд┐рддрдиреЗ рд╕рд╛рд▓ рдХреЗ рд╣реИрдВ" - "wie alt sind sie"
"рд╕рдмрд╕реЗ рдирдЬрд╝рджреАрдХреА рджреБрдХрд╛рди рдХрд╣рд╛рдБ рд╣реИ" - "wo ist paris"

рдХреБрдЫ рдкреНрд░рдЧрддрд┐ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИред рдкрд╣рд▓рд╛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрдЧрд╣ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред рджреВрд╕рд░реЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдореЗрдВ, рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ "рд╕реАрдЦрд╛" рдХреНрд░рд┐рдпрд╛ hei (en (рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди "mein hei├Яe hei├Яe рдЯреЙрдо" рдЕрднреА рднреА рдЧрд▓рдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд░реНрде рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рддреАрд╕рд░рд╛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рд╣реИред рдЪреМрдереЗ рдореЗрдВ, рдкрд╣рд▓рд╛ рднрд╛рдЧ "wo ist" рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рдХрдЯрддрдо рджреБрдХрд╛рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдкреЗрд░рд┐рд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЧрдИ рдереАред

30 рдорд┐рдирдЯ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг

"рдЖрдЬ рдореМрд╕рдо рдЕрдЪреНрдЫрд╛ рд╣реИ" - "рджрд╛рд╕ рдЗрд╕реН рдЯ рдЗрдЬрд╝ рдЧреБрджрд╛"
"рдореЗрд░рд╛ рдирд╛рдо рдЯреЙрдо рд╣реИ" - "рдЯреЙрдо" ist mein рдирд╛рдо "
"рдЖрдк рдХрд┐рддрдиреЗ рд╕рд╛рд▓ рдХреЗ рд╣реИрдВ" - "wie alt sind sie"
"рд╕рдмрд╕реЗ рдирдЬрд╝рджреАрдХреА рджреБрдХрд╛рди рдХрд╣рд╛рдБ рд╣реИ" - "wo ist der"

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рджреВрд╕рд░рд╛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╕рд╣реА рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдбрд┐рдЬрд╛рдЗрди рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рджрд┐рдЦрддрд╛ рд╣реИред рддреАрд╕рд░рд╛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдФрд░ рдЪреМрдереА рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдЕрднреА рддрдХ "рд╕реАрдЦрд╛" рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА рдмрд┐рдЬрд▓реА рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдХреЛ рдпрд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ :) рдмреЗрд╢рдХ, рдкрд░рд┐рдгрд╛рдо рдЕрднреА рддрдХ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди 190 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдкреВрд░реНрдг рд╕реЗрдЯ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЗрдВ рдПрдХ рдШрдВрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред

рдЬреЛ рд▓реЛрдЧ рдЕрдкрдиреЗ рджрдо рдкрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рд╕реНрдкреЙрдЗрд▓рд░ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдЬреЛрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рди рдХреЗрд╡рд▓ рдЕрдВрдЧреНрд░реЗрдЬреА рдФрд░ рдЬрд░реНрдорди (рдлрд╝рд╛рдЗрд▓ UTF-8 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП)ред рдЕрдиреБрд╡рд╛рдж рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХрд╛ рдореБрджреНрджрд╛ рднреА рдЦреБрд▓рд╛ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИред

keras_translate.py
 import os # os.environ["CUDA_VISIBLE_DEVICES"] = "-1" # Force CPU os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # 0 = all messages are logged, 3 - INFO, WARNING, and ERROR messages are not printed import string import re import numpy as np import pandas as pd from keras.models import Sequential from keras.layers import Dense, LSTM, Embedding, RepeatVector from keras.preprocessing.text import Tokenizer from keras.callbacks import ModelCheckpoint from keras.preprocessing.sequence import pad_sequences from keras.models import load_model from keras import optimizers from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt pd.set_option('display.max_colwidth', 200) # Read raw text file def read_text(filename): with open(filename, mode='rt', encoding='utf-8') as file: text = file.read() sents = text.strip().split('\n') return [i.split('\t') for i in sents] data = read_text("deutch.txt") deu_eng = np.array(data) deu_eng = deu_eng[:30000,:] print("Dictionary size:", deu_eng.shape) # Remove punctuation deu_eng[:,0] = [s.translate(str.maketrans('', '', string.punctuation)) for s in deu_eng[:,0]] deu_eng[:,1] = [s.translate(str.maketrans('', '', string.punctuation)) for s in deu_eng[:,1]] # Convert text to lowercase for i in range(len(deu_eng)): deu_eng[i,0] = deu_eng[i,0].lower() deu_eng[i,1] = deu_eng[i,1].lower() # Prepare English tokenizer eng_tokenizer = Tokenizer() eng_tokenizer.fit_on_texts(deu_eng[:, 0]) eng_vocab_size = len(eng_tokenizer.word_index) + 1 eng_length = 8 # Prepare Deutch tokenizer deu_tokenizer = Tokenizer() deu_tokenizer.fit_on_texts(deu_eng[:, 1]) deu_vocab_size = len(deu_tokenizer.word_index) + 1 deu_length = 8 # Encode and pad sequences def encode_sequences(tokenizer, length, lines): # integer encode sequences seq = tokenizer.texts_to_sequences(lines) # pad sequences with 0 values seq = pad_sequences(seq, maxlen=length, padding='post') return seq # Split data into train and test set train, test = train_test_split(deu_eng, test_size=0.2, random_state=12) # Prepare training data trainX = encode_sequences(eng_tokenizer, eng_length, train[:, 0]) trainY = encode_sequences(deu_tokenizer, deu_length, train[:, 1]) # Prepare validation data testX = encode_sequences(eng_tokenizer, eng_length, test[:, 0]) testY = encode_sequences(deu_tokenizer, deu_length, test[:, 1]) # Build NMT model def make_model(in_vocab, out_vocab, in_timesteps, out_timesteps, n): model = Sequential() model.add(Embedding(in_vocab, n, input_length=in_timesteps, mask_zero=True)) model.add(LSTM(n)) model.add(Dropout(0.3)) model.add(RepeatVector(out_timesteps)) model.add(LSTM(n, return_sequences=True)) model.add(Dropout(0.3)) model.add(Dense(out_vocab, activation='softmax')) model.compile(optimizer=optimizers.RMSprop(lr=0.001), loss='sparse_categorical_crossentropy') return model print("deu_vocab_size:", deu_vocab_size, deu_length) print("eng_vocab_size:", eng_vocab_size, eng_length) # Model compilation (with 512 hidden units) model = make_model(eng_vocab_size, deu_vocab_size, eng_length, deu_length, 512) # Train model num_epochs = 250 history = model.fit(trainX, trainY.reshape(trainY.shape[0], trainY.shape[1], 1), epochs=num_epochs, batch_size=512, validation_split=0.2, callbacks=None, verbose=1) # plt.plot(history.history['loss']) # plt.plot(history.history['val_loss']) # plt.legend(['train','validation']) # plt.show() model.save('en-de-model.h5') # Load model model = load_model('en-de-model.h5') def get_word(n, tokenizer): if n == 0: return "" for word, index in tokenizer.word_index.items(): if index == n: return word return "" phrs_enc = encode_sequences(eng_tokenizer, eng_length, ["the weather is nice today", "my name is tom", "how old are you", "where is the nearest shop"]) print("phrs_enc:", phrs_enc.shape) preds = model.predict_classes(phrs_enc) print("Preds:", preds.shape) print(preds[0]) print(get_word(preds[0][0], deu_tokenizer), get_word(preds[0][1], deu_tokenizer), get_word(preds[0][2], deu_tokenizer), get_word(preds[0][3], deu_tokenizer)) print(preds[1]) print(get_word(preds[1][0], deu_tokenizer), get_word(preds[1][1], deu_tokenizer), get_word(preds[1][2], deu_tokenizer), get_word(preds[1][3], deu_tokenizer)) print(preds[2]) print(get_word(preds[2][0], deu_tokenizer), get_word(preds[2][1], deu_tokenizer), get_word(preds[2][2], deu_tokenizer), get_word(preds[2][3], deu_tokenizer)) print(preds[3]) print(get_word(preds[3][0], deu_tokenizer), get_word(preds[3][1], deu_tokenizer), get_word(preds[3][2], deu_tokenizer), get_word(preds[3][3], deu_tokenizer)) print() 


рд╢рдмреНрджрдХреЛрд╢ рд╣реА рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ, рд▓рд┐рдВрдХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╣реИред

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╕рднреА рд╕рдлрд▓ рдкреНрд░рдпреЛрдЧред

Source: https://habr.com/ru/post/hi470706/


All Articles