يقارن هذا المعيار التجريبي طرقًا مختلفة لتمثيل الكلمات في مهمة مبسطة لبناء نموذج اللغة SO.
نموذج اللغة هو وسيلة لحساب احتمال وجود جزء معين من النص (سلسلة الكلمات). استخدمت NLP في السابق خيارات مختلفة على نطاق واسع لبناء LM استنادًا إلى حساب n-grams والتنعيم (تجانس) للتعويض عن تصريف الأوساخ n من الأقواس الكبيرة. على سبيل المثال ، لدى NLTK تنفيذ طريقة Kneser-Mney. هناك أيضًا عدد كبير من التطبيقات المختلفة التي تختلف في التفاصيل الفنية المتعلقة بتخزين كميات كبيرة من معلومات N-gramer وسرعة معالجة النص ، على سبيل المثال https://github.com/kpu/kenlm.
في العامين الماضيين ، تلقت خيارات مختلفة لنماذج اللغة العصبية (NLMS) استخدامًا واسع النطاق ، والتي تستخدم مختلف البنية العصبية ، بما في ذلك المتكررة والمتأمة. يمكن تقسيم NLM إلى مجموعتين: العمل على مستوى الكلمات (NLM على دراية الكلمات) وعلى مستوى الأحرف (NLM على دراية بالأحرف). الخيار الثاني مثير للاهتمام بشكل خاص لأنه يسمح للنموذج بالعمل مع المورفيميات . هذا مهم للغاية لللغات ذات التشكل الغني. بالنسبة لبعض الكلمات ، يمكن أن تكون المئات من الأشكال النحوية موجودة ، كما في حالة الصفات في اللغة الروسية. حتى حالة نصية كبيرة جدًا لا تضمن أن يتم تضمين جميع أشكال المتغيرات من الكلمات في المفردات من أجل NLM المدركة. من ناحية أخرى ، تطيع الهياكل المورفمية دائمًا القواعد العادية ، لذا فإن معرفة الأساس أو الشكل الأساسي للكلمة تسمح لك بتوليد خياراتها النحوية والدلالية: الجريئة ، الجريئة ، اللدغة ، الجريئة ، وما إلى ذلك ، وكذلك تحديد العلاقة الدلالية بين نفس الكلمات المُثبَّرة. تصبح الملاحظة الأخيرة مهمة للغاية بالنسبة لحقول NLP مع تكوين الكلمات الديناميكي ، أولاً وقبل كل شيء ، إنها كل أنواع وسائل التواصل الاجتماعي.
ضمن إطار هذا المعيار ، تم إعداد جميع الكود اللازم لدراسة ومقارنة كلا من خيار NLM ، إلى جانب طرق أخرى لبناء LM-characte-arming و word-word.
سنبسيط قليلاً من طراز Langage الخاص بنا ، ونضع المهمة في هذا النموذج. هناك n-gram من الطول المحدد مسبقًا (انظر ثابت ngram_order في وحدة DataSetVectorizers). إذا تم الحصول عليها من حالة النص (يتم خياطة المسار إلى ملف UTF-8 الملتصق في _GET_CORPUS_PATH CLASSIRESIRER) ، فإننا نعتقد أن هذا مزيج صالح من الكلمات والقيمة المستهدفة y = 1.
يتم إنشاء n-grams غير مقبولة أثناء تحليل الحالة في نفس المبلغ الصحيح. اتضح أن مجموعة بيانات متوازنة ، مما يسهل المهمة. ويتيح لك الافتقار إلى الحاجة إلى علامات يدوية "اللعب" بسهولة مع المعلمة مثل عدد السجلات في مجموعة بيانات التدريب.
وبالتالي ، يتم حل مشكلة التصنيف الثنائي. سيكون المصنف هو تنفيذ التدرج الذي يعزز XgBoost والشبكة العصبية ، ويتم تنفيذه على keras ، بالإضافة إلى العديد من الخيارات الأخرى على لغات البرمجة المختلفة وأطر DL.
كائن الدراسة هو تأثير طريقة تمثيل الكلمات في مصفوفة الإدخال X على دقة التصنيف.
يمكن العثور على تحليل تفصيلي لمختلف الأساليب لـ NLP ، بما في ذلك للمهام المماثلة ، في المقالة: تمهيدي على نماذج الشبكة العصبية لمعالجة اللغة الطبيعية.
يتم فحص الخيارات التالية لـ XgBoost:
W2V - نستخدم Word2Vec المدربين المدربين ، وكلمات الكلمات الصماء في متجه طويل
W2V_TAGS - توسيع تمثيل W2V ، يتم الحصول على فئات إضافية من المتجه النهائي من العلامات المورفولوجية للكلمات. اتضح شيئًا مثل نموذج اللغة المحسوب
SDR - تمثيلات موزعة متناثرة الكلمات التي تم الحصول عليها من قبل عوامل نموذج Word2Vector
random_bitvector - تُعزى كل كلمة إلى متجه ثنائي ثنائي عشوائي مع نسبة معينة من 0/1
قبل الميلاد - يتم استخدام المتجهات التي تم إنشاؤها نتيجة عمل التجميع البني (انظر الوصف
chars - يتم ترميز كل كلمة كسلسلة من تمثيل 1 -HOT للرموز
Hashing_trick - خدعة التجزئة المستخدمة لتشفير الكلمات مع عدد محدود من بت الفهرس (انظر الوصف https://en.wikipedia.org/wiki/feature_hashing والتنفيذ https://radimrehurek.com/gensim/corpora/hashdictine.html)
AE - يتم الحصول على كلمات الكلمات كتنشيط على الطبقة الداخلية للتشفير التلقائي. يتم تنفيذ التدريب في AutoEncoder والحصول على ناقلات الكلمات بواسطة البرنامج النصي Word_autoencoder3.py في مجلد pymodels/wordautoencoders.
تتوفر طريقتان إضافيتان للعرض التقديمي للشبكات العصبية ، والتي يتم تحويلها إلى تمثيل متجه معين باستخدام طبقة التضمين (أو ما شابه المكتبة المستخدمة.
Word_indeces - يتم تجميع المفردات ، يتم تعيين كل كلمة فهرس عدد صحيح فريد. وهكذا ، يبدو أن الدرجة الثلاثية هي ثلاثية من الأعداد الصحيحة.
char_indeces - يتم تجميع الأبجدية ، يتم تعيين كل رمز فهرس عدد صحيح فريد. علاوة على ذلك ، يتم استكمال سلاسل فهارس الرموز بواسطة فهرس العينة بنفس الطول (الحد الأقصى لطول الكلمة) ، ويتم إرجاع السلسلة الناتجة عن مؤشرات الرموز كعرض تقديمي لـ N-Gram. باستخدام طبقة من التضمين (التضمين في keras أو ما شابه ذلك) ، يتم تحويل الرموز إلى شكل متجه كثيف يعمل به بقية الشبكة العصبية. اتضح أن نسخة نموذج اللغة العصبية المدركة للشخصيات.
لحل المشكلة ، تم استخدام مكتبات مختلفة للتعلم الآلي والشبكات العصبية والمكتبات لحوسبة المصفوفة ، بما في ذلك:
كيراس (مع خلفية ثيانو)
لازانيا (ثيانو)
Nolearn (ثيانو)
Tensorflow
حلول بيثون:
pymodels/wr_xgboost.py - Resolver على أساس xgboost
pymodels/wr_catboost.py - Catboost Resolver على فهارس الكلمات باستخدام القدرة على الإشارة إلى فهارس الميزات الفئوية في مجموعة البيانات بحيث يتعلمها الداعم بشكل مستقل أثناء التدريب
pymodels/wr_keras.py - حل مستند إلى التغذية للأعشاب الأمامية المنفذة على keras
pymodels/wr_keras_sdr2.py - حل منفصل للتحقق من التمثيل الموزع المتناثر لبعد كبير (من 1024) مع جيل مجزأ من المصفوفات للتعلم والتحقق ، على الكيراس. pymodels/wr_lasagne.py - حل مستندة إلى خلاصات الأعصاب الأمامية التي تم تنفيذها على اللازانيا (theano)
pymodels/wr_nolearn.py - حل مستندة إلى الخلاصات للأمامية التي تم تنفيذها على nolearn+lasagne (theano)
pymodels/wr_tensorflow.py - حلال يعتمد على مقال الأعصاب الأمامي المنفذ على TensorFlow
حلول على C#:
csharpmodels/withAccordnet/program.cs - حل مستندة إلى شبكات التغذية الأمامية Accord.net (C#، مشروع مقابل 2015)
Csharpmodels/mybaseline/program.cs - حل استنادًا إلى تنفيذ الفانيليا MLP (C#، مشروع مقابل 2015)
حلول على C ++:
cxxmodels/tinydnn_model/tinydn_model.cpp - دقة MLP ، تنفذها مكتبة Tiny -DNN (C ++ ، مشروع مقابل 2015)
CxxModels/Singa_model/Alexnet.cc - حل محل على أساس شبكة عصبية تنفذها Apache.singa (C ++ ، مشروع مقابل 2015)
CXXModels/OpenNN_MODEL/MAIN.CPP - محرّر يعتمد على صورة عصبية ، تم تنفيذها بواسطة OpenNN (C ++ ، مشروع مقابل 2015)
حلول على java javamodels/with4j/src/main/java/wordrepresentationstest.java - mlp resolver ، تنفذها مكتبة deeplearning4j
الفصول والأدوات الداخلية:
pymodels/corpusreaders.py - فئات لخطوط القراءة من المباني النصية ذات التنسيقات المختلفة (مضغوط | txt عادي) pymodels/datasetvectorizers.py - محيطات مجموعة البيانات والمصنع للاختيار المناسب
pymodels/store_dataset_file.py - توليد مجموعة البيانات والحفاظ عليها لنماذج C# و C ++
للشبكات العصبية ، تم تنفيذ اثنين من المهندسين المعماريين على أساس keras. MLP عبارة عن خلاصة بسيطة للأمام مع طبقات كاملة. Convnet هو شبكة تستخدم طبقات الحزمة.
يتم تنفيذ بنيات التبديل بواسطة Net_arch في معلمة Net_arch في ملف wr_keras.py.
تجدر الإشارة إلى أن خيار Bristly غالبًا ما يعطي حلاً أكثر دقة ، ولكن النماذج المقابلة لها متغير أكبر ، ببساطة - الدقة النهائية تقفز بشكل كبير لعدة طرز ذات نفس المعلمات.
يمكن العثور على وصف مفصل للهندسة المعمارية والنتائج العددية للتجارب هنا: https://kelijah.livejournal.com/224925.html.
تستخدم جميع الخيارات القياسية ملفًا نصيًا في ترميز UTF-8 لتلقي قوائم N-Gram. من المفترض أن تقسيم النص إلى كلمات وجلب السجل السفلي يتم تقديمه مقدمًا بواسطة رمز ثالث. لذلك ، تقرأ البرامج النصية خطوطًا من هذا الملف ، واكسرها إلى كلمات بالمساحات.
من أجل راحة التجارب ، وضعت تعرضًا مضغوطًا لحالة كبيرة بحجم 100 ألف خط في مجلد البيانات. هذا يكفي لتكرار جميع القياسات. من أجل عدم زيادة تحميل المستودع بملف كبير ، يتم تقطيعه. طريقة baseveCtorizer._load_ngrams نفسها تفريغ محتوياتها أثناء الطيران ، لذلك لا تحتاج إلى القيام بأي معالجات يدوية.
في متغير تخصيص W2V_TAGS ، تتم إضافة ميزات المورفولوجية إلى الأوردة W2V. يتم أخذ هذه العلامات لكل كلمة من ملف Word2TAGS_BIN.ZIP في كاتبة البيانات الفرعية ، والتي يتم الحصول عليها عن طريق تحويل القاموس النحوي الخاص بي (http://solarix.ru/sql-sdictary-sdk.shtml). يتم سحب نتيجة التحويل إلى 165 ميغابايت ، وهو أكثر من اللازم لمستودع GIT. لذلك ، صرخت الملف الناتج للقاموس النحوي ، والفئة المقابلة لتجاوز مجموعة البيانات نفسها تفريغها أثناء التشغيل أثناء العملية.
يرجى ملاحظة أنه بسبب متجانسة النماذج النحوية ، فإن العديد من الكلمات لها أكثر من مجموعة من العلامات. على سبيل المثال ، يمكن أن تكون كلمة "الدببة" شكلاً من أشكال فرد أو صيغة ، على التوالي ، في حالة وراثية أو ترمائية. عند تكوين علامات للكلمات ، أنا أجمع علامات العلامات.
يتم استخدام عملية اثنين من المرحلة. أولا نحصل على متجهات W2V للكلمات. يقوم برنامج نصي صغير على المتجهات بتفريغ Python في ملف نصي بتنسيق CSV.
بعد ذلك ، باستخدام الأداة المساعدة https://github.com/mfaruqui/Sparse-coding ، يتم تنفيذ أمر:
.
يتم إنشاء ملف Out_Vecs.txt الذي يحتوي على كلمات SDR مع المعلمات المشار إليها: الحجم = 16*ناقل W2V ، ملء = 0.2 يتم تحميل هذا الملف بفئة SDR_Vectorizer.
https://habrahabr.ru/post/335838/
http://kelijah.livejournal.com/217608.html
كتحقق ، نستخدم حفظ n-grams من مجموعة التدريب والبحث بين n-grams المتذكر لمجموعة الاختبار. يؤدي الحجم الصغير لمجموعة التدريب إلى حقيقة أنه في مجموعة الاختبار ، يتصرف النموذج ببساطة كتخمين عشوائي ، مما يعطي دقة 0.50.
يتوفر الجدول الرئيسي للنتائج على الرابط. تم الحصول على بقية النتائج التالية لمجموعة من 1.000،000 3 جرام.
لمحلل على أساس xgboost (wr_xgboost.py) ، تم الحصول على النتائج التالية.
بالنسبة لمجموعة بيانات تحتوي على 1.000،000 trigrams: W2V_TAGS (Word2Vector + Morph Tags) ==> 0.81
W2V (Word2Vector Dim = 32) ==> 0.80
SDR (تمثل التوزيع المتفرق ، الطول 512 ، 20 ٪ وحدات) ==> 0.78 قبل الميلاد (التجميع البني) ==> 0.70
chars (تشفير واحد الحمل) ==> 0.71
random_bitvector (متجهات البت العشوائية ، حصة الوحدات 16 ٪) ==> 0.696
hashing_trick (خدعة التجزئة مع 32000 فتحة) ==> 0.64
لمحلل على أساس Lasagne MLP:
الدقة = 0.71
لمحلل على أساس Nolearn+Lasagne MLP:
الدقة = 0.64
لمحلل استند إلى Tiny-DNN MLP:
الدقة = 0.58
للحصول على حلال استنادًا إلى الشبكة العصبية للأفراد Accord.net:
Word2Vector ==> 0.68
للحصول على دقة Catboost حول الخصائص الفئوية لـ "فهرس الكلمات":
الدقة = 0.50
لمحلل على أساس apache.singa MLP:
الدقة = 0.74
حل الأساس - حفظ n -grams من مجموعة بيانات التدريب
الدقة = 0.50