مقدمة:
تطورت معالجة اللغة الطبيعية NLP كثيرًا في السنوات الأخيرة. وهي التقنية التي تشغّل روبوتات المحادثة والمساعدات الصوتية والنص التنبؤي وغيرها من تطبيقات الكلام والنص التي تتخلل حياتنا. وتتوافر أدوات مفتوحة المصدر كثيرة ومتنوعة، لذا قررت استعراض المشهد لمساعدتك على تخطيط تطبيقك المقبل المعتمد على الصوت أو النص.
ركزت في هذا الاستعراض على أدوات تستخدم لغات برمجة أعرفها، وإن لم أكن أعرف الأدوات كلها. ولم أجد، على أي حال، مجموعة واسعة في اللغات التي لا أعرفها. ومع ذلك استبعدت أدوات ثلاث لغات أعرفها لأسباب مختلفة.
قد تكون R أبرز الغائبين، لكن معظم مكتباتها التي عثرت عليها لم تُحدّث منذ أكثر من عام. لا يعني ذلك دائمًا سوء صيانتها، لكنني أرى ضرورة تحديثها بوتيرة أعلى لمنافسة الأدوات الأخرى. كما اخترت اللغات والأدوات الأرجح استخدامًا في بيئات الإنتاج بدل الأكاديميا والبحث، بينما استخدمت R غالبًا للبحث والاستكشاف.
وفاجأني أيضًا ركود مكتبات Scala نسبيًّا. مضى عامان تقريبًا منذ آخر استخدام لي لها، وكانت آنذاك شائعة. ولم تتلق معظم مكتباتها منذ ذلك الحين إلا تحديثات قليلة، أو لم تُحدّث أصلًا.
وأخيرًا استبعدت C++، أساسًا لأنني لم أكتب بها منذ سنوات كثيرة، ولأن المؤسسات التي عملت فيها لم تستخدمها لمعالجة اللغة الطبيعية أو أعمال علم البيانات.
أدوات بايثون
Natural Language Toolkit ـ NLTK
يمكن بسهولة عدّ NLTK أغنى الأدوات التي راجعتها بالوظائف. فهي توفر تقريبًا كل مكونات معالجة اللغة التي تحتاج إليها: التصنيف، وتقسيم النص إلى وحدات، والتجذير، والوسم، والتحليل النحوي، والاستدلال الدلالي. وغالبًا ما تقدم أكثر من تنفيذ لكل مكون، فتختار الخوارزمية أو المنهجية التي تريدها بدقة. وتدعم لغات طبيعية كثيرة. لكنها تمثل البيانات كلها بسلاسل نصية؛ وهذا مناسب للبنى البسيطة ويصعب استخدام بعض الوظائف المتقدمة. ووثائقها كثيفة، لكنها كثيرة، ولها كتاب ممتاز. كما أنها أبطأ قليلًا من أدوات أخرى. عمومًا هي مجموعة رائعة للتجريب والاستكشاف، وللتطبيقات التي تحتاج إلى توليفة خوارزميات محددة.
SpaCy
لعلها المنافس الرئيس لـNLTK. هي أسرع في أغلب الحالات، لكنها تقدم تنفيذًا واحدًا فقط لكل مكون. وتمثل كل شيء بكائنات بدل السلاسل النصية، فتسهل واجهة بناء التطبيقات، وتتكامل مع أطر وأدوات كثيرة لعلم البيانات. وبذلك تستطيع إنجاز المزيد بعد فهم بياناتك النصية جيدًا. لكنها لا تدعم عدد لغات NLTK نفسه. ولها واجهة بسيطة بخيارات مختصرة ووثائق ممتازة، ونماذج عصبية متعددة لمكونات المعالجة والتحليل. وهي عمومًا مناسبة للتطبيقات الجديدة التي تحتاج أداء إنتاجيًّا مرتفعًا ولا تشترط خوارزمية معينة.
TextBlob
تشبه امتدادًا لـNLTK؛ إذ تتيح كثيرًا من وظائفها بطريقة أبسط، وتضم وظائف من مكتبة Pattern أيضًا. قد تكون خيارًا جيدًا للتعلم عند البداية، وللتطبيقات الإنتاجية التي لا تتطلب أداء عاليًا جدًّا. وهي واسعة الاستخدام وممتازة للمشروعات الصغيرة.
Textacy
قد يكون اسمها أجمل اسم مكتبة استخدمتها؛ جرب نطقه مرات مع إبراز المقطع الأوسط ومد النهاية! والأداة رائعة أيضًا: تعتمد على SpaCy في الوظائف الأساسية، وتعالج كثيرًا من العمل السابق للمعالجة واللاحق لها. فإذا كنت تنوي استخدام SpaCy، فقد يكون استخدام Textacy أنسب لإدخال أنواع بيانات كثيرة بسهولة، من دون كتابة شفرة مساعدة إضافية.
PyTorch-NLP
لم يمض على ظهورها إلا ما يزيد قليلًا على سنة، لكنها كسبت بالفعل مجتمعًا كبيرًا. إنها ممتازة للنماذج الأولية السريعة، وتُحدَّث باستمرار وفق أحدث الأبحاث. وقد أطلقت شركات وباحثون أدوات أخرى كثيرة تنجز عمليات مدهشة، مثل تحويل الصور. يستهدف PyTorch عمومًا الباحثين، لكنه يصلح للنماذج الأولية ولأعباء إنتاجية أولية بأحدث الخوارزميات المتاحة. وتستحق المكتبات المبنية فوقه النظر أيضًا.
أدوات Node
Retext
هي جزء من unified collective. وUnified واجهة تتيح تكامل أدوات وإضافات متعددة وعملها معًا بكفاءة. وRetext أحد الأنواع الثلاثة لصيغ المعالجة في الأداة؛ والآخران Remark لـMarkdown وRehype لـHTML. الفكرة مثيرة للاهتمام، وأتطلع إلى نمو مجتمعها. لا تكشف Retext كثيرًا عن تقنياتها الداخلية، بل تستخدم إضافات لتحقيق النتائج المطلوبة. ويمكن بسهولة تدقيق الإملاء، وإصلاح التنضيد، واكتشاف المشاعر، والتحقق من سهولة القراءة بإضافات بسيطة. وهي خيار ممتاز إذا أردت إنجاز العمل دون فهم كل تفاصيل المعالجة الداخلية.
Compromise
ليست أكثر الأدوات تطورًا؛ فإن كنت تريد أحدث الخوارزميات أو أشمل نظام فلعلها لا تناسبك. لكن إذا أردت أداة جيدة الأداء واسعة الوظائف تعمل من جانب العميل، فألق نظرة عليها. واسمها «التسوية» دقيق؛ فقد ضحى مطوروها ببعض الشمول والدقة مقابل حزمة صغيرة ووظائف أكثر تحديدًا، تستفيد من فهم المستخدم للسياق المحيط بالاستخدام.
Natural
تضم معظم وظائف المكتبات العامة لمعالجة اللغة. تركز أساسًا على الإنجليزية، لكن أضيف دعم لغات أخرى، ويرحب المجتمع بإسهامات إضافية. وتدعم تقسيم النص والتجذير والتصنيف والصوتيات ومقياس تكرار المصطلح–معكوس تكراره في الوثائق TF-IDF وWordNet وتشابه السلاسل وبعض التصريفات. ويمكن مقارنتها بـNLTK في محاولتها جمع كل شيء في حزمة واحدة، لكنها أسهل استخدامًا ولا تركز بالضرورة على البحث. وهي شاملة نسبيًّا لكنها ما زالت قيد التطوير النشط، وقد تحتاج إلى معرفة إضافية بتنفيذاتها الداخلية للاستفادة الكاملة منها.
Nlp.js
مبنية على مكتبات أخرى، منها Franc وBrain.js. وتقدم واجهة جيدة للتصنيف وتحليل المشاعر والتجذير والتعرف إلى الكيانات المسماة وتوليد اللغة الطبيعية. وتدعم لغات كثيرة، مما يفيد من يعمل بغير الإنجليزية. وهي أداة عامة جيدة ذات واجهة مبسطة لعدة أدوات قوية، وقد تخدم تطبيقاتك طويلًا قبل أن تحتاج إلى شيء أقوى أو أكثر مرونة.
أدوات جافا
OpenNLP
تستضيفها مؤسسة أباتشي، فيسهل دمجها في مشروعات مثل Apache Flink وApache NiFi وApache Spark. وهي أداة عامة تغطي مكونات المعالجة الشائعة، ويمكن استخدامها من سطر الأوامر أو بوصفها مكتبة داخل التطبيق. ولها دعم واسع للغات متعددة. إنها قوية وغنية بالوظائف وجاهزة لأعباء الإنتاج إذا كنت تستخدم جافا.
StanfordNLP
Stanford CoreNLP مجموعة توفر المعالجة الإحصائية، والمعالجة بالتعلم العميق، والمعالجة المعتمدة على القواعد. وأُنشئت روابط للغات برمجة كثيرة لتستخدم خارج جافا. هي أداة قوية جدًّا من مؤسسة بحثية متميزة، لكنها قد لا تكون أفضل خيار لأعباء الإنتاج. وهي مزدوجة الترخيص، مع ترخيص خاص للأغراض التجارية؛ لذا تصلح كثيرًا للبحث والتجريب، وقد تستلزم تكلفة إضافية في نظام إنتاجي. وقد يهم تنفيذ بايثون قراء كثيرين أكثر من نسخة جافا. كما يدرس أستاذ من ستانفورد أحد أفضل مقررات التعلم الآلي على Coursera؛ انظر إليه مع الموارد الممتازة الأخرى.
CogCompNLP
طورتها جامعة إلينوي، ولها مكتبة بايثون بوظائف شبيهة. تستطيع معالجة النص محليًّا أو على أنظمة بعيدة، مما قد يخفف عبئًا كبيرًا عن جهازك. وتوفر تقسيم النص، ووسم أقسام الكلام، والتقسيم إلى عبارات، ووسم الكيانات المسماة، ورد الكلمات إلى صيغها المعجمية، وتحليل التبعية والتحليل إلى مكونات، ووسم الأدوار الدلالية. وهي ممتازة للبحث وتضم مكونات كثيرة تستحق الاستكشاف. ولست متأكدًا من ملاءمتها الكبيرة لأعباء الإنتاج، لكنها تستحق التجربة إن كنت تنوي استخدام جافا.
ما أدواتك ومكتباتك المفتوحة المفضلة لمعالجة اللغة الطبيعية؟ شاركها في التعليقات، وبخاصة إن لم أذكرها هنا.
المراجع
- https://www.nltk.org/
- https://www.nltk.org/book_1ed/
- https://spacy.io/
- https://textblob.readthedocs.io/en/dev/
- https://readthedocs.org/projects/textacy/
- https://pytorchnlp.readthedocs.io/en/latest/
- https://www.npmjs.com/package/retext
- https://unified.js.org/
- https://www.npmjs.com/package/compromise
- https://www.npmjs.com/package/natural
- https://www.npmjs.com/package/node-nlp
- https://opennlp.apache.org/
- https://stanfordnlp.github.io/CoreNLP/
- https://github.com/CogComp/cogcomp-nlp