خانه

ورود

پروژه ها

تشخیص احساسات در متن فارسی به کمک deep learning

به کمک شبکه عصبی تو زبان پایتون یادگیری روی متن فارسی انجام میدیم و در نهایت در خروجی حس متن وارد شده رو می گیریم

باز کردن
# from __future__ import print_function # from keras.models import Sequential # from keras.layers import Dense # from keras.layers import Dropout from tensorflow import keras Sequential = keras.models.Sequential Dense = keras.layers.Dense Dropout = keras.layers.Dropout import numpy as np import pandas as pd import persian df = pd.read_csv('dataset.csv') dist_labels = df['sentiment'] dist_labels = dist_labels.drop_duplicates() label_text = {} base_array = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] local_counter = 0 for i in dist_labels: label_text[i] = base_array.copy() label_text[i][local_counter] = 1 label_text[i] = np.asarray(label_text[i]).astype(np.float32) local_counter += 1 y = [label_text[df['sentiment'][i]] for i in range(len(df['sentiment']))] texts = [] to_remove_indexs = [] for i in range(len(df['content'])): if type(df['content'][i]) is not float: texts.append(df['content'][i]) else: to_remove_indexs.append(i) to_remove_indexs.sort(reverse=True) for i in to_remove_indexs: del y[i] delimiters = [';', '!', '*', '.', ':', ',', '_', '-', '+', '=', '>', '<', '~', '\\', '^', '|', '`', '[', ']', '{', '}', '(', ')', '،', '؛', '?', '&', '/', '"', "'", '%', '$', '@', '#', '\n', '\xa0', '\u200e/', '\u200c', '?', '؟', '«', '»'] num = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'] en = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] stop_words = ['حتي', 'تا', 'بي', 'اين', 'اما', 'به', 'هاي', 'ها', 'و', 'با', 'خواهد', 'کرد', 'باشد', 'از', 'گاهي', 'آن', 'را', '.', 'شود', 'اين','بود', 'ديگر', 'شده', 'شد', 'چرا', 'بر', 'اند', 'می', 'در', 'چون', 'دادند', 'يا', 'براي', 'که', 'نمي', 'هاي', 'مي', 'است', 'کردند', 'که', 'چه', 'غير', 'فقط', 'هر', 'هم'] to_delete = delimiters + en + num def text2clean_array(input_text, to_delete, stop_words): input_text = persian.convert_ar_characters(input_text) input_text = persian.convert_ar_numbers(input_text) input_text = persian.convert_en_numbers(input_text) for item in to_delete: if item in input_text: input_text = input_text.replace(item, '') input_text = input_text.split(' ') for word in stop_words: if word in input_text: input_text.remove(word) return input_text tokenized_input = [] for text in texts: tokenized_input.append(text2clean_array(text, to_delete, stop_words)) tokens = [] for text in tokenized_input: for word in text: tokens.append(word) tokens=set(tokens) words= sorted(list(tokens)) print('total chars:', len(words)) word_indices = dict((c, i) for i, c in enumerate(words)) # print("word_indices", word_indices) indices_word = dict((i, c) for i, c in enumerate(words)) max_sent_len = 0 for text in tokenized_input: if len(text) > max_sent_len: max_sent_len = len(text) sentences = tokenized_input x = np.zeros((len(sentences), len(words)), dtype=bool) for i, sentence in enumerate(sentences): for t, word in enumerate(sentence): x[i, word_indices[word]] = 1 model = Sequential() model.add(Dense(512, input_shape=(len(words),), activation='relu')) model.add(Dropout(0.5)) model.add(Dense(13, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) y = np.asarray(y).astype(bool) x_train , y_train, x_valid, y_valid, x_test, y_test = x[:int(len(x)*0.8)], y[:int(len(y)*0.8)], x[int(len(x)*0.8):int(len(x)*0.9)], y[int(len(y)*0.8):int(len(y)*0.9)], x[int(len(x)*0.9):], y[int(len(y)*0.9):] model.evaluate(x_valid, y_valid) model.fit(x_train, y_train, batch_size=128, epochs=10) model.evaluate(x_valid, y_valid) model.evaluate(x_test, y_test) model.save('model.h5') def predict(input_text): input_text = text2clean_array(input_text, to_delete, stop_words) pred_array = np.zeros((1, len(words)), dtype=bool) for t, word in enumerate(input_text): if word in word_indices: pred_array[0, word_indices[word]] = 1 per = model.predict(pred_array) res_array = np.zeros((1, len(label_text)))[0] res_array[np.argmax(per)] = 1 for label in label_text: if np.array_equal(res_array, label_text[label]): return label print(predict('من دوست دارم برنامه نویسی کنم'))