File size: 3,178 Bytes
16d5400
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import word_emb
from m_conf import *
import numpy as np
from gensim.models import Word2Vec
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Embedding
from keras_self_attention import SeqSelfAttention, SeqWeightedAttention
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.losses import MeanSquaredError
from tensorflow.keras.preprocessing.sequence import pad_sequences

w2v = Word2Vec.load("w2v.model")

# загрузка датасета
with open('train.txt', 'r') as file:
    text = file.readlines()

# создание Tokenizerа
tokenizer = Tokenizer()
# обучение Tokenizer на основе текста из train.txt
tokenizer.fit_on_texts(text)

# преобразование текстовых данных в последовательности целых чисел с помощью объекта tokenizer
tt = tokenizer.texts_to_sequences(text)

t_sw = [[line[i:i+input_length] for i in range(len(line))] for line in tt]

combined_list = []

for line in t_sw:
    combined_list.extend(line)

y_t = [[w2v.wv[str(token)] for token in line] for line in tt]

y = []
for line in y_t:
    y.extend(line)

# задать длинну входа до переменной input_length, заполняя пустоту нулями
X = pad_sequences(combined_list, maxlen=input_length, padding='pre')

# получаем количество токенов в тексте
vocab_size = len(tokenizer.word_index)

# создание модели машинного обучения и задание её параметров
model = Sequential()
emb = Embedding(input_dim=vocab_size+1, output_dim=emb_dim, input_length=input_length)
model.add(emb)
model.add(SeqWeightedAttention())
model.add(Flatten())
model.add(Dense(512, activation="tanh"))
model.add(Dropout(0.5))
model.add(Dense(256, activation="tanh"))
model.add(Dropout(0.5))
model.add(Dense(128, activation="tanh"))
model.add(Dense(emb_o_dim, activation="tanh"))

# компилирование модели с функцией потерь mse и отображением accuracy
model.compile(optimizer=Adam(learning_rate=0.001), loss="mse", metrics=["accuracy"])

# обучение модели
set_limit = 2000
model.fit(np.array(X[:set_limit]), np.array(y[:set_limit]), epochs=10, batch_size=4)

def find_closest_token(o, temperature=0.0, top_p=1):
    token_distances = []
    for token in w2v.wv.index_to_key:
        vector = w2v.wv[token]
        distance = np.sum((o - vector)**2)
        token_distances.append((token, distance))

    token_distances = sorted(token_distances, key=lambda x: x[1])
    closest_token = token_distances[0][0]

    return closest_token

def gen(text):
    # преобразовать текст в понимаемую нейросетью информацию
    inp = pad_sequences(tokenizer.texts_to_sequences([text]), maxlen=input_length, padding='pre')
    # сделать предположение и его возвратить
    return str(tokenizer.index_word[int(find_closest_token(model.predict(inp)[0]))])