Norgan97 commited on
Commit
a487402
1 Parent(s): 3409be0
pages/__init__.py ADDED
File without changes
pages/__pycache__/__init__.cpython-310.pyc ADDED
Binary file (144 Bytes). View file
 
pages/gpt.py ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from pages.models.gptmodel import model
3
+ from pages.models.gptmodel import tokenizer
4
+ import torch
5
+ import transformers
6
+ from transformers import GPT2LMHeadModel, GPT2Tokenizer
7
+
8
+ text = st.text_input('Введите сюда вопрос или предложение для генерации текста')
9
+
10
+
11
+ temp = st.slider('Выберите значения температуры',min_value=1.0, max_value=3.0, step=0.1 )
12
+
13
+ length = st.slider('Выберите длину последовательности',min_value=1, max_value=200, step=10 )
14
+
15
+ beams = st.slider('Выберите число генераций',min_value=1, max_value=10, step=1 )
16
+
17
+
18
+ p = st.slider('Выберите значения top_p',min_value=0.5, max_value=0.9, step=0.1 )
19
+
20
+ if text:
21
+ input_ids = tokenizer.encode(text, return_tensors="pt").to('cpu')
22
+ model.eval()
23
+ with torch.no_grad():
24
+ out = model.generate(input_ids,
25
+ do_sample=True,
26
+ num_beams=beams,
27
+ temperature=temp,
28
+ top_p=p,
29
+ max_length=length,
30
+ )
31
+
32
+ st.write(list(map(tokenizer.decode, out))[0])
pages/models/.gitattributes ADDED
@@ -0,0 +1 @@
 
 
1
+ *.bin filter=lfs diff=lfs merge=lfs -text
pages/models/__pycache__/__init__.cpython-310.pyc ADDED
Binary file (151 Bytes). View file
 
pages/models/__pycache__/bert.cpython-310.pyc ADDED
Binary file (1.31 kB). View file
 
pages/models/__pycache__/gpt_model.cpython-310.pyc ADDED
Binary file (373 Bytes). View file
 
pages/models/__pycache__/gptmodel.cpython-310.pyc ADDED
Binary file (411 Bytes). View file
 
pages/models/__pycache__/ml.cpython-310.pyc ADDED
Binary file (3.2 kB). View file
 
pages/models/__pycache__/model.cpython-310.pyc ADDED
Binary file (560 Bytes). View file
 
pages/models/__pycache__/preprocessing.cpython-310.pyc ADDED
Binary file (2.35 kB). View file
 
pages/models/__pycache__/rnn.cpython-310.pyc ADDED
Binary file (5.79 kB). View file
 
pages/models/bert.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import streamlit as st
3
+ import transformers
4
+ from transformers import AutoTokenizer, AutoModel
5
+ from sklearn.linear_model import LogisticRegression
6
+ import pickle
7
+ import time
8
+
9
+
10
+ def preprocess_bert(text):
11
+ start_time = time.time()
12
+ tokenizer = AutoTokenizer.from_pretrained("cointegrated/LaBSE-en-ru")
13
+ model = AutoModel.from_pretrained("cointegrated/LaBSE-en-ru")
14
+ sentences = text
15
+ encoded_input = tokenizer(sentences, padding=True, truncation=True, max_length=500, return_tensors='pt')
16
+ with torch.no_grad():
17
+ model_output = model(**encoded_input)
18
+ embeddings = model_output.pooler_output
19
+ embeddings = torch.nn.functional.normalize(embeddings)
20
+ embeddings = embeddings.detach().cpu().numpy()
21
+
22
+ logreg = LogisticRegression(class_weight = 'balanced')
23
+ with open('pages/models/linmodel_min.pkl', 'rb') as f:
24
+ logreg = pickle.load(f)
25
+ predicted_label = logreg.predict(embeddings)
26
+ dict = {0:'Bad', 1: 'Neutral', 2:'Good'}
27
+ predicted_label_text = dict[predicted_label[0]]
28
+ end_time = time.time()
29
+
30
+ inference_time = end_time - start_time
31
+ return f'BERT {predicted_label_text} {inference_time} секунд'
pages/models/gpt/config.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "sberbank-ai/rugpt3small_based_on_gpt2",
3
+ "activation_function": "gelu_new",
4
+ "architectures": [
5
+ "GPT2LMHeadModel"
6
+ ],
7
+ "attn_pdrop": 0.1,
8
+ "bos_token_id": 50256,
9
+ "embd_pdrop": 0.1,
10
+ "eos_token_id": 50256,
11
+ "gradient_checkpointing": false,
12
+ "initializer_range": 0.02,
13
+ "layer_norm_epsilon": 1e-05,
14
+ "model_type": "gpt2",
15
+ "n_ctx": 2048,
16
+ "n_embd": 768,
17
+ "n_head": 12,
18
+ "n_inner": null,
19
+ "n_layer": 12,
20
+ "n_positions": 2048,
21
+ "reorder_and_upcast_attn": false,
22
+ "resid_pdrop": 0.1,
23
+ "scale_attn_by_inverse_layer_idx": false,
24
+ "scale_attn_weights": true,
25
+ "summary_activation": null,
26
+ "summary_first_dropout": 0.1,
27
+ "summary_proj_to_labels": true,
28
+ "summary_type": "cls_index",
29
+ "summary_use_proj": true,
30
+ "torch_dtype": "float32",
31
+ "transformers_version": "4.35.0",
32
+ "use_cache": true,
33
+ "vocab_size": 50264
34
+ }
pages/models/gpt/generation_config.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "_from_model_config": true,
3
+ "bos_token_id": 50256,
4
+ "eos_token_id": 50256,
5
+ "transformers_version": "4.35.0"
6
+ }
pages/models/gptmodel.py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ import transformers
2
+ from transformers import GPT2LMHeadModel, GPT2Tokenizer
3
+ import torch
4
+
5
+
6
+ model_name_or_path = 'pages/models/gpt'
7
+ tokenizer = GPT2Tokenizer.from_pretrained('sberbank-ai/rugpt3small_based_on_gpt2')
8
+ model = GPT2LMHeadModel.from_pretrained(model_name_or_path).to('cpu')
pages/models/linmodel_min.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:148553a6a4b8f1a036e93d848c2779c9fd02a848cc3c1bebe5bdecb4c7378548
3
+ size 19179
pages/models/ml.py ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import numpy as np
3
+ # from pages.models.model import model_ml
4
+ # from pages.models.preprocessing import preprocess
5
+ import joblib
6
+ import time
7
+ from sklearn.metrics import f1_score
8
+
9
+
10
+
11
+
12
+ from sklearn.feature_extraction.text import TfidfVectorizer
13
+
14
+
15
+ # from flask import Flask, render_template, request
16
+ from sklearn.feature_extraction.text import TfidfVectorizer
17
+ from sklearn.linear_model import LogisticRegression
18
+ # from tensorflow.keras.models import Sequential
19
+ # from tensorflow.keras.layers import Embedding, LSTM, Dense
20
+ from transformers import BertTokenizer, TFBertForSequenceClassification
21
+ import tensorflow as tf
22
+ import time
23
+ import pandas as pd
24
+ import joblib
25
+ from sklearn.metrics import accuracy_score, classification_report
26
+
27
+
28
+
29
+ model_ml = LogisticRegression()
30
+
31
+ # Предобработка данных
32
+
33
+ stop_list = ['уже', 'была', 'зачем', 'с', 'сейчас', 'чего', 'нельзя', 'только', 'над', 'всего', 'под', 'эту', 'тебя', 'перед', 'им', 'себя', 'есть',
34
+ 'вдруг', 'вам', 'нас', 'может', 'тут', 'надо', 'в', 'ты', 'чтоб', 'все', 'ним', 'ни', 'этого', 'раз', 'всю', 'того', 'два', 'а', 'я',
35
+ 'здесь', 'чуть', 'конечно', 'было', 'ей', 'уж', 'они', 'него', 'тем', 'том', 'куда', 'для', 'от', 'при', 'так', 'никогда', 'и', 'нибудь',
36
+ 'потому', 'до', 'или', 'то', 'ее', 'чтобы', 'между', 'через', 'она', 'такой', 'его', 'сам', 'моя', 'свою', 'много', 'впрочем', 'этой',
37
+ 'три', 'один', 'тот', 'хорошо', 'совсем', 'всегда', 'что', 'там', 'тогда', 'но', 'нее', 'меня', 'ней', 'как', 'себе', 'нет', 'со', 'если',
38
+ 'лучше', 'них', 'ж', 'какая', 'вот', 'быть', 'из', 'где', 'всех', 'их', 'после', 'больше', 'был', 'про', 'ведь', 'какой', 'этот', 'он',
39
+ 'об', 'теперь', 'будет', 'когда', 'ему', 'более', 'ну', 'наконец', 'кто', 'иногда', 'почти', 'можно', 'были', 'чем', 'хоть', 'этом', 'вас',
40
+ 'ли', 'тоже', 'мы', 'не', 'потом', 'еще', 'к', 'на', 'во', 'да', 'мне', 'бы', 'опять', 'разве', 'вы', 'эти', 'у', 'ничего', 'без', 'мой',
41
+ 'будто', 'за', 'по', 'о', 'другой', 'даже', 'же']
42
+ # Создание экземпляра TfidfVectorizer и преобразование текста в векторы признаков
43
+ vectorizer = joblib.load("pages/models/vectorizer_weights.pkl")
44
+
45
+
46
+ def preprocess(text):
47
+ # Убедитесь, что text - это список
48
+ if isinstance(text, str):
49
+ text = [text]
50
+ # Преобразуйте текст
51
+ text = vectorizer.transform(text)
52
+
53
+ return text
54
+
55
+ model = model_ml
56
+ model = joblib.load("pages/models/model_weights1.pkl")
57
+
58
+
59
+
60
+ def predict(text):
61
+ start_time = time.time()
62
+ text = preprocess(text)
63
+ predicted_label = model.predict(text)
64
+ dict = {0:'Bad', 1: 'Neutral', 2:'Good'}
65
+ predicted_label_text = dict[predicted_label[0]]
66
+ end_time = time.time()
67
+
68
+ inference_time = end_time - start_time
69
+
70
+ return f'Classic ML {predicted_label_text} {inference_time} секунд'
71
+
pages/models/model_weights1.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4684803b198e3f8566956ca0e88d20085938f5f924b165e0d6d6a30e6987f1df
3
+ size 6879
pages/models/rnn.py ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import nltk
3
+ nltk.download('stopwords')
4
+
5
+ import os
6
+ import numpy as np
7
+ import pandas as pd
8
+
9
+ import matplotlib.pyplot as plt
10
+
11
+ import re
12
+ import string
13
+ from collections import Counter
14
+
15
+ from nltk.corpus import stopwords
16
+
17
+ import streamlit as st
18
+
19
+ import torch
20
+ from torch.utils.data import DataLoader, TensorDataset
21
+ import torch.nn as nn
22
+ import torchutils as tu
23
+
24
+ from dataclasses import dataclass
25
+ russian_stopwords = stopwords.words("russian")
26
+
27
+ from dataclasses import dataclass
28
+ import json
29
+ import time
30
+ with open('pages/models/vocab_to_int.json', 'r') as json_file:
31
+ json_data = json_file.read()
32
+
33
+ vocab_to_int = json.loads(json_data)
34
+
35
+ def data_preprocessing(text: str) -> str:
36
+ """preprocessing string: lowercase, removing html-tags, punctuation and stopwords
37
+
38
+ Args:
39
+ text (str): input string for preprocessing
40
+
41
+ Returns:
42
+ str: preprocessed string
43
+ """
44
+
45
+ text = text.lower()
46
+ text = re.sub("<.*?>", "", text) # html tags
47
+ text = "".join([c for c in text if c not in string.punctuation])
48
+ splitted_text = [word for word in text.split() if word not in russian_stopwords]
49
+ text = " ".join(splitted_text)
50
+ return text
51
+
52
+ def padding(review_int: list, seq_len: int) -> np.array:
53
+ """Make left-sided padding for input list of tokens
54
+
55
+ Args:
56
+ review_int (list): input list of tokens
57
+ seq_len (int): max length of sequence, it len(review_int[i]) > seq_len it will be trimmed, else it will be padded by zeros
58
+
59
+ Returns:
60
+ np.array: padded sequences
61
+ """
62
+ features = np.zeros((36591, seq_len), dtype=int)
63
+ for i, review in enumerate(review_int):
64
+ if len(review) <= seq_len:
65
+ zeros = list(np.zeros(seq_len - len(review)))
66
+ new = zeros + review
67
+ else:
68
+ new = review[:seq_len]
69
+ features[i, :] = np.array(new)
70
+
71
+ return features
72
+
73
+ def preprocess_single_string(
74
+ input_string: str,
75
+ seq_len: int,
76
+ vocab_to_int: dict = vocab_to_int
77
+ ) -> torch.Tensor:
78
+ """Function for all preprocessing steps on a single string
79
+
80
+ Args:
81
+ input_string (str): input single string for preprocessing
82
+ seq_len (int): max length of sequence, it len(review_int[i]) > seq_len it will be trimmed, else it will be padded by zeros
83
+ vocab_to_int (dict, optional): word corpus {'word' : int index}. Defaults to vocab_to_int.
84
+
85
+ Returns:
86
+ list: preprocessed string
87
+ """
88
+
89
+ preprocessed_string = data_preprocessing(input_string)
90
+ result_list = []
91
+ for word in preprocessed_string.split():
92
+ try:
93
+ result_list.append(vocab_to_int[word])
94
+ except KeyError as e:
95
+ print(f'{e}: not in dictionary!')
96
+ result_padded = padding([result_list], seq_len)[0]
97
+
98
+ return torch.Tensor(result_padded)
99
+
100
+ class RNNNet(nn.Module):
101
+ '''
102
+ vocab_size: int, размер словаря (аргумент embedding-слоя)
103
+ emb_size: int, размер вектора для описания каждого элемента последовательности
104
+ hidden_dim: int, размер вектора скрытого состояния, default 0
105
+ batch_size: int, размер batch'а
106
+
107
+ '''
108
+
109
+ def __init__(
110
+ self,
111
+ vocab_size: int,
112
+ emb_size: int,
113
+ hidden_dim: int,
114
+ seq_len: int,
115
+ n_layers: int = 1
116
+ ) -> None:
117
+ super().__init__()
118
+
119
+ self.seq_len = seq_len
120
+ self.emb_size = emb_size
121
+ self.hidden_dim = hidden_dim
122
+ self.n_layers = n_layers
123
+ self.vocab_size = vocab_size
124
+
125
+ self.embedding = nn.Embedding(self.vocab_size, self.emb_size)
126
+ self.rnn_cell = nn.RNN(
127
+ input_size = self.emb_size,
128
+ hidden_size = self.hidden_dim,
129
+ batch_first = True,
130
+ num_layers = n_layers
131
+ )
132
+ self.linear = nn.Sequential(
133
+
134
+ nn.Linear(self.hidden_dim * self.seq_len, 16),
135
+ nn.Tanh(),
136
+ nn.Linear(16, 3)
137
+ )
138
+
139
+ def forward(self, x: torch.Tensor) -> torch.Tensor:
140
+ # self.input = x.size(0)
141
+ x = self.embedding(x.to(rnn_conf.device))
142
+ output, _ = self.rnn_cell(x)
143
+ # print(f'RNN output: {output.shape}')
144
+ output = output.contiguous().view(output.size(0), -1)
145
+ # print(f'Flatten output: {output.shape}')
146
+ out = self.linear(output.squeeze(0))
147
+ return out
148
+
149
+ SEQ_LEN = 100
150
+
151
+ @dataclass
152
+ class ConfigRNN:
153
+ vocab_size: int
154
+ device : str
155
+ n_layers : int
156
+ embedding_dim : int
157
+ hidden_size : int
158
+ seq_len : int
159
+
160
+ rnn_conf = ConfigRNN(
161
+ vocab_size = len(vocab_to_int)+1,
162
+ device='cpu',
163
+ n_layers=1,
164
+ embedding_dim=8,
165
+ hidden_size=16,
166
+ seq_len = SEQ_LEN
167
+ )
168
+
169
+ rnn_model = RNNNet(
170
+ vocab_size=rnn_conf.vocab_size,
171
+ emb_size=rnn_conf.embedding_dim,
172
+ hidden_dim=rnn_conf.hidden_size,
173
+ seq_len=rnn_conf.seq_len,
174
+ n_layers=rnn_conf.n_layers
175
+
176
+ )
177
+
178
+ rnn_model.load_state_dict(torch.load("pages/models/weights.pt"))
179
+
180
+
181
+ result = {1: "Нейтральный", 2: "Положительный", 0: "Отрицательный" }
182
+
183
+ # rnn_model.eval()
184
+ # probability = rnn_model(preprocess_single_string('Сказать, что я разочарован — ничего не сказать. Сценаристу за адаптацию шедевральной книги Р. Д. Уоллера надо что-нибудь оторвать. Нелогичные поступки, из-за невозможности перенести на экран мысли людей (не можешь не берись, на самом деле). Важные мысли и сцены из книги убраны, добавлены новые, ни к селу. Все хорошее в сценарии — из книги. Все нелепое — от сценариста. Да и затянуть до 2,15 часа короткую книгу тоже не лучший ход.\n\nК кастингу тоже вопросы. Мэрис Стрип прекрасная актриса, но Франческа — итальянка, и Стрип пришлось прибегать к ужимкам в стиле Маргариты Тереховой, что меня просто коробило. С Иствудом отдельная тема. При прочтении именно Иствуд («Роберт был высокий, худой и сильный, а двигался, как трава под ветром, плавно, без усилий. Серебристо-седые волосы прикрывали уши и шею, и, надо сказать, выглядел он всегда слегка растрепанным, как будто только что сошел на землю после путешествия по бурному морю и пытался ладонью привести волосы в порядок. Узкое лицо, высокие скулы и лоб, наполовину прикрытый волосами, на фоне которых голубые глаза смотрелись особенно ярко.») выглядел идеальным актером на роль Кинкейда. Но вот беда — Иствуд постарел. Играть в 65 пятидесятилетнего мужчину нелегко. Лет десять назад было бы намного лучше.\n\nНу и режиссура. Слабо, к сожалению. Очень поверхностно. Получилась простенькая мелодрама. А жаль, книга более чем достойная.', seq_len=SEQ_LEN).unsqueeze(0).long().to(rnn_conf.device)).sigmoid()
185
+ # print(f'{result[torch.argmax(probability).item()]} Вероятность: {probability.max():.3f}')
186
+
187
+
188
+ def pred(text):
189
+ start_time = time.time()
190
+ probability = rnn_model(preprocess_single_string(text, seq_len=SEQ_LEN).unsqueeze(0).long().to(rnn_conf.device)).sigmoid()
191
+ end_time = time.time()
192
+
193
+ inference_time = end_time - start_time
194
+ return f' RNN {result[torch.argmax(probability).item()]} {inference_time} секунд'
pages/models/vectorizer_weights.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:56fe53b0796d04cf2bcf42b240c17e1b6cbd1f7ac3fd2a7a0da0de7dc256ee6f
3
+ size 5784750
pages/models/vocab_to_int.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"—": 1, "это": 2, "фильм": 3, "очень": 4, "10": 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, "истории": 84, "самый": 85, "таких": 86, "несколько": 87, "зрителя": 88, "тех": 89, "главное": 90, "фильму": 91, "слишком": 92, "такого": 93, "актеры": 94, "думаю": 95, "момент": 96, "многие": 97, "самых": 98, "возможно": 99, "стал": 100, "однако": 101, "первый": 102, "часть": 103, "друг": 104, "этим": 105, "свой": 106, "абсолютно": 107, "конце": 108, "таким": 109, "одной": 110, "общем": 111, "режиссер": 112, "сделать": 113, "говорить": 114, "довольно": 115, "вместе": 116, "которую": 117, "те": 118, "одна": 119, "своим": 120, "части": 121, "главный": 122, "образ": 123, "изза": 124, "шедевр": 125, "понять": 126, "наверное": 127, "экране": 128, "дело": 129, "несмотря": 130, "нем": 131, "герои": 132, "мало": 133, "одного": 134, "работа": 135, "лучших": 136, "сценарий": 137, "конца": 138, "мире": 139, "сыграл": 140, "тому": 141, "других": 142, "этому": 143, "историю": 144, "жить": 145, "знаю": 146, "деле": 147, "давно": 148, "которое": 149, "становится": 150, "сюжета": 151, "стороны": 152, "понравился": 153, "собой": 154, "должен": 155, "второй": 156, "ради": 157, "одно": 158, "т": 159, "никто": 160, "минут": 161, "день": 162, "менее": 163, "отлично": 164, "точно": 165, "отметить": 166, "увидеть": 167, "двух": 168, "персонаж": 169, "вроде": 170, "практически": 171, "впечатление": 172, "слова": 173, "персонажей": 174, "чувства": 175, "кроме": 176, "9": 177, "главного": 178, "вполне": 179, "невозможно": 180, "свое": 181, "заставляет": 182, "правда": 183, "спасибо": 184, "место": 185, "оно": 186, "лучший": 187, "могут": 188, "снова": 189, "хотелось": 190, "этих": 191, "мог": 192, "пусть": 193, "года": 194, "сильно": 195, "лично": 196, "буду": 197, "интересно": 198, "сцены": 199, "полностью": 200, "картину": 201, "мультфильм": 202, "2": 203, "весьма": 204, "каждого": 205, "достаточно": 206, "честно": 207, "всей": 208, "картине": 209, "хочу": 210, "сколько": 211, "глаза": 212, "сцена": 213, "режиссера": 214, "друга": 215, "случае": 216, "скажу": 217, "играет": 218, "котором": 219, "фильмом": 220, "одним": 221, "столько": 222, "эмоции": 223, "благодаря": 224, "итоге": 225, "протяжении": 226, "кстати": 227, "пока": 228, "равно": 229, "идея": 230, "смысл": 231, "первой": 232, "целом": 233, "актер": 234, "мира": 235, "видел": 236, "прекрасно": 237, "кинематографа": 238, "както": 239, "ктото": 240, "например": 241, "говоря": 242, "главных": 243, "некоторые": 244, "такая": 245, "начала": 246, "безусловно": 247, "долго": 248, "скорее": 249, "пожалуй": 250, "хороший": 251, "воп��ос": 252, "получился": 253, "делает": 254, "часа": 255, "ричи": 256, "одном": 257, "смотрел": 258, "моменты": 259, "внимание": 260, "игру": 261, "будут": 262, "смог": 263, "казалось": 264, "персонажи": 265, "сердце": 266, "сама": 267, "делать": 268, "происходит": 269, "нолан": 270, "всетаки": 271, "другие": 272, "удалось": 273, "назвать": 274, "своими": 275, "большой": 276, "вся": 277, "либо": 278, "найти": 279, "дальше": 280, "детей": 281, "обязательно": 282, "актёров": 283, "юмор": 284, "люблю": 285, "считаю": 286, "самой": 287, "людям": 288, "игры": 289, "фильмах": 290, "имеет": 291, "сами": 292, "1": 293, "первых": 294, "души": 295, "хотел": 296, "получилось": 297, "слов": 298, "столь": 299, "говорит": 300, "многих": 301, "сложно": 302, "кого": 303, "уровне": 304, "эмоций": 305, "конец": 306, "деньги": 307, "спецэффекты": 308, "какойто": 309, "зритель": 310, "понятно": 311, "зрителей": 312, "самым": 313, "3": 314, "тебе": 315, "показать": 316, "пор": 317, "ощущение": 318, "мысли": 319, "холмса": 320, "часто": 321, "вызывает": 322, "стать": 323, "холмс": 324, "чувство": 325, "хочет": 326, "смотрится": 327, "ибо": 328, "самые": 329, "далеко": 330, "своем": 331, "8": 332, "работу": 333, "зрителю": 334, "которым": 335, "посмотрел": 336, "знает": 337, "значит": 338, "вокруг": 339, "той": 340, "атмосферу": 341, "персонажа": 342, "видеть": 343, "жаль": 344, "порой": 345, "сделал": 346, "самая": 347, "иначе": 348, "образом": 349, "первую": 350, "жанра": 351, "атмосфера": 352, "создатели": 353, "настоящий": 354, "мере": 355, "стало": 356, "году": 357, "насколько": 358, "никак": 359, "состав": 360, "сожалению": 361, "остается": 362, "трудно": 363, "выше": 364, "первого": 365, "задуматься": 366, "человеком": 367, "ps": 368, "выглядит": 369, "новый": 370, "душе": 371, "приятно": 372, "душу": 373, "событий": 374, "среди": 375, "начале": 376, "исполнении": 377, "плохо": 378, "великолепно": 379, "работы": 380, "просмотре": 381, "очередной": 382, "отличный": 383, "понравилось": 384, "явно": 385, "очередь": 386, "итог": 387, "вовсе": 388, "месте": 389, "видим": 390, "мнение": 391, "снимать": 392, "причем": 393, "смотря": 394, "должны": 395, "постоянно": 396, "особо": 397, "понравилась": 398, "бывает": 399, "5": 400, "слово": 401, "актёры": 402, "показывает": 403, "другого": 404, "заслуживает": 405, "любой": 406, "тема": 407, "невероятно": 408, "юмора": 409, "раньше": 410, "всему": 411, "решил": 412, "главной": 413, "нравится": 414, "пару": 415, "стала": 416, "снять": 417, "которому": 418, "важно": 419, "чему": 420, "идет": 421, "своему": 422, "понял": 423, "словно": 424, "нечто": 425, "начинает": 426, "назад": 427, "смерти": 428, "нами": 429, "действия": 430, "пытается": 431, "одну": 432, "легко": 433, "желание": 434, "хуже": 435, "внимания": 436, "оценка": 437, "сих": 438, "актера": 439, "диалоги": 440, "нолана": 441, "сначала": 442, "мысль": 443, "остальные": 444, "касается": 445, "саундтрек": 446, "дикаприо": 447, "буквально": 448, "сцен": 449, "собственно": 450, "понимаю": 451, "войны": 452, "год": 453, "такую": 454, "количество": 455, "своё": 456, "множество": 457, "интересный": 458, "фоне": 459, "получил": 460, "скорсезе": 461, "моментов": 462, "верить": 463, "начало": 464, "игрой": 465, "говорят": 466, "данный": 467, "книги": 468, "любит": 469, "против": 470, "голове": 471, "две": 472, "«начало»": 473, "драма": 474, "наоборот": 475, "должно": 476, "плюс": 477, "понастоящему": 478, "та": 479, "моих": 480, "главная": 481, "ними": 482, "игре": 483, "смысла": 484, "дети": 485, "путь": 486, "оскар": 487, "разных": 488, "другом": 489, "смотрела": 490, "кому": 491, "актерский": 492, "гораздо": 493, "первая": 494, "сказал": 495, "добрый": 496, "любимых": 497, "оказывается": 498, "никаких": 499, "события": 500, "каждому": 501, "д": 502, "отца": 503, "каким": 504, "просмотр": 505, "наш": 506, "посмотрела": 507, "какие": 508, "советую": 509, "вещи": 510, "нём": 511, "нашей": 512, "глазами": 513, "наши": 514, "пути": 515, "проблемы": 516, "играть": 517, "гдето": 518, "разные": 519, "всеми": 520, "человеку": 521, "зря": 522, "увидел": 523, "стали": 524, "7": 525, "сути": 526, "естественно": 527, "плане": 528, "денег": 529, "финал": 530, "смысле": 531, "тему": 532, "лица": 533, "снят": 534, "девушка": 535, "голову": 536, "мои": 537, "видно": 538, "действие": 539, "впервые": 540, "режиссёр": 541, "века": 542, "моей": 543, "идеи": 544, "имя": 545, "таки": 546, "единственный": 547, "обычно": 548, "меньше": 549, "одновременно": 550, "представить": 551, "другим": 552, "красиво": 553, "смерть": 554, "видимо": 555, "рядом": 556, "прежде": 557, "идеально": 558, "жизнью": 559, "сказка": 560, "4": 561, "зато": 562, "шутки": 563, "вновь": 564, "итак": 565, "снял": 566, "принципе": 567, "браво": 568, "людьми": 569, "дома": 570, "кристофер": 571, "дает": 572, "отец": 573, "некоторых": 574, "смотришь": 575, "понимаешь": 576, "видела": 577, "показал": 578, "роберт": 579, "многое": 580, "счастье": 581, "реальность": 582, "концовка": 583, "чемто": 584, "ту": 585, "хватает": 586, "мое": 587, "получается": 588, "сыграли": 589, "вряд": 590, "начинается": 591, "хорош": 592, "впечатления": 593, "думать": 594, "намного": 595, "глазах": 596, "факт": 597, "нового": 598, "ситуации": 599, "возможность": 600, "сон": 601, "главные": 602, "сыграть": 603, "каждом": 604, "местами": 605, "руки": 606, "памяти": 607, "чегото": 608, "знаете": 609, "искренне": 610, "огромное": 611, "данном": 612, "сторону": 613, "появляется": 614, "нашего": 615, "джокер": 616, "посмотрите": 617, "джон": 618, "замечательный": 619, "другое": 620, "лучшая": 621, "книгу": 622, "оказался": 623, "друзей": 624, "нему": 625, "любить": 626, "сможет": 627, "странно": 628, "отношения": 629, "реальности": 630, "навсегда": 631, "передать": 632, "каждая": 633, "шерлока": 634, "потрясающий": 635, "могла": 636, "главным": 637, "писать": 638, "места": 639, "всётаки": 640, "единственное": 641, "посмотрев": 642, "комедия": 643, "лицо": 644, "осталось": 645, "новое": 646, "смотрите": 647, "справился": 648, "музыку": 649, "таком": 650, "талант": 651, "пересматривать": 652, "играют": 653, "сегодня": 654, "внутри": 655, "смешно": 656, "речь": 657, "правильно": 658, "ленты": 659, "неплохо": 660, "годы": 661, "лице": 662, "ко": 663, "героиня": 664, "последние": 665, "вышел": 666, "хорошее": 667, "просмотру": 668, "дела": 669, "вместо": 670, "удовольствие": 671, "актерская": 672, "героем": 673, "виде": 674, "удивительно": 675, "глаз": 676, "парень": 677, "новые": 678, "каждой": 679, "понимает": 680, "выбор": 681, "ролью": 682, "сделали": 683, "наше": 684, "знал": 685, "название": 686, "сюжетом": 687, "хорошего": 688, "неё": 689, "прекрасный": 690, "вопервых": 691, "шерлок": 692, "начинаешь": 693, "семьи": 694, "несомненно": 695, "крайне": 696, "помоему": 697, "должна": 698, "красивая": 699, "наших": 700, "идею": 701, "майкл": 702, "времена": 703, "отдельно": 704, "великолепный": 705, "оставляет": 706, "суть": 707, "какието": 708, "такими": 709, "безумно": 710, "хорошие": 711, "«я": 712, "слезы": 713, "первые": 714, "творение": 715, "изменить": 716, "большинство": 717, "простой": 718, "джек": 719, "могли": 720, "никакой": 721, "ясно": 722, "тарантино": 723, "зрения": 724, "настроение": 725, "жанр": 726, "редко": 727, "способен": 728, "идти": 729, "книге": 730, "гай": 731, "детства": 732, "судьба": 733, "однажды": 734, "ответ": 735, "нечего": 736, "живет": 737, "последнее": 738, "актёр": 739, "никого": 740, "спецэффектов": 741, "город": 742, "чувств": 743, "наблюдать": 744, "словами": 745, "создал": 746, "будь": 747, "моему": 748, "данной": 749, "комедии": 750, "мной": 751, "последний": 752, "эпизод": 753, "полной": 754, "ждать": 755, "когото": 756, "момента": 757, "вторая": 758, "создать": 759, "самому": 760, "точнее": 761, "леонардо": 762, "почемуто": 763, "замечательно": 764, "триллер": 765, "готов": 766, "спустя": 767, "первое": 768, "делают": 769, "высоте": 770, "силы": 771, "декорации": 772, "дауни": 773, "6": 774, "остальных": 775, "настоящая": 776, "радует": 777, "данного": 778, "героями": 779, "война": 780, "видели": 781, "поставить": 782, "лоу": 783, "вопросы": 784, "прямо": 785, "наверно": 786, "ролей": 787, "присутствует": 788, "станет": 789, "похож": 790, "помочь": 791, "пример": 792, "сына": 793, "страх": 794, "оказалось": 795, "ума": 796, "сыграла": 797, "поверить": 798, "следует": 799, "детям": 800, "степени": 801, "видит": 802, "каждым": 803, "показывают": 804, "судьбы": 805, "минуты": 806, "сказки": 807, "друзья": 808, "ставлю": 809, "написать": 810, "страшно": 811, "напоминает": 812, "однозначно": 813, "затем": 814, "сюжете": 815, "уверен": 816, "мнению": 817, "ди": 818, "произведение": 819, "думал": 820, "характер": 821, "города": 822, "быстро": 823, "будущее": 824, "жанре": 825, "экрана": 826, "кадре": 827, "герою": 828, "происходящего": 829, "маленький": 830, "отношение": 831, "чём": 832, "точки": 833, "продолжение": 834, "любимый": 835, "актриса": 836, "гая": 837, "ватсон": 838, "возникает": 839, "никакого": 840, "поскольку": 841, "приходится": 842, "цели": 843, "отличная": 844, "линия": 845, "общества": 846, "потрясающе": 847, "картин": 848, "рецензии": 849, "пачино": 850, "останется": 851, "ждал": 852, "случайно": 853, "поводу": 854, "детстве": 855, "джонни": 856, "миру": 857, "поняла": 858, "хатико": 859, "добро": 860, "помню": 861, "любого": 862, "100": 863, "актерской": 864, "молодой": 865, "сильный": 866, "концов": 867, "чарли": 868, "тяжело": 869, "вспомнить": 870, "далее": 871, "выхода": 872, "человеке": 873, "увы": 874, "крайней": 875, "кинематограф": 876, "забыть": 877, "ожидал": 878, "войне": 879, "имени": 880, "рода": 881, "другу": 882, "взять": 883, "гениальный": 884, "мультфильма": 885, "исключительно": 886, "каприо": 887, "настоящее": 888, "равнодушным": 889, "дать": 890, "существует": 891, "образы": 892, "словом": 893, "всяких": 894, "жена": 895, "многим": 896, "джона": 897, "женщина": 898, "многом": 899, "большое": 900, "боевик": 901, "поступки": 902, "де": 903, "режиссёра": 904, "проблема": 905, "остался": 906, "отсутствие": 907, "надеюсь": 908, "поражает": 909, "дом": 910, "помимо": 911, "рассказывает": 912, "качестве": 913, "само": 914, "веришь": 915, "энди": 916, "здорово": 917, "увидела": 918, "дух": 919, "никому": 920, "часов": 921, "главную": 922, "вовторых": 923, "боль": 924, "получилась": 925, "приходит": 926, "когдато": 927, "кем": 928, "море": 929, "сопровождение": 930, "мечты": 931, "оба": 932, "фраза": 933, "3d": 934, "подумать": 935, "мать": 936, "зрители": 937, "свет": 938, "умеет": 939, "девушки": 940, "пришлось": 941, "хорошая": 942, "кинематографе": 943, "подобного": 944, "знают": 945, "самую": 946, "являются": 947, "одни": 948, "джека": 949, "джокера": 950, "шуток": 951, "героини": 952, "сердца": 953, "силу": 954, "выходит": 955, "большим": 956, "работе": 957, "рекомендую": 958, "кристофера": 959, "типа": 960, "любят": 961, "узнать": 962, "свете": 963, "оценку": 964, "непонятно": 965, "знать": 966, "происходящее": 967, "начал": 968, "счастья": 969, "отличие": 970, "глубоко": 971, "песни": 972, "второго": 973, "названием": 974, "классика": 975, "качества": 976, "картинка": 977, "музыкальное": 978, "подходит": 979, "сын": 980, "блестяще": 981, "дней": 982, "дружба": 983, "которыми": 984, "своём": 985, "получить": 986, "голос": 987, "лучшее": 988, "плохой": 989, "понравится": 990, "20": 991, "сценария": 992, "сказано": 993, "первом": 994, "помогает": 995, "описать": 996, "россии": 997, "постепенно": 998, "ожидания": 999, "мальчик": 1000, "интерес": 1001, "трилогии": 1002, "реально": 1003, "раза": 1004, "снято": 1005, "великолепная": 1006, "откровенно": 1007, "мультик": 1008, "разумеется": 1009, "юмором": 1010, "зло": 1011, "обычный": 1012, "операторская": 1013, "успех": 1014, "ближе": 1015, "цель": 1016, "лучшим": 1017, "доктор": 1018, "режиссура": 1019, "сравнивать": 1020, "любом": 1021, "могло": 1022, "желания": 1023, "великолепен": 1024, "большая": 1025, "говорил": 1026, "помощью": 1027, "хорошим": 1028, "учит": 1029, "решила": 1030, "известно": 1031, "хороших": 1032, "смело": 1033, "создателей": 1034, "настоящей": 1035, "дня": 1036, "великого": 1037, "хотите": 1038, "лучшего": 1039, "красивый": 1040, "живут": 1041, "хотели": 1042, "план": 1043, "гениально": 1044, "самим": 1045, "сей": 1046, "фразы": 1047, "роберта": 1048, "искусства": 1049, "сцене": 1050, "лента": 1051, "ощущения": 1052, "the": 1053, "подобных": 1054, "сомнения": 1055, "прекрасная": 1056, "сильнее": 1057, "проблем": 1058, "произведения": 1059, "случай": 1060, "«не": 1061, "великий": 1062, "дыхании": 1063, "прошлого": 1064, "шедевром": 1065, "музыки": 1066, "можем": 1067, "экран": 1068, "аль": 1069, "рецензию": 1070, "стиле": 1071, "«а": 1072, "сне": 1073, "линии": 1074, "драмы": 1075, "концу": 1076, "мозг": 1077, "говорю": 1078, "играл": 1079, "иствуд": 1080, "держит": 1081, "наверняка": 1082, "будем": 1083, "жалко": 1084, "настоящего": 1085, "«в": 1086, "новой": 1087, "недавно": 1088, "заметить": 1089, "неужели": 1090, "женщины": 1091, "образе": 1092, "семья": 1093, "любовью": 1094, "звучит": 1095, "бюджет": 1096, "числе": 1097, "вами": 1098, "проклятых»": 1099, "потрясающая": 1100, "угодно": 1101, "заставляют": 1102, "…": 1103, "показано": 1104, "людях": 1105, "другими": 1106, "«оскар»": 1107, "детали": 1108, "ребенка": 1109, "разу": 1110, "времен": 1111, "ватсона": 1112, "начиная": 1113, "гений": 1114, "похоже": 1115, "уровень": 1116, "временем": 1117, "сцену": 1118, "личности": 1119, "глубины": 1120, "героям": 1121, "ничем": 1122, "реальных": 1123, "искать": 1124, "интересен": 1125, "парня": 1126, "спасти": 1127, "сумел": 1128, "минус": 1129, "душа": 1130, "вечно": 1131, "минимум": 1132, "настоящим": 1133, "знаешь": 1134, "начать": 1135, "пытаются": 1136, "отличается": 1137, "находится": 1138, "оскара": 1139, "напряжении": 1140, "мирового": 1141, "сил": 1142, "пять": 1143, "сказку": 1144, "режиссеру": 1145, "порадовал": 1146, "смогли": 1147, "основном": 1148, "понравились": 1149, "полный": 1150, "невольно": 1151, "яркий": 1152, "показали": 1153, "нужны": 1154, "вижу": 1155, "каждую": 1156, "необходимо": 1157, "книга": 1158, "фильмам": 1159, "изначально": 1160, "хит": 1161, "оценки": 1162, "смеяться": 1163, "слегка": 1164, "сна": 1165, "смотрю": 1166, "кинотеатре": 1167, "нашем": 1168, "доктора": 1169, "решили": 1170, "захватывает": 1171, "собаки": 1172, "родителей": 1173, "идёт": 1174, "понимать": 1175, "каждое": 1176, "последнего": 1177, "бороться": 1178, "чудо": 1179, "керри": 1180, "уилл": 1181, "удачно": 1182, "похв��л": 1183, "надежду": 1184, "ходу": 1185, "право": 1186, "минуту": 1187, "бред": 1188, "кадров": 1189, "ожидала": 1190, "человеческой": 1191, "нужен": 1192, "душой": 1193, "ужас": 1194, "последних": 1195, "стиль": 1196, "успеха": 1197, "позже": 1198, "смотрели": 1199, "ладно": 1200, "оценить": 1201, "наша": 1202, "выделить": 1203, "находит": 1204, "вывод": 1205, "показалось": 1206, "дабы": 1207, "заставить": 1208, "хотят": 1209, "интересное": 1210, "сделано": 1211, "достойно": 1212, "компании": 1213, "частью": 1214, "лучшую": 1215, "сша": 1216, "авторы": 1217, "комуто": 1218, "зрителям": 1219, "красивые": 1220, "темы": 1221, "остальное": 1222, "положительных": 1223, "бэтмена": 1224, "скучно": 1225, "секунду": 1226, "дочь": 1227, "вышло": 1228, "пародия": 1229, "подобные": 1230, "поистине": 1231, "бог": 1232, "новых": 1233, "костюмы": 1234, "относится": 1235, "приключения": 1236, "будучи": 1237, "глупо": 1238, "спокойно": 1239, "пересмотреть": 1240, "личность": 1241, "создателям": 1242, "оставить": 1243, "славу": 1244, "участием": 1245, "поздно": 1246, "кинотеатр": 1247, "идут": 1248, "собственной": 1249, "возможности": 1250, "ранее": 1251, "смешной": 1252, "головы": 1253, "экранизация": 1254, "плакать": 1255, "сто": 1256, "«как": 1257, "показана": 1258, "отзывы": 1259, "зла": 1260, "смогла": 1261, "большую": 1262, "позволяет": 1263, "представляет": 1264, "надежда": 1265, "стране": 1266, "работой": 1267, "переживания": 1268, "повествования": 1269, "середине": 1270, "откуда": 1271, "баллов": 1272, "шанс": 1273, "воспоминания": 1274, "остаётся": 1275, "интересным": 1276, "удовольствием": 1277, "превосходно": 1278, "хотела": 1279, "надежды": 1280, "ярко": 1281, "вызывают": 1282, "настоящие": 1283, "можешь": 1284, "пол": 1285, "моего": 1286, "считать": 1287, "одному": 1288, "неожиданно": 1289, "бесконечно": 1290, "эффект": 1291, "огромный": 1292, "говорится": 1293, "думала": 1294, "жены": 1295, "радость": 1296, "положительные": 1297, "дают": 1298, "мальчика": 1299, "оставил": 1300, "миллионов": 1301, "наконецто": 1302, "остаться": 1303, "восторге": 1304, "рыцарь»": 1305, "подругому": 1306, "майкла": 1307, "амели": 1308, "вне": 1309, "нежели": 1310, "нескольких": 1311, "начинают": 1312, "какаято": 1313, "прошлое": 1314, "кадры": 1315, "меняется": 1316, "добра": 1317, "чувствуется": 1318, "туда": 1319, "придется": 1320, "земле": 1321, "сравнению": 1322, "память": 1323, "мистер": 1324, "неплохой": 1325, "мировой": 1326, "мною": 1327, "произошло": 1328, "лучшие": 1329, "заставил": 1330, "моё": 1331, "оторваться": 1332, "ужасно": 1333, "вопросов": 1334, "режиссером": 1335, "сны": 1336, "становятся": 1337, "девушку": 1338, "крови": 1339, "современного": 1340, "обо": 1341, "радости": 1342, "читал": 1343, "убить": 1344, "пойти": 1345, "просмотром": 1346, "достоин": 1347, "бэтмен": 1348, "короля": 1349, "матери": 1350, "семью": 1351, "исключением": 1352, "экранизации": 1353, "домой": 1354, "сюжету": 1355, "вид": 1356, "кроу": 1357, "«": 1358, "повествование": 1359, "событиях": 1360, "причём": 1361, "руку": 1362, "ждет": 1363, "сценаристы": 1364, "актёра": 1365, "смех": 1366, "справились": 1367, "кадр": 1368, "плана": 1369, "случилось": 1370, "спейси": 1371, "остались": 1372, "первым": 1373, "подобное": 1374, "какое": 1375, "зная": 1376, "большей": 1377, "всём": 1378, "список": 1379, "руках": 1380, "мимо": 1381, "последней": 1382, "другая": 1383, "крис": 1384, "поначалу": 1385, "смыслом": 1386, "любимой": 1387, "ряд": 1388, "наиболее": 1389, "долларов": 1390, "посвоему": 1391, "решает": 1392, "рапунцель": 1393, "родители": 1394, "дружбе": 1395, "иметь": 1396, "шаг": 1397, "замечатель��ая": 1398, "реальной": 1399, "выглядят": 1400, "злодей": 1401, "но…": 1402, "проще": 1403, "король": 1404, "прошло": 1405, "друзьями": 1406, "брата": 1407, "показаны": 1408, "талантливый": 1409, "конан": 1410, "получится": 1411, "свободу": 1412, "даёт": 1413, "кино»": 1414, "чаще": 1415, "собака": 1416, "добавить": 1417, "прост": 1418, "маленького": 1419, "отнюдь": 1420, "боли": 1421, "головой": 1422, "иной": 1423, "заключается": 1424, "ход": 1425, "мол": 1426, "п": 1427, "имеют": 1428, "ценности": 1429, "способны": 1430, "песня": 1431, "иствуда": 1432, "остров": 1433, "уве": 1434, "качественно": 1435, "семье": 1436, "мыслей": 1437, "знаем": 1438, "примерно": 1439, "хорошей": 1440, "чувствовать": 1441, "страны": 1442, "пытался": 1443, "сознание": 1444, "тома": 1445, "мартин": 1446, "харви": 1447, "мечта": 1448, "отдельное": 1449, "историй": 1450, "валли": 1451, "леджера": 1452, "начну": 1453, "войну": 1454, "джуд": 1455, "примеру": 1456, "нашел": 1457, "студии": 1458, "яркие": 1459, "эдвард": 1460, "попадает": 1461, "скажем": 1462, "дал": 1463, "сила": 1464, "русский": 1465, "девочка": 1466, "какоето": 1467, "создает": 1468, "скарлетт": 1469, "годов": 1470, "помощи": 1471, "уровня": 1472, "сквозь": 1473, "сюжетная": 1474, "виду": 1475, "хозяина": 1476, "пародии": 1477, "глубокий": 1478, "другому": 1479, "музыкой": 1480, "драки": 1481, "разум": 1482, "рассказать": 1483, "леджер": 1484, "отзывов": 1485, "трогательный": 1486, "счастью": 1487, "будущем": 1488, "будущего": 1489, "четко": 1490, "нужна": 1491, "роман": 1492, "фильмами": 1493, "снимает": 1494, "язык": 1495, "действий": 1496, "лицом": 1497, "везде": 1498, "большего": 1499, "актерами": 1500, "стоило": 1501, "своя": 1502, "считает": 1503, "ребенок": 1504, "признаться": 1505, "едва": 1506, "вернуться": 1507, "мастер": 1508, "вещей": 1509, "американских": 1510, "ждала": 1511, "немало": 1512, "улыбка": 1513, "интересная": 1514, "депп": 1515, "пара": 1516, "целый": 1517, "жил": 1518, "«престиж»": 1519, "историей": 1520, "слушать": 1521, "е": 1522, "дали": 1523, "восторг": 1524, "отдать": 1525, "каких": 1526, "развития": 1527, "актёрский": 1528, "вторую": 1529, "ниро": 1530, "написал": 1531, "взрослых": 1532, "голливуда": 1533, "третий": 1534, "приключений": 1535, "шедевра": 1536, "миром": 1537, "короче": 1538, "добрая": 1539, "решение": 1540, "любил": 1541, "«остров": 1542, "ошибки": 1543, "клинт": 1544, "захотелось": 1545, "отзыв": 1546, "умный": 1547, "детектив": 1548, "настоящую": 1549, "большее": 1550, "проходит": 1551, "народ": 1552, "развитие": 1553, "уважения": 1554, "потерял": 1555, "свободы": 1556, "хороша": 1557, "драму": 1558, "общество": 1559, "работ": 1560, "признаюсь": 1561, "показаться": 1562, "мужчина": 1563, "новую": 1564, "режиссеров": 1565, "какимто": 1566, "мультфильме": 1567, "вызвал": 1568, "мультфильмы": 1569, "счет": 1570, "человеческих": 1571, "результате": 1572, "оператора": 1573, "новая": 1574, "новым": 1575, "сомнений": 1576, "показывать": 1577, "чтонибудь": 1578, "творения": 1579, "оказалась": 1580, "карибского": 1581, "называется": 1582, "придумать": 1583, "пейзажи": 1584, "экшн": 1585, "возрасте": 1586, "диалогов": 1587, "двумя": 1588, "добрые": 1589, "состоит": 1590, "комедию": 1591, "ставить": 1592, "молодого": 1593, "оставит": 1594, "проект": 1595, "хватило": 1596, "характера": 1597, "образа": 1598, "городе": 1599, "макадамс": 1600, "американского": 1601, "забывать": 1602, "света": 1603, "финале": 1604, "верю": 1605, "страха": 1606, "питт": 1607, "интереснее": 1608, "сердцем": 1609, "сопереживать": 1610, "получает": 1611, "ребята": 1612, "идей": 1613, "снимают": 1614, "состоянии": 1615, "слову": 1616, "окончательно": 1617, "обладает": 1618, "эффекты": 1619, "надолго": 1620, "сильная": 1621, "почувствовать": 1622, "судить": 1623, "красота": 1624, "шоу": 1625, "атмосферой": 1626, "сказала": 1627, "трейлер": 1628, "работает": 1629, "актерам": 1630, "15": 1631, "остаются": 1632, "ужасов": 1633, "задачей": 1634, "объяснить": 1635, "актёрская": 1636, "форрест": 1637, "одри": 1638, "американской": 1639, "©": 1640, "любимого": 1641, "имеем": 1642, "мастерски": 1643, "делал": 1644, "грустно": 1645, "картер": 1646, "романа": 1647, "высшем": 1648, "полное": 1649, "смотрит": 1650, "знала": 1651, "фильм»": 1652, "ярких": 1653, "мораль": 1654, "плюсы": 1655, "целью": 1656, "брат": 1657, "захватывающий": 1658, "хочешь": 1659, "частности": 1660, "съемки": 1661, "балл": 1662, "современных": 1663, "чисто": 1664, "титров": 1665, "судьбу": 1666, "добиться": 1667, "какихто": 1668, "интересные": 1669, "близких": 1670, "билли": 1671, "грамотно": 1672, "мл": 1673, "кевин": 1674, "грейс": 1675, "работать": 1676, "самих": 1677, "увидев": 1678, "слез": 1679, "ничто": 1680, "убийства": 1681, "ниже": 1682, "искусство": 1683, "хита": 1684, "считают": 1685, "великой": 1686, "духе": 1687, "ленте": 1688, "характеры": 1689, "смешные": 1690, "красивой": 1691, "пройти": 1692, "борьба": 1693, "большого": 1694, "жестокость": 1695, "мастера": 1696, "больно": 1697, "кровь": 1698, "любимым": 1699, "графика": 1700, "стоят": 1701, "классикой": 1702, "попал": 1703, "сценаристов": 1704, "миядзаки": 1705, "долгое": 1706, "детство": 1707, "ах": 1708, "трех": 1709, "заканчивается": 1710, "признать": 1711, "завораживает": 1712, "эпизоды": 1713, "машины": 1714, "джеймс": 1715, "слышал": 1716, "читать": 1717, "десять": 1718, "зачастую": 1719, "экраны": 1720, "попытка": 1721, "молодых": 1722, "автор": 1723, "месту": 1724, "поставил": 1725, "группы": 1726, "правду": 1727, "трогательная": 1728, "другую": 1729, "колец»": 1730, "уверена": 1731, "жестокости": 1732, "возраста": 1733, "имею": 1734, "последняя": 1735, "джо": 1736, "появился": 1737, "осталась": 1738, "зрелище": 1739, "мужчины": 1740, "спилберг": 1741, "верит": 1742, "персонажем": 1743, "этими": 1744, "спецэффектами": 1745, "дуэт": 1746, "серии": 1747, "pixar": 1748, "б": 1749, "попытки": 1750, "удается": 1751, "«самый": 1752, "бондарчук": 1753, "определенно": 1754, "джим": 1755, "вышла": 1756, "дни": 1757, "ожидать": 1758, "получила": 1759, "прошлом": 1760, "лучшей": 1761, "минусы": 1762, "местах": 1763, "прекрасной": 1764, "тобой": 1765, "титры": 1766, "качество": 1767, "похожи": 1768, "обидно": 1769, "деппа": 1770, "фон": 1771, "кристиан": 1772, "бывают": 1773, "можете": 1774, "вещь": 1775, "поразил": 1776, "вера": 1777, "давайте": 1778, "человеческого": 1779, "восхищаться": 1780, "течение": 1781, "учитывая": 1782, "буквы": 1783, "большие": 1784, "скоро": 1785, "грани": 1786, "бесспорно": 1787, "воплощение": 1788, "американский": 1789, "марион": 1790, "общего": 1791, "оригинальный": 1792, "глядя": 1793, "вкус": 1794, "улыбку": 1795, "помощь": 1796, "отношений": 1797, "и…": 1798, "общемто": 1799, "«темный": 1800, "мартина": 1801, "моментах": 1802, "снов": 1803, "постановка": 1804, "ленту": 1805, "сделан": 1806, "показался": 1807, "основной": 1808, "уважение": 1809, "гениального": 1810, "заслуга": 1811, "хороши": 1812, "ценить": 1813, "посмеяться": 1814, "глубже": 1815, "заметил": 1816, "моем": 1817, "мультфильмов": 1818, "выразить": 1819, "старые": 1820, "обществе": 1821, "кинотеатра": 1822, "зале": 1823, "ум": 1824, "связи": 1825, "звук": 1826, "говорили": 1827, "прав": 1828, "чувствуешь": 1829, "ситуацию": 1830, "переживать": 1831, "бога": 1832, "старый": 1833, "видишь": 1834, "клуб»": 1835, "запомнился": 1836, "лишнего": 1837, "фантазии": 1838, "думаешь": 1839, "смотрятся": 1840, "«на": 1841, "отношениях": 1842, "персонажами": 1843, "таланта": 1844, "злодея": 1845, "немногих": 1846, "тим": 1847, "пытаясь": 1848, "появление": 1849, "мою": 1850, "состояние": 1851, "интересных": 1852, "будете": 1853, "сняли": 1854, "сюжетной": 1855, "поведение": 1856, "человечества": 1857, "судя": 1858, "превращается": 1859, "узнал": 1860, "воспринимать": 1861, "взял": 1862, "ненависть": 1863, "«бойцовский": 1864, "котийяр": 1865, "стыдно": 1866, "черт": 1867, "вскоре": 1868, "известных": 1869, "лео": 1870, "слёзы": 1871, "когданибудь": 1872, "нравятся": 1873, "вперед": 1874, "достойный": 1875, "ничуть": 1876, "убедительно": 1877, "ровно": 1878, "несет": 1879, "продолжения": 1880, "рано": 1881, "плохого": 1882, "живой": 1883, "чувством": 1884, "деталей": 1885, "идеей": 1886, "настоящему": 1887, "доме": 1888, "братьев": 1889, "рассказывать": 1890, "тони": 1891, "готовы": 1892, "кучу": 1893, "особого": 1894, "сценарист": 1895, "ситуация": 1896, "хэнкс": 1897, "речи": 1898, "играли": 1899, "простите": 1900, "некий": 1901, "дэвида": 1902, "великолепна": 1903, "наград": 1904, "погони": 1905, "полтора": 1906, "ролях": 1907, "милый": 1908, "карьере": 1909, "маленькая": 1910, "«очень": 1911, "уилла": 1912, "верный": 1913, "взгляда": 1914, "специально": 1915, "великолепной": 1916, "около": 1917, "какую": 1918, "присутствуют": 1919, "писал": 1920, "результат": 1921, "впечатляет": 1922, "30": 1923, "выйти": 1924, "добрым": 1925, "веру": 1926, "уйти": 1927, "забыл": 1928, "задумка": 1929, "моря": 1930, "морган": 1931, "продолжает": 1932, "поверьте": 1933, "мориарти": 1934, "половиной": 1935, "привыкли": 1936, "основная": 1937, "складывается": 1938, "оценивать": 1939, "когдалибо": 1940, "заслуженно": 1941, "страшное": 1942, "большом": 1943, "бэйл": 1944, "стивен": 1945, "нортон": 1946, "режиссеры": 1947, "категории": 1948, "закончится": 1949, "предыдущих": 1950, "следующий": 1951, "меру": 1952, "брюс": 1953, "какуюто": 1954, "недостатки": 1955, "стругацких": 1956, "попросту": 1957, "такому": 1958, "красоты": 1959, "господа": 1960, "«шерлок": 1961, "принять": 1962, "сыщика": 1963, "мимика": 1964, "органично": 1965, "доказал": 1966, "двое": 1967, "критики": 1968, "снимали": 1969, "финальная": 1970, "очевидно": 1971, "единственная": 1972, "заканчивая": 1973, "относительно": 1974, "силой": 1975, "«король": 1976, "дружбы": 1977, "власти": 1978, "экранного": 1979, "согласитесь": 1980, "третья": 1981, "женщин": 1982, "капитан": 1983, "полная": 1984, "исполнил": 1985, "народа": 1986, "молодец": 1987, "реалистично": 1988, "рори": 1989, "чувствует": 1990, "прекрасное": 1991, "тюрьме": 1992, "сценарии": 1993, "смит": 1994, "хати": 1995, "окружающих": 1996, "повествует": 1997, "особенности": 1998, "главному": 1999, "различных": 2000, "предстоит": 2001, "теми": 2002, "данная": 2003, "ответы": 2004, "час": 2005, "дочери": 2006, "амплуа": 2007, "сюжетных": 2008, "вернуть": 2009, "выход": 2010}
pages/models/weights.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6ac94c5dee5e6aa0815a21587e1f615e8ae1e4b80a429c47d2cc54f2c2c78c30
3
+ size 172338
pages/text_classif.py CHANGED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import streamlit as st
3
+ import transformers
4
+ from transformers import AutoTokenizer, AutoModel
5
+ from sklearn.linear_model import LogisticRegression
6
+ import pickle
7
+ from pages.models.bert import preprocess_bert
8
+ import pandas as pd
9
+ import time
10
+ from pages.models.ml import predict
11
+ from pages.models.rnn import pred
12
+
13
+ text = st.text_input('Введите сюда отзыв')
14
+ if text:
15
+ # start_time = time.time()
16
+
17
+
18
+ st.write(preprocess_bert(text))
19
+ st.write(predict(text))
20
+ st.write(pred(text))
21
+
22
+
23
+
24
+
25
+
26
+
27
+ # Создание DataFrame с указанными значениями
28
+ data = {
29
+ 'Параметр': ['ML', 'LSTM', 'BERT'],
30
+ 'Значение': [0.52, 0.56, 0.62]
31
+ }
32
+
33
+ df = pd.DataFrame(data)
34
+
35
+ # Отображение таблицы в Streamlit
36
+ st.markdown("<style>div.row-widget.stButton > button{width:100%;}</style>", unsafe_allow_html=True)
37
+ st.write("<h1 style='text-align: center;'>Таблица с лучшими параметрами:</h1>", unsafe_allow_html=True)
38
+ st.dataframe(df.style.set_table_styles([{'selector': 'tr:hover', 'props': 'background-color: yellow;'}]))
requirements.txt ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ absl-py==2.0.0
2
+ accelerate==0.24.1
3
+ altair==5.1.2
4
+ astunparse==1.6.3
5
+ attrs==23.1.0
6
+ blinker==1.7.0
7
+ cachetools==5.3.2
8
+ certifi==2023.7.22
9
+ charset-normalizer==3.3.2
10
+ click==8.1.7
11
+ contourpy==1.1.1
12
+ cycler==0.12.1
13
+ filelock==3.13.1
14
+ flatbuffers==23.5.26
15
+ fonttools==4.43.1
16
+ fsspec==2023.10.0
17
+ gast==0.5.4
18
+ gitdb==4.0.11
19
+ GitPython==3.1.40
20
+ google-auth==2.23.4
21
+ google-auth-oauthlib==1.0.0
22
+ google-pasta==0.2.0
23
+ grpcio==1.59.2
24
+ h5py==3.10.0
25
+ huggingface-hub==0.17.3
26
+ idna==3.4
27
+ importlib-metadata==6.8.0
28
+ Jinja2==3.1.2
29
+ joblib==1.3.2
30
+ jsonschema==4.19.2
31
+ jsonschema-specifications==2023.7.1
32
+ keras==2.14.0
33
+ kiwisolver==1.4.5
34
+ libclang==16.0.6
35
+ Markdown==3.5.1
36
+ markdown-it-py==3.0.0
37
+ MarkupSafe==2.1.3
38
+ matplotlib==3.8.1
39
+ mdurl==0.1.2
40
+ ml-dtypes==0.2.0
41
+ mpmath==1.3.0
42
+ networkx==3.2.1
43
+ nltk==3.8.1
44
+ numpy==1.26.1
45
+ nvidia-cublas-cu12==12.1.3.1
46
+ nvidia-cuda-cupti-cu12==12.1.105
47
+ nvidia-cuda-nvrtc-cu12==12.1.105
48
+ nvidia-cuda-runtime-cu12==12.1.105
49
+ nvidia-cudnn-cu12==8.9.2.26
50
+ nvidia-cufft-cu12==11.0.2.54
51
+ nvidia-curand-cu12==10.3.2.106
52
+ nvidia-cusolver-cu12==11.4.5.107
53
+ nvidia-cusparse-cu12==12.1.0.106
54
+ nvidia-nccl-cu12==2.18.1
55
+ nvidia-nvjitlink-cu12==12.3.52
56
+ nvidia-nvtx-cu12==12.1.105
57
+ oauthlib==3.2.2
58
+ opt-einsum==3.3.0
59
+ packaging==23.2
60
+ pandas==2.1.2
61
+ Pillow==10.1.0
62
+ protobuf==4.25.0
63
+ psutil==5.9.6
64
+ pyarrow==14.0.0
65
+ pyasn1==0.5.0
66
+ pyasn1-modules==0.3.0
67
+ pydeck==0.8.1b0
68
+ Pygments==2.16.1
69
+ pyparsing==3.1.1
70
+ python-dateutil==2.8.2
71
+ pytz==2023.3.post1
72
+ PyYAML==6.0.1
73
+ referencing==0.30.2
74
+ regex==2023.10.3
75
+ requests==2.31.0
76
+ requests-oauthlib==1.3.1
77
+ rich==13.6.0
78
+ rpds-py==0.10.6
79
+ rsa==4.9
80
+ safetensors==0.4.0
81
+ scikit-learn==1.3.2
82
+ scipy==1.11.3
83
+ six==1.16.0
84
+ smmap==5.0.1
85
+ streamlit==1.28.0
86
+ sympy==1.12
87
+ tenacity==8.2.3
88
+ tensorboard==2.14.1
89
+ tensorboard-data-server==0.7.2
90
+ tensorflow==2.14.0
91
+ tensorflow-estimator==2.14.0
92
+ tensorflow-io-gcs-filesystem==0.34.0
93
+ termcolor==2.3.0
94
+ threadpoolctl==3.2.0
95
+ tokenizers==0.14.1
96
+ toml==0.10.2
97
+ toolz==0.12.0
98
+ torch==2.1.0
99
+ torchaudio==2.1.0
100
+ torchutils==0.0.4
101
+ torchvision==0.16.0
102
+ tornado==6.3.3
103
+ tqdm==4.66.1
104
+ transformers==4.34.1
105
+ triton==2.1.0
106
+ typing_extensions==4.8.0
107
+ tzdata==2023.3
108
+ tzlocal==5.2
109
+ urllib3==2.0.7
110
+ validators==0.22.0
111
+ watchdog==3.0.0
112
+ Werkzeug==3.0.1
113
+ wrapt==1.14.1
114
+ zipp==3.17.0