بناء برنامج تصنيف النص: دروس البرمجة اللغوية العصبية
نشرت: 2022-03-11التعلم العميق عبارة عن تقنية أصبحت جزءًا أساسيًا من سير عمل التعلم الآلي. بالاستفادة من تحسينات قوة الحوسبة المتوازية والأدوات الداعمة ، أصبحت الشبكات العصبية المعقدة والعميقة التي كانت غير عملية في يوم من الأيام قابلة للتطبيق الآن.
كما أدى ظهور مكتبات قوية ويمكن الوصول إليها مثل Tensorflow و Torch و Deeplearning4j إلى فتح باب التطوير للمستخدمين خارج الدوائر الأكاديمية والبحثية لشركات التكنولوجيا الكبيرة. في شهادة على انتشارها المتزايد في كل مكان ، تقوم شركات مثل Huawei و Apple الآن بتضمين معالجات مخصصة ومُحسّنة للتعلم العميق في أحدث أجهزتها لتشغيل تطبيقات التعلم العميق.
أثبت التعلم العميق قوته عبر العديد من المجالات. والجدير بالذكر أن برنامج AlphaGo من Google كان قادرًا على هزيمة اللاعبين البشريين في لعبة Go ، وهي لعبة كان يُنظر إلى تعقيدها المحير للعقل في يوم من الأيام على أنه عائق شبه لا يمكن التغلب عليه أمام أجهزة الكمبيوتر في منافستها ضد اللاعبين البشريين. طور مشروع فلو ماشينز من سوني شبكة عصبية يمكنها تأليف الموسيقى بأسلوب الموسيقيين المشهورين في الماضي. تستخدم ميزة FaceID ، وهي ميزة أمان طورتها Apple ، التعلم العميق للتعرف على وجه المستخدم وتتبع التغييرات التي تطرأ على وجه المستخدم بمرور الوقت.
في هذه المقالة ، سنطبق التعلم العميق على اثنين من موضوعاتي المفضلة: معالجة اللغة الطبيعية والنبيذ. سنبني نموذجًا لفهم مراجعات النبيذ باللغة الطبيعية من قبل الخبراء واستنتاج تنوع النبيذ الذي يراجعونه.
التعلم العميق للغة البرمجة اللغوية العصبية
تم استخدام التعلم العميق على نطاق واسع في معالجة اللغة الطبيعية (NLP) لأنه مناسب تمامًا لتعلم البنية الأساسية المعقدة للجملة والقرب الدلالي من الكلمات المختلفة. على سبيل المثال ، تستخدم الحالة الفنية الحالية لتحليل المشاعر التعلم العميق من أجل التقاط المفاهيم اللغوية التي يصعب نمذجتها مثل النفي والمشاعر المختلطة.
يتمتع التعلم العميق بالعديد من المزايا مقارنة بالخوارزميات الأخرى في البرمجة اللغوية العصبية:
- النماذج المرنة: تعد نماذج التعلم العميق أكثر مرونة من نماذج التعلم الآلي الأخرى. يمكننا بسهولة تجربة الهياكل المختلفة ، وإضافة الطبقات وإزالتها حسب الحاجة. تسمح نماذج التعلم العميق أيضًا ببناء نماذج ذات مخرجات مرنة. المرونة هي المفتاح لتطوير النماذج التي هي مناسبة تماما لفهم الهياكل اللغوية المعقدة. كما أنه ضروري لتطوير تطبيقات البرمجة اللغوية العصبية مثل الترجمات وروبوتات المحادثة وتطبيقات تحويل النص إلى كلام.
- يتطلب معرفة أقل بالمجال: بينما يحتاج المرء بالتأكيد إلى بعض المعرفة بالمجال والحدس لتطوير نموذج جيد للتعلم العميق ، فإن قدرة خوارزميات التعلم العميق على تعلم التسلسلات الهرمية للميزات من تلقاء نفسها تعني أن المطور لا يحتاج إلى قدر كبير من المعرفة المتعمقة عن مساحة المشكلة لتطوير خوارزميات التعلم العميق في البرمجة اللغوية العصبية. بالنسبة لمساحة مشكلة معقدة مثل اللغة الطبيعية ، فهذه ميزة مرحب بها للغاية.
- تعلم مستمر أسهل: من السهل تدريب خوارزميات التعلم العميق مع ظهور بيانات جديدة. تتطلب بعض خوارزميات التعلم الآلي إرسال مجموعة البيانات بالكامل من خلال النموذج للتحديث ، مما قد يمثل مشكلة لمجموعات البيانات الحية الكبيرة.
المشكلة اليوم
اليوم ، سنبني خوارزمية تعلم عميق لتحديد مجموعة النبيذ التي تتم مراجعتها بناءً على نص المراجعة. سنستخدم مجموعة بيانات مجلات النبيذ على https://www.kaggle.com/zynicide/wine-reviews التي يوفرها مستخدم Kaggle zackthoutt .
من الناحية المفاهيمية ، السؤال هو ، هل يمكننا إجراء مراجعة للنبيذ مثل ...
تشمل الروائح الفاكهة الاستوائية والمكنسة والكبريت والأعشاب المجففة. الحنك ليس معبرًا بشكل مفرط ، حيث يقدم التفاح غير الناضج والحمضيات والمريمية المجففة جنبًا إلى جنب مع الحموضة السريعة.
... وتدرك أن الأمر يتعلق بمزيج أبيض؟ قد يتعرف بعض عشاق النبيذ على العلامات الواضحة للنبيذ الأبيض مثل التفاح والحمضيات والحموضة الواضحة ، ولكن هل يمكننا تدريب شبكتنا العصبية على التعرف على هذه الإشارات؟ بالإضافة إلى ذلك ، هل يمكننا تدريب شبكتنا العصبية على التعرف على الفروق الدقيقة بين مراجعة المزيج الأبيض ومراجعة Pinot grigio؟
خوارزميات مماثلة
المشكلة التي نعمل معها اليوم هي في الأساس مشكلة تصنيف البرمجة اللغوية العصبية. هناك العديد من خوارزميات تصنيف البرمجة اللغوية العصبية التي تم تطبيقها على مشاكل مختلفة في البرمجة اللغوية العصبية. على سبيل المثال ، تم استخدام ساذج Bayes في العديد من خوارزميات الكشف عن البريد العشوائي ، وتم استخدام آلات المتجهات الداعمة (SVM) لتصنيف النصوص مثل ملاحظات التقدم في مؤسسات الرعاية الصحية. سيكون من المثير للاهتمام تنفيذ نسخة بسيطة من هذه الخوارزميات لتكون بمثابة الأساس لنموذج التعلم العميق الخاص بنا.
ساذج بايز
يتضمن التطبيق الشائع لـ Bayes الساذج لـ NLP المعالجة المسبقة للنص باستخدام TF-IDF ثم تشغيل Bayes الساذجة متعددة الحدود على النواتج المجهزة مسبقًا. يتيح ذلك تشغيل الخوارزمية على أبرز الكلمات داخل المستند. يمكننا تنفيذ السذاجة Bayes على النحو التالي:
import numpy as np from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import CountVectorizer import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfTransformer df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() varietal_list = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = np.array(varietal_list) count_vect = CountVectorizer() x_train_counts = count_vect.fit_transform(description_list) tfidf_transformer = TfidfTransformer() x_train_tfidf = tfidf_transformer.fit_transform(x_train_counts) train_x, test_x, train_y, test_y = train_test_split(x_train_tfidf, varietal_list, test_size=0.3) clf = MultinomialNB().fit(train_x, train_y) y_score = clf.predict(test_x) n_right = 0 for i in range(len(y_score)): if y_score[i] == test_y[i]: n_right += 1 print("Accuracy: %.2f%%" % ((n_right/float(len(test_y)) * 100)))
قم بتشغيل الكود أعلاه وسترى شيئًا كالتالي: 73.56٪

بالنظر إلى أننا ننظر إلى 10 فصول ، فهذه نتيجة جيدة للغاية.
يمكننا أيضًا استخدام آلة المتجه الداعمة ونرى كيف ستفعل. لمعرفة كيفية أدائها ، ما عليك سوى استبدال تعريف المصنف بـ
clf = SVC(kernel='linear').fit(train_x, train_y)
قم بتشغيل هذا وسترى الإخراج التالي:
دقة: 80.66٪
ليس رث جدا أيضا.
دعونا نرى ما إذا كان بإمكاننا بناء نموذج تعليمي عميق يمكنه تجاوز هذه النتائج أو على الأقل مطابقتها. إذا نجحنا في ذلك ، فسيكون ذلك مؤشرًا رائعًا على أن نموذج التعلم العميق الخاص بنا فعال في تكرار نتائج نماذج التعلم الآلي الشائعة المستنيرة من خلال خبرة المجال على الأقل.
بناء النموذج
اليوم ، سنستخدم Keras مع Tensorflow لبناء نموذجنا. Keras هي مكتبة Python تجعل بناء نماذج التعلم العميق أمرًا سهلاً للغاية مقارنة بالواجهة منخفضة المستوى نسبيًا لواجهة Tensorflow API. بالإضافة إلى الطبقات الكثيفة ، سنستخدم أيضًا طبقات التضمين والتلافيف لمعرفة المعلومات الدلالية الأساسية للكلمات والأنماط الهيكلية المحتملة داخل البيانات.
تنظيف البيانات
أولاً ، سيتعين علينا إعادة هيكلة البيانات بطريقة يمكن معالجتها وفهمها بسهولة بواسطة شبكتنا العصبية. يمكننا القيام بذلك عن طريق استبدال الكلمات بأرقام تعريف فريدة. بالاقتران مع متجه التضمين ، يمكننا تمثيل الكلمات بطريقة مرنة وحساسة لغويًا.
من الناحية العملية ، نريد أن نكون أكثر ذكاءً بشأن هذه المعالجة المسبقة. سيكون من المنطقي التركيز على الكلمات شائعة الاستخدام ، وكذلك تصفية الكلمات الأكثر استخدامًا (على سبيل المثال ، the ، this ، a).
يمكننا تنفيذ هذه الوظيفة باستخدام Defaultdict و NLTK. اكتب الكود التالي في وحدة Python منفصلة. لقد وضعته في lib/get_top_x_words.py
.
from nltk import word_tokenize from collections import defaultdict def count_top_x_words(corpus, top_x, skip_top_n): count = defaultdict(lambda: 0) for c in corpus: for w in word_tokenize(c): count[w] += 1 count_tuples = sorted([(w, c) for w, c in count.items()], key=lambda x: x[1], reverse=True) return [i[0] for i in count_tuples[skip_top_n: skip_top_n + top_x]] def replace_top_x_words_with_vectors(corpus, top_x): topx_dict = {top_x[i]: i for i in range(len(top_x))} return [ [topx_dict[w] for w in word_tokenize(s) if w in topx_dict] for s in corpus ], topx_dict def filter_to_top_x(corpus, n_top, skip_n_top=0): top_x = count_top_x_words(corpus, n_top, skip_n_top) return replace_top_x_words_with_vectors(corpus, top_x)
نحن الآن جاهزون لبناء النموذج. نريد طبقة تضمين وطبقة تلافيفية وطبقة كثيفة للاستفادة من جميع ميزات التعلم العميق التي يمكن أن تكون مفيدة لتطبيقنا. باستخدام Keras ، يمكننا بناء النموذج بكل بساطة:
from keras.models import Sequential from keras.layers import Dense, Conv1D, Flatten from keras.layers.embeddings import Embedding from keras.preprocessing import sequence from keras.utils import to_categorical import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from lib.get_top_xwords import filter_to_top_x df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() mapped_list, word_list = filter_to_top_x(description_list, 2500, 10) varietal_list_o = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = to_categorical(varietal_list_o) max_review_length = 150 mapped_list = sequence.pad_sequences(mapped_list, maxlen=max_review_length) train_x, test_x, train_y, test_y = train_test_split(mapped_list, varietal_list, test_size=0.3) max_review_length = 150 embedding_vector_length = 64 model = Sequential() model.add(Embedding(2500, embedding_vector_length, input_length=max_review_length)) model.add(Conv1D(50, 5)) model.add(Flatten()) model.add(Dense(100, activation='relu')) model.add(Dense(max(varietal_list_o) + 1, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(train_x, train_y, epochs=3, batch_size=64) y_score = model.predict(test_x) y_score = [[1 if i == max(sc) else 0 for i in sc] for sc in y_score] n_right = 0 for i in range(len(y_score)): if all(y_score[i][j] == test_y[i][j] for j in range(len(y_score[i]))): n_right += 1 print("Accuracy: %.2f%%" % ((n_right/float(len(test_y)) * 100)))
قم بتشغيل الكود وسترى الإخراج التالي.
دقة: 77.20٪
تذكر أن دقة بايز الساذجة و SVC كانت 73.56٪ و 80.66٪ على التوالي. لذا ، فإن شبكتنا العصبية تتمتع بميزة خاصة بها مقابل بعض طرق تصنيف النص الأكثر شيوعًا الموجودة هناك.
خاتمة
اليوم ، قمنا بتغطية بناء نموذج تعليمي عميق للتصنيف لتحليل مراجعات النبيذ.
وجدنا أننا كنا قادرين على بناء نموذج كان قادرًا على التنافس مع بعض خوارزميات التعلم الآلي الأخرى والتفوق عليها في الأداء. نأمل أن تكون مصدر إلهام لك لاستخدام هذه المعلومات لإنشاء تطبيقات تحلل مجموعات البيانات الأكثر تعقيدًا وتنتج مخرجات أكثر تعقيدًا!
ملاحظة: يمكنك العثور على الكود الذي استخدمته لهذه المقالة على GitHub.
مزيد من القراءة على مدونة Toptal Engineering:
- معنى أعمق: نمذجة الموضوع في بايثون
- كيفية إنشاء روبوت لتحليل المشاعر عبر البريد الإلكتروني: برنامج تعليمي في البرمجة اللغوية العصبية