تشخیص کنایه در عناوین خبری با cAInvas

کنایه که در لغت به معنای «پوشیده سخن گفتن» است، در اصطلاح به ترکیب یا جمله‌ای اطلاق می‌شود که مراد گوینده معنای ظاهری آن نباشد. این عنصر می‌تواند بار معنایی جمله را دستخوش تغییر قرار دهد. بنابراین، تشخیص کنایه به بخش مهمی از تحلیل احساسات تبدیل شده است. بخش عمده‌ای از مجموعه‌داده‌های موجود از توئیت‌های کاربران شبکه اجتماعی توئیتر گردآوری شده است. این اقدام می‌تواند به داده‌های نویزی با برچسب‌های نادرست ختم شود. درکِ محتوای مکالمات، نقشی حیاتی در برچسب‌زنی متن دارد. در مقاله حاضر، از مجموعه‌‌داده‌ای متشکل از عناوین خبری استفاده خواهیم کرد. این مجموعه‌داده قابل‌اطمینان است زیرا عناوین خبری نوشته شده به دست متخصصان حوزه رسانه نوشته شده است. می‌توان از آن منبع برای برچسب زدن به نمونه‌های مجموعه‌داده استفاده کرد.پیاده‌سازی ایده در cAInvas – به این لینک مراجعه کنید.مجموعه‌دادهآشنایی با On Kaggle – ریشاب میسرااین مجموعه‌داده از دو وب‌سایت خبری گردآوری شده است. Onion در نظر دارد تا نسخه‌های کنایه‌آمیزِ رخدادهای فعلی را ایجاد کند. عناوین خبری نیز از بخش‌ «خلاصه اخبار» و «تصاویر خبری» جمع‌آوری شده‌اند. همچنین، عناوین خبری واقعی (بدون کنایه) از Huffpost گردآوری شده است.شِمایی از مجموعه‌داده توزیع مقادیر دسته همانطور که در تصویر بالا مشخص است این مجموعه‌داده از توازن خوبی برخوردار است.پردازش دادهبرای پردازش داده متن و تشخیص کنایه عنوان خبری باید تغییرتی داشته باشد.برای مثال، باید عناصر HTML و URL حذف شوند. در وهله بعد، همه کاراکترهایی که در زمره‌ی حروف الفبا جای ندارند، حذف شوند. توابع به صورت زیر تعریف شده‌اند:همانطور که در تصویر بالا مشخص است این مجموعه‌داده از توازن خوبی برخوردار است.# Remove html tagsdef removeHTML(sentence): regex = re.compile('<.*?>') return re.sub(regex, ' ', sentence)# Remove URLsdef removeURL(sentence): regex = re.compile('http[s]?://\S+') return re.sub(regex, ' ', sentence)# remove numbers, punctuation and any special characters (keep only alphabets)def onlyAlphabets(sentence): regex = re.compile('[^a-zA-Z]') return re.sub(regex, ' ', sentence)کد: توابع پردازش متنبه محض اِتمام عمل پردازش، جمله پیش از آنکه به واژگان ریشه تجزیه شود، به صورت حروف کوچک نوشته می‌شود. بنابراین، واژگانی که اَشکال متفاوتی از واژگان یکسان هستند، به راحتی مورد شناسایی قرار می‌گیرند (مثال: خوردن، خورد، می‌خورد). از ماژول nltk.stem برای یافتن ریشه کلمات استفاده می‌شود. کلمات توقف حذف نمی‌شوند زیرا می‌توانند به ارائه بافت جمله به صورت کل کمک کنند.sno = nltk.stem.SnowballStemmer('english') # Initializing stemmerwordcloud = [[], []]all_sentences = [] # All cleaned sentencesfor x in range(len(df['headline'].values)): headline = df['headline'].values[x] sarcasm = df['is_sarcastic'].values[x] cleaned_sentence = [] sentence = removeURL(headline) sentence = removeHTML(sentence) sentence = onlyAlphabets(sentence) sentence = sentence.lower() for word in sentence.split(): #if word not in stop: stemmed = sno.stem(word) cleaned_sentence.append(stemmed) wordcloud[sarcasm].append(word) all_sentences.append(' '.join(cleaned_sentence))# add as column in dataframeX = all_sentencesy = df['is_sarcastic']کد: پردازش متنواژگان متعلق به هر یک از دسته‌ها با استفاده از WordCloud به صورت جداگانه‌ ذخیره می‌شوند تا عمل مصورسازی صورت گیرد.WordCloud: بدون کنایه WordCloud: کنایه‌آمیز اندازه واژه با فراوانیِ آن در مجموعه‌داده همخوانی دارد. نمی‌توان بر پایه این تصاویر استنباط کرد.تفکیک آموزش – اعتبارسنجیتقسیم مجموعه‌داده به مجموعه‌های آموزش و اعتبارسنجی با نسبت ۲۰-۸۰.# Splitting into train and val set -- 80-20 splitXtrain, Xval, ytrain, yval = train_test_split(X, y, test_size = 0.2)کد: Train-val splitمیبینیم که مجموعه آموزش ۲۲۸۹۵ نمونه و مجموعه اعتبارسنجی ۵۷۲۴ نمونه دارد.نشانه‌گذاریاز عمل نشانه‌گذاریِ ماژول keras.preprocessing.text برای تبدیل متن به توالی اعداد صحیح استفاده می‌شود. این اعداد به عنوان ورودی در اختیار مدل قرار می‌گیرند. برای اینکه طول حداکثر ۲۰۰ به دست آید، این اعداد چمد صفر نیز دارند.# Tokenizationvocab = 1500mlen = 200tokenizer = Tokenizer(num_words = vocab, oov_token = '<UNK>')tokenizer.fit_on_texts(Xtrain)Xtrain = tokenizer.texts_to_sequences(Xtrain)Xtrain = pad_sequences(Xtrain, maxlen=mlen)Xval = tokenizer.texts_to_sequences(Xval)Xval = pad_sequences(Xval, maxlen=mlen)کد: Tokenization (نشانه‌گذاری)مدلبرای تشخیص کنایه مدلی که باید آموزش داده شود، از یک لایه تعبیه تشکیل شده که نمونه‌های ورودی را به آرایه‌هایی با اندازه ثابت تبدیل می‌کند. یک شبکه حافظه طولانی کوتاه‌مدت و سه لایه متراکم نیز به کار برده می‌شوند. دو مورد اول با فعال‌سازی ReLU و مورد آخر با فعال‌سازی Sigmoid شناخته می‌شود. این مدل با استفاده از تابع زیان آنتروپی متقاطع دودویی کامپایل می‌گردد زیرا فقط دو دسته (صفر و یک) وجود دارد. ابزار بهینه‌سازی Adam مورد استفاده قرار گرفته و دقت مدل به طور پیوسته بررسی می‌شود. عمل بازخوانی Early Stopping در ماژول keras.callbacks متریکی برای تعداد دوره‌های مشخص دارد. اگر این متریک (ابزار سنجش) بهبود نیابد، آموزش متوقف می‌شود. بر اساس پارامتر restore_best_weights، مدلی که کمترین زیان اعتبارسنجی را دارد، به متغیر مدل بازگردانیده می‌شود.# Build and train neural networkembedding_dim = 128model = models.Sequential([ layers.Embedding(vocab, embedding_dim, input_length = mlen), layers.LSTM(128, activation='tanh'), layers.Dense(32, activation = 'relu'), layers.Dense(16, activation = 'relu'), layers.Dense(1, activation = 'sigmoid')])cb = [callbacks.EarlyStopping(patience = 5, restore_best_weights = True)]model.compile(optimizer = optimizers.Adam(0.01), loss = loss-es.BinaryCrossentropy(), metrics = ['accuracy'])history = model.fit(Xtrain, ytrain, batch_size=64, epochs = 256, valida-tion_data=(Xval, yval), callbacks = cb)کد: Model and training (مدل و آموزش)پس از آموزش با نرخ یادگیری ۰۱/۰، مدل به دقت %۵/۸۳ در مجموعه آزمایشی دست یافت.پیش‌بینی‌های مجموعه آزمایشیبررسی اجمالی ماتریس درهم‌ریختگی برای درک بهتر نتایجماتریس درهم‌ریختگی متریک‌ها (ابزارهای سنجش) نمودار دقت نمودار زیان پیش‌بینیانجام پیش‌بینی در نمونه‌های آزمایشی تصادفیx = np.random.randint(0, Xval.shape[0] - 1)headline = df['headline'].values[x]print("Headline: ", headline)cleaned_text = []sentence = removeURL(headline) sentence = removeHTML(sentence)sentence = onlyAlphabets(sentence)sentence = sentence.lower() for word in sentence.split(): #if word not in stop: stemmed = sno.stem(word) cleaned_text.append(stemmed)cleaned_text = [' '.join(cleaned_text)]print("Cleaned text: ", cleaned_text[0])cleaned_text = tokenizer.texts_to_sequences(cleaned_text)cleaned_text = pad_sequences(cleaned_text, maxlen=mlen)category = df['is_sarcastic'].values[x] print("\nTrue category: ", class_names[category])output = model.predict(cleaned_text)[0][0]pred = (output>0.5).astype('int64')print("\nPredicted category: ", class_names[pred], "(", output, "-->", pred, ")")کد: Prediction on test samples (پیش‌بینی در نمونه‌های آزمایشی)Sample prediction on a random test sample آشنایی با DEEPCچارچوب استنباط، کامپایلر و کتابخانه deepC با این هدف طراحی شده‌اند که شبکه های عصبی یادگیری عمیق به اجرا درآیند. در همین راستا، ویژگی وسیله‌های فرم-فکتور از قبیل ریزکنترل‌گرها، Efpga، CPU و سایر وسیله‌های تعبیه شده از قبیل raspberry-pi، odroid، Arduino، SparkFun Edge، RISC-V، تلفن‌ همراه و لپ‌تاپ مورد تاکید قرار می‌گیرد.کامپایل کردن مدل با استفاده از DEEPCکامپایل کردن deepC برای تشخیص کنایه ، اجرا و ایجاد فایل .exe خودتان به پلتفرم cAInvas مراجعه کنید.منبع: هوشیو