تحليل معاني العبارة باستخدام الشبكات العصبية

تحية للجميع!

ومع ذلك ، فإن جميع الأشخاص الذين يتلقون التعليم العالي ، دون طردهم ، يصلون إلى مرحلة كتابة دبلوم. لم أكن استثناء. كنت أرغب في تنفيذ شيء مثير للاهتمام وإتقان ما لم يتم استكشافه حتى الآن ، لذلك وجهت الانتباه إلى موضوع الشبكات العصبية والذكاء الاصطناعي بشكل عام. والمهمة التي قمت بحلها بمساعدة ذلك هي تحليل نغمة النص ، والتي يتم استخدامها بالفعل على نطاق واسع في أنظمة المراقبة المختلفة. سأحاول وصف عملية حلها في هذه المقالة.

باختصار ، الهدف هو فهم ما إذا كانت العبارة لها دلالة إيجابية أو سلبية. أريد أن أقول على الفور أن هذه المشكلة يمكن حلها بعدة طرق ، وليس فقط عن طريق الشبكات العصبية. يمكننا عمل قواميس يتم فيها تمييز مواقف الكلمات ، إلخ. (جميع الطرق متوفرة بكثرة في المحور) ، ولكن كل طريقة قد تذهب إلى أبعد من ذلك وفقًا للمقالة ، لذلك سنترك مراجعتها في وقت لاحق.

البيانات


كانت المهمة الأولى في طريقي هي جمع ومعالجة البيانات للتدريب. مجموعة البيانات الجيدة لمثل هذه الحالة هي مجموعة النصوص القصيرة التي كتبها Y. Rubtsova ، والتي كانت مقسمة سابقًا إلى جمل سلبية وإيجابية تم جمعها على Twitter. ما هو مناسب بشكل خاص - كل هذا موجود بتنسيق CSV.

إعداد التدريب


انتبه إلى النموذج الذي يتم فيه تقديم البيانات - الكثير من الرموز والروابط والشخصيات غير الضرورية والزيارات. كل هذا ليس معلومات مهمة ويتعارض فقط مع التعلم ، علاوة على ذلك ، يجب إزالة كل شيء باللغة اللاتينية. لذلك ، سيكون النص جيدًا في المعالجة المسبقة.

def preprocessText(text):
    text = text.lower().replace("", "")
    text = re.sub('((www\.[^\s]+)|(https?://[^\s]+))', ' ', text)
    text = re.sub('@[^\s]+', ' ', text)
    text = re.sub('[^a-zA-Z--1-9]+', ' ', text)
    text = re.sub(' +', ' ', text)
    return text.strip()

بعد التخلص من جميع الجمل من الملف ، نضعها في أحرف صغيرة ، ونستبدل "" بـ "e" ، والمراجع ، والإشارات ، ونقوم ببساطة بإزالة الكلمات الإنجليزية لعدم وجود معنى. باختصار ، نجعلها من نفس النوع ، وننظف "القمامة" غير الضرورية للتدريب.

أدوات


بالطبع ، إذا كان لديك جهاز كمبيوتر فائق في المنزل ، يمكنك التمرير لأسفل هذا القسم أكثر ، بحثًا عن جزء مثير للاهتمام. أنصح بقية خدمة Google Colab ، والتي تسمح لك بتشغيل Jupyter Notebooks (والذين لم يسمعوا بها ، لمساعدة محرك البحث) باستخدام متصفح فقط ، ويتم كل العمل على جهاز افتراضي في السحابة.
يقتصر الحجم المؤقت للجلسة التي أعطيت لك للعمل على 12 ساعة - يمكنك الانتهاء منها في وقت سابق ، وبعد ذلك تتم إعادة تعيين كل شيء.

نكتب رمزنا الجميل


مثل أي وافد جديد لتعلم الآلة ، اخترت Python - لأنها بسيطة ، والمكتبات سحابة كاملة.

أولاً ، سينفذ مدير الحزم أمرًا مهمًا واحدًا ، والذي سأشرح معناه بعد ذلك بقليل.

صورة

بعد ذلك ، نستورد المكتبات التي سنستخدمها عند تدريب الشبكة وإعداد البيانات ، أعتقد أن العديد منها مألوف لك.

صورة

أخيرا إلى النقطة.

لذا ، لماذا قمنا بتنزيل مكتبة Tensorflow النصية واستيرادها؟ والحقيقة هي أنه لا يمكن "تغذية" العبارات بالشبكة بالشكل الذي يمكن قراءته به. هذا هو المكان الذي يأتي فيه Word Embedding ، وهو مصطلح لم أجد ترجمة كافية له ، وبشكل عام أشك في وجوده. ولكن بشكل تقريبي ، نحن نتحدث عن مطابقة ناقل لكلمة. يقال هذا بشكل جيد هنا .

نحتاج إلى تحويل جمل كاملة إلى متجه ، لذلك نستخدم حلًا جاهزًا من Google - Universal Sentence Encoder.

صورة

يمكنك تنزيله من المحور هنا . هناك ، بالمناسبة ، هناك العديد من الحلول الجاهزة الأكثر إثارة للاهتمام والتي يمكن استخدامها عند تعلم شبكة عصبية ، حتى لا تزعج نفسك.

صورة

يتم تصنيف جميع التغريدات حسب الفئة - سيئة / جيدة. نقوم بإنشاء إطار بيانات الباندا الذي يتم فرزهم فيه حسب الفئة (السيئات غير مرئية في الصورة ، بسبب حقيقة أنها تتناسب).

صورة

قمنا بتحضير البيانات - دعنا ننتقل إلى النموذج نفسه. للقيام بذلك ، استخدم إطار عمل Keras.

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential, load_model
model = tf.keras.Sequential()

model.add(
  tf.keras.layers.Dense(
    units=256,
    input_shape=(X_train.shape[1], ),
    activation='relu'
  )
)
model.add(
  tf.keras.layers.Dropout(rate=0.5)
)

model.add(
  tf.keras.layers.Dense(
    units=128,
    activation='relu'
  )
)
model.add(
  tf.keras.layers.Dropout(rate=0.5)
)

model.add(tf.keras.layers.Dense(2, activation='softmax'))
model.compile(
    loss='categorical_crossentropy',
    optimizer=tf.keras.optimizers.Adam(0.001),
    metrics=['accuracy']
)

history = model.fit(
    X_train, y_train,
    epochs=10,
    batch_size=16,
    validation_split=0.1,
    verbose=1,
    shuffle=True
)

model.evaluate(X_test, y_test)

القليل عن النموذج نفسه. لديها طبقات المدخلات والمخفية والمخرجات.

كل طبقة لها وظيفة التنشيط الخاصة بها.

شرح صغير: في الشبكات العصبية الاصطناعية ، تحدد وظيفة تنشيط الخلايا العصبية إشارة الخرج ، والتي يتم تحديدها بواسطة إشارة الإدخال أو مجموعة من إشارات الإدخال. يمكنك قراءة المزيد هنا ، بالمناسبة ، يوجد الكثير منها لمهام مختلفة ، لكننا سنعمل فقط مع 2. نقوم

بتعيين وظيفة التنشيط ReLu للطبقتين الأوليين . و قبالة اليوم هو Softmax .

بالإضافة إلى إضافة طبقات ، يمكنك ملاحظة كلمة "Dropout". ما هذا؟ من الغريب ، ولكن بالإضافة إلى مشكلة نقص التعلم في الشبكة العصبية ، عندما تكون توقعاتها غير صحيحة ، هناك مشكلة الإفراط في التدريب - يشرح النموذج جيدًا فقط أمثلة من عينة التدريب ، والتكيف مع أمثلة التدريب ، بدلاً من التعلم لتصنيف الأمثلة التي لم تشارك في التدريب. هذا مبتذل على البيانات الجديدة ، نموذجك الجميل ، الذي قام بعمله بشكل رائع من قبل ، ببساطة "يطير" ويبدأ في مفاجأتك غير السارة. لذا ، فإن Dropout منخرط في حقيقة أنه مع بعض الاحتمالية المحددة "تقوم بإيقاف" الخلايا العصبية من الشبكة ، بحيث تتوقف عن المشاركة في عملية التعلم. ثم يتم حساب متوسط ​​نتائج العديد من الشبكات (عندما يتم استبعاد عصبون من الشبكة ، يتم الحصول على شبكة جديدة).

بالمناسبة ، مقال رائع لأولئك المهتمين.

يمكنك البدء في التعلم!

Train on 53082 samples, validate on 5898 samples
Epoch 1/10
53082/53082 [==============================] - 12s 223us/sample - loss: 0.5451 - accuracy: 0.7207 - val_loss: 0.5105 - val_accuracy: 0.7397
Epoch 2/10
53082/53082 [==============================] - 11s 213us/sample - loss: 0.5129 - accuracy: 0.7452 - val_loss: 0.5000 - val_accuracy: 0.7523
Epoch 3/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.4885 - accuracy: 0.7624 - val_loss: 0.4914 - val_accuracy: 0.7538
Epoch 4/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.4686 - accuracy: 0.7739 - val_loss: 0.4865 - val_accuracy: 0.7589
Epoch 5/10
53082/53082 [==============================] - 11s 214us/sample - loss: 0.4474 - accuracy: 0.7889 - val_loss: 0.4873 - val_accuracy: 0.7616
Epoch 6/10
53082/53082 [==============================] - 11s 216us/sample - loss: 0.4272 - accuracy: 0.8004 - val_loss: 0.4878 - val_accuracy: 0.7603
Epoch 7/10
53082/53082 [==============================] - 11s 213us/sample - loss: 0.4081 - accuracy: 0.8111 - val_loss: 0.4986 - val_accuracy: 0.7594
Epoch 8/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3899 - accuracy: 0.8241 - val_loss: 0.5101 - val_accuracy: 0.7564
Epoch 9/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3733 - accuracy: 0.8315 - val_loss: 0.5035 - val_accuracy: 0.7633
Epoch 10/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3596 - accuracy: 0.8400 - val_loss: 0.5239 - val_accuracy: 0.7620
6554/6554 [==============================] - 0s 53us/sample - loss: 0.5249 - accuracy: 0.7524
[0.5249265961105736, 0.752365]

لذا ، مرت 10 عصور. بالنسبة لأولئك الذين ليسوا على دراية بمثل هذه المفاهيم ، سأشرح التعريف من الإنترنت: العصر عبارة عن تكرار واحد في عملية التعلم ، بما في ذلك عرض جميع الأمثلة من مجموعة التدريب ، وربما التحقق من جودة التدريب على مجموعة التحكم. لذا فقد مرت جميع بياناتنا 10 مرات بشكل كامل خلال العملية بأكملها.

نتيجة


صورة

بالطبع ، ستكون هناك حاجة إلى الشبكة أكثر من مرة وسيكون من الرائع معرفة كيفية حفظها للأجيال القادمة ، حتى لا يضطروا إلى إعادة تدريبها وكل ذلك.

يتم حفظ البنية بتنسيق JSON ، وتتم كتابة الأوزان في ملف h5 .

محرك البحث مليء بالأدلة حول كيفية تحريك العملية العكسية لتهيئة الشبكة من هذه الملفات ، لذلك لن أصفها.

باستخدام طريقة التنبؤ ، سنحاول معرفة رأي الشبكة ومكون الدرجة اللونية لعبارتين مختلفتين بشكل واضح في هذا الصدد. صحيح ، أنها لا تزال بحاجة إلى اختزالها إلى نموذج مصفوفة أولاً ، لكننا نعرف بالفعل كيفية القيام بذلك باستخدام حل جاهز.

عند الإخراج ، نرى رقمين - احتمال أن تنتمي العبارة إلى الفئات "السلبية" / "الإيجابية". أعتقد أن الصورة تظهر بوضوح أن هناك اختلافًا) لذا كانت الكلمات المتشابهة في النهاية وقد قامت الشبكة بعمل رائع في علاقتها بفصولهم.

استنتاج


لذلك ، أود أن أقول إن إتقان الأدوات المتقدمة لتطوير الشبكات العصبية وحل المشكلات البسيطة ، بعد تحديد الخطوات اللازمة لحلها بشكل صحيح وقراءة النظرية قليلاً ، يبدو أنها مهمة سهلة للغاية. أود أن أشير إلى أنني رأيت عدة مقالات حول موضوع التحليل اللوني على حبري ، ولكن كان لا يزال من المثير للاهتمام تجربة شيء أسهل وبدون كتلة نصية ضخمة ، على الرغم من أنك بحاجة إلى دراسة النظرية دون قيد أو شرط :)

يمكنك العثور على الرمز هنا إذا وضعت علامة نجمية في المشروع ، فسيكون ذلك رائعًا. إذا كنت بحاجة إلى ملفات ذات أوزان وبنية شبكة ، بالإضافة إلى البيانات التي تمت معالجتها - اكتب إلى التعليقات ، وأضف إلى المستودع.

All Articles