به کمک شبکه عصبی تو زبان پایتون یادگیری روی متن فارسی انجام میدیم و در نهایت در خروجی حس متن وارد شده رو می گیریم
باز کردن# 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('من دوست دارم برنامه نویسی کنم'))