Анализ на настроението от NacimNacim2 - OpenClassrooms
Въпрос ? Не се притеснявайте, ние ще ви помогнем !

# кодиране: utf-8
импортирайте панди като pd
импортиране на numpy като np
импортирайте xml.etree.ElementTree като ET
от колекции импорт брояч
импортирайте matplotlib.pyplot като plt
факел за внос
от torch.utils.data импортиране на DataLoader, TensorDataset
импортиране на факел.nn като nn
def get_list (път):
дърво = ET.parse (път)
корен = дърво.getroot ()
text_list = []
списък с мнения = []
за преглед в root.findall ("Преглед"):
text_string = "
за изпратено в review.findall ("./ изречения/изречение"):
text_string = text_string + " + sent.find ("text"). text
text_string = text_string.lower ()
text_string = text_string.strip ()
text_list.append (text_string + ("\ n"))
за мнение в review.findall ("./ Мнения/Мнение"):
if (opinion.get ("category") == "LAPTOP # GENERAL"):
opinion_dict = opinion.get ("полярност")
# opinion_inner_list.append (opinion_dict)
opinion_list.append (opinion_dict)
върнете текстов списък, списък с мнения
отзиви, етикети = get_list (path_train)
#test_text_list, test_opinion_list = get_list (path_test)
печат ('train_text_list', отзиви)
печат ()
print ('train_opinion_list', етикети)
ред = []
от пунктуация за импортиране на низове
all_text = '' .join ([c за c в рецензии, ако c не е в препинателни знаци]) # изчистване на пунктуацията
печат (цял_текст)
reviews_split = all_text.split ('\ n')
print ('брой отзиви:', len (reviews_split))
all_text2 = ".join (отзиви_разделение)
думи = всички_текст2.split ()
count_words = Брояч (думи)
# пребройте честотата на думите #
total_words = len (думи)
print (total_words) #nbr общо думи
sorted_words = count_words.most_common (total_words)
print (count_words) # & напишете честота на думите
vocab_to_int =
печат (vocab_to_int)
# създайте списъка, който включва списъците на moots като цели числа #
reviews_int = []
за преглед в reviews_split:
r = [vocab_to_int [w] за w в review.split ()]
reviews_int.append (r)
печат (reviews_int)
print ("langueuuur rev_int", len (reviews_int))
# кодиране на тагове #
encoded_labels = [1 ако label == 'положителен' else 0 ако label == 'negative'else 2 ако label ==' конфликт 'else 3 за етикет в етикети] #encode етикетите
encoded_labels = np.array (encoded_labels)
# анализирайте данните #
reviews_len = [len (x) за x в reviews_int]
pd.Series (reviews_len) .hist ()
plt.show ()
pd.Series (reviews_len) .describe ()
# отървете се от кратки и дълги стойности #
print ("етикетите11111", len (encoded_labels))
reviews_int = [reviews_int [i] за i, l в enumerate (reviews_len), ако l> 0]
encoded_labels = [encoded_labels [i] за i, l в enumerate (reviews_len), ако l> 0 и i seq_length:
ново = преглед [0: seq_length]
seq_length = 395
характеристики = характеристики на подложката (отзиви_int, sq_length)
печат (функции)
len_feat = len (функции)
печат ("len feat", len_feat)
split_frac = 0,8
# обучение на данни
train_x = функции [0: int (split_frac * len_feat)] # отзивите
печат ("train_x", train_x)
train_y = encoded_labels [0: int (split_frac * len_feat)] # етикетите
print ("train_y", train_y)
print ("review_split", len (reviews_split))
print ("languer rev", len (reviews_int))
Остават # данни
Оставащи_x = характеристики [int (split_frac * len_feat):]
оставащ_y = кодирани_ етикети [int (split_frac * len_feat):]
печат (len (оставащ_x))
печат (len (оставащ_y))
# данни за проверка
valid_x = оставащ_x [0: int (len (оставащ_x) * 0.5)]
валиден_y = оставащ_y [0: int (len (оставащ_y) * 0.5)]
print ('len (valid_x)', len (valid_x))
print ('len (валиден_y)', len (валиден_y))
# данни от теста
test_x = оставащ_x [int (len (оставащ_x) * 0.5):]
test_y = оставащ_y [int (len (оставащ_y) * 0.5):]
print ('len (test_x)', len (test_x))
print ('len (test_y)', len (test_y))
train_data = TensorDataset (torch.tensor (np.asarray (train_x)), torch.tensor (np.asarray (train_y))))
valid_data = TensorDataset (torch.tensor (np.asarray (valid_x)), torch.tensor (np.asarray (valid_y)))
test_data = TensorDataset (torch.tensor (np.asarray (test_x)), torch.tensor (np.asarray (test_y))))
# товарачи за зареждане на данни
batch_size = 20 # брой проби, обработени преди актуализацията на модела
train_loader = DataLoader (train_data, shuffle = True, batch_size = batch_size, drop_last = True)
valid_loader = DataLoader (valid_data, shuffle = True, batch_size = batch_size, drop_last = True)
test_loader = DataLoader (test_data, shuffle = True, batch_size = batch_size, drop_last = True)
dataiter = iter (train_loader) # достъп до данни за вграждане
sample_x, sample_y = dataiter.next ()
print ('Размер на извадката:', sample_x.size ()) # batch_size, seq_length
print ('Примерен вход: \ n', sample_x)
печат ()
print ('Примерен размер на етикета:', sample_y.size ()) # batch_size
print ('Примерен етикет: \ n', sample_y)
train_on_gpu = torch.device ("cpu") # Обучение на процесора
клас SentimentLSTM (nn.Module):
"
Моделът RNN, който ще се използва за извършване на анализа на настроението.
"
def __init __ (self, vocab_size, output_size, embedding_dim, hidden_dim, n_layers, drop_prob = 0.5): # конструкторът за дефиниране на различните слоеве, които ще имаме
"
Инициализирайте модела, като конфигурирате слоевете.
"