كيفية حل مشكلة قديمة باستخدام ML في Python و .Net


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


لقد حللت هذه المشكلة عدة مرات - في دلفي ، C #. ثم كانت خوارزمية صعبة ، حيث كتبت بيدي ، على سبيل المثال ، ما يمكن أن يكون عرض النص ، بحيث تم اعتبار هذا النص منسقًا "بالطريقة القديمة". لم ينجح هذا دائمًا تمامًا ، ولكن بشكل عام ، كان هذا كافٍ.


في الوقت الحالي ، أقوم بالزحف في بعض مشروعات ML في Python. في مرحلة ما ، اتضح أن مجموعة المستندات التالية تتكون من نصوص مستخرجة من إصدارات PDF لمقالات علمية. بالطبع ، تم استخراج النص بخط فاصل متين من قبل أحرف نهاية الفقرة ، مع الواصلات. وهذا يعني أنه كان من المستحيل العمل بشكل طبيعي مع هذه النصوص. بيثون جذابة لأنه يحتوي على كل شيء تقريبًا! لكن بضع ساعات من عمليات البحث لم تعطي أي شيء عاقل (ربما ، بالطبع ، هذا ما كنت أبحث عنه). ثم قررت مرة أخرى أن أكتب معالج نشر لهذه المستندات. كان الاختيار من بين خيارين - قم بتنزيل الرمز السابق باستخدام C # ، أو اكتب شيئًا يمكن تعليمه. أخيرًا ، كان الدافع وراء النهج الثاني هو أن النصوص العلمية قد تم تصديرها جزئيًا من نصوص ذات عمودين ، وجزئيًا من نصوص ذات عمود واحد. أحجام الخطوط المختلفة أيضا. وأدى ذلك إلى حقيقة أن النسخة القديمة ، مع الحدود المسموح بها الثابت ، وغالبا ما تعمل بشكل غير صحيح. للجلوس يدويًا مرة أخرى ، والتقاط الخيارات - حسنًا ، لا ستظهر قريبًا ، ليس لدي وقت لذلك! لذلك ، فقد تقرر - نحن نكتب مكتبة باستخدام التعلم الآلي.


يمكن العثور على جميع الأكواد في المستودع :



وسم


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


لذلك ، الشيء الأكثر مملة هو العلامات. يحتوي مجلد corpus على مستندات أخذتها للتو من نص مستند Krapivin2009 الذي كنت أعمل معه في تلك اللحظة. هناك 10 وثائق تبدو نموذجية بالنسبة لي. لقد حددت الرقم 3 فقط ، حيث أنه في بداية التدريب على هذه القاعدة ، تم الحصول على جودة كافية من "المادة اللاصقة". إذا تبين في المستقبل أن كل شيء ليس بهذه البساطة ، فسيتم إسقاط مستندات جديدة مع العلامات في هذا المجلد وستتكرر عملية التعلم.


في هذه الحالة ، بدا لي أن الملفات بقيت نصية ، لذلك كان تنسيق العلامات هو إضافة علامة في بداية السطر مفادها أنه يجب لصق هذا السطر على السطر السابق (الحرف '+') أو عدمه (الحرف '*'). هنا مقتطف (ملف 1005058.txt ):


*Introduction *Customers on the web are often overwhelmed with options and flooded with promotional messages for +products or services they neither need nor want. When users cannot find what they are searching for, the +e-commerce site struggles to maintain good customer relations. *Employing a recommender system as part of a site's Customer Relationship Management (CRM) activities +can overcome the problems associated with providing users with too little information, or too much of +the wrong information. Recommender systems are able to assist customers during catalog browsing and are +an effective way to cross-sell and improve customer loyalty. *In this paper, we will compare several recommender systems being used as an essential component of +CRM tools under development at Verizon. Our solutions are purposely for the current customers and current +products - recommendations for new customers and new products are out of the scope of this paper. 

بضع ساعات من العمل الشاق و 3 ملفات مع 2300 أمثلة (سطر واحد - عينة واحدة) جاهزة. هذا يكفي بالفعل في كثير من الحالات للمصنفات البسيطة مثل الانحدار اللوجستي ، والذي تم تطبيقه بعد ذلك.


ملامح


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


يتم تنفيذ تحويل النص إلى قائمة من الميزات والعلامات ، سواء كان يجب الغراء باستخدام السطر السابق ، بواسطة وظيفة المساعد _featurize_text_with_annotation :


 x, y = pdf_lines_gluer._featurize_text_with_annotation(raw_text) 

ملاحظة - هنا والمزيد من أجزاء التعليمات البرمجية في python go ، والتي يمكنك رؤيتها بالكامل في جهاز كمبيوتر محمول .


الميزات المستخدمة:


  • "this_len" - طول السطر الحالي بالأحرف.
  • 'mean_len' - متوسط ​​طول الخطوط في النطاق -5 ... + 5 خطوط.
  • "prev_len" - طول السطر السابق بالأحرف.
  • "first_chars" - هنا هو ميزة صعبة لدينا. يتم وضع أول 2 أحرف من السلسلة هنا. ولكن في الوقت نفسه ، يتم استبدال جميع الأحرف الصغيرة (من أي حروف أبجدية) بالحرف الإنجليزي "a" ، ويتم استبدال الحروف الكبيرة بـ "A" ، ويتم استبدال الأرقام بحرف "0". هذا يقلل بشكل كبير من عدد العلامات المحتملة ، مع تلخيصها. أمثلة لما يحدث: "أأ" ، "أأ" ، "أأ" ، "0." ، "أ-" ...
  • "isalpha" - ما إذا كانت الرسالة هي الحرف الأخير من السطر السابق.
  • "isdigit" - ما إذا كان الرقم هو آخر حرف في السطر السابق.
  • "islower" - ما إذا كان الحرف الصغير هو الحرف الأخير من السطر السابق.
  • "علامات الترقيم" - علامة ترقيم تنتهي بالسطر السابق أو بمسافة للأحرف الأخرى.

مثال على مجموعة من الميزات لسطر واحد:


 {'this_len': 12, 'mean_len': 75.0, 'prev_len': 0, 'first_chars': 'Aa', 'isalpha': False, 'isdigit': False, 'islower': False, 'punct': ' '} 

لكي يعمل المصنف من حزمة sklearn معهم ، نستخدم فئة DictVectorizer ، التي يتم من خلالها تحويل ميزات السلسلة (لدينا 'first_chars') إلى عدة أعمدة بعنوان (يمكن الحصول على الأسماء عبر get_feature_names () ) باسم "first_chars = Aa '،' first_chars = 0. '. تتحول الميزات المنطقية إلى أصفار وميزات ، بينما تظل القيم العددية أرقامًا - لا تتغير أسماء الحقول. ظاهريا ، تقوم الطريقة بإرجاع numpy.array من هذا النوع تقريبًا (يظهر سطر واحد فقط):


 [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 39.1 30. 0. 1. 36. ]] 

تدريب المصنف


بعد تلقي مجموعة من الميزات في شكل مجموعة من أرقام الفاصلة العائمة ، يمكننا الآن بدء عملية التعلم. للقيام بذلك ، نستخدم الانحدار اللوجستي كمصنف. الفصول الدراسية غير متوازنة ، لذلك قمنا بتعيين الخيار class_weight = "متوازن" ، ونحن نتحقق من النتيجة في جزء الاختبار من الحالة:


 from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report clf = LogisticRegression(random_state=1974, solver='liblinear', max_iter=2000, class_weight='balanced') clf.fit(x_train, y_train) y_pred = clf.predict(x_test) print(classification_report(y_true=y_test, y_pred=y_pred)) 

نحصل على مؤشرات الجودة هذه:


  precision recall f1-score support False 0.82 0.92 0.86 207 True 0.96 0.91 0.94 483 accuracy 0.91 690 macro avg 0.89 0.91 0.90 690 weighted avg 0.92 0.91 0.91 690 

كما ترون ، في حوالي 1/10 من الحالات ، لدينا أخطاء من مختلف الأنواع. لكن في الممارسة العملية ، كل شيء ليس مخيفًا جدًا. والحقيقة هي أنه حتى مع ترميز العين ، فإنه ليس من الواضح دائمًا مكان نهاية الفقرة وأين تنتهي الجملة فقط. لذلك ، حتى العلامات نفسها قد تحتوي على مثل هذه الأخطاء. لكن الأخطاء الأكثر أهمية لا تكمن في مكان حدوثها على حدود الاقتراح ، ولكن حيث يظل الاقتراح ممزقًا. وهناك عدد قليل جدا من هذه الأخطاء في الواقع.


استعادة النص


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


      :         :       :      :        \n 

مسلحين بمثل هذه الإستراتيجية ، نستعيد النص الإنجليزي (توجد أخطاء مثل "ff" و "fi" في النص الأصلي - تم نسخها ببساطة من حالة Krapivin2009):


النص الإنجليزي الأصلي
 text = """The rapid expansion of wireless services such as cellular voice, PCS (Personal Communications Services), mobile data and wireless LANs in recent years is an indication that signicant value is placed on accessibility and portability as key features of telecommunication (Salkintzis and Mathiopoulos (Guest Ed.), 2000). devices have maximum utility when they can be used any- where at anytime". One of the greatest limitations to that goal, how- ever, is nite power supplies. Since batteries provide limited power, a general constraint of wireless communication is the short continuous operation time of mobile terminals. Therefore, power management is y Corresponding Author: Dr. Krishna Sivalingam. Part of the research was supported by Air Force Oce of Scientic Research grants F-49620-97-1- 0471 and F-49620-99-1-0125; by Telcordia Technologies and by Intel. Part of the work was done while the rst author was at Washington State Univer- sity. The authors' can be reached at cej@bbn.com, krishna@eecs.wsu.edu, pagrawal@research.telcordia.com, jcchen@research.telcordia.com c 2001 Kluwer Academic Publishers. Printed in the Netherlands. Jones, Sivalingam, Agrawal and Chen one of the most challenging problems in wireless communication, and recent research has addressed this topic (Bambos, 1998). Examples include a collection of papers available in (Zorzi (Guest Ed.), 1998) and a recent conference tutorial (Srivastava, 2000), both devoted to energy ecient design of wireless networks. Studies show that the signicant consumers of power in a typical laptop are the microprocessor (CPU), liquid crystal display (LCD), hard disk, system memory (DRAM), keyboard/mouse, CDROM drive, oppy drive, I/O subsystem, and the wireless network interface card (Udani and Smith, 1996, Stemm and Katz, 1997). A typical example from a Toshiba 410 CDT mobile computer demonstrates that nearly 36% of power consumed is by the display, 21% by the CPU/memory, 18% by the wireless interface, and 18% by the hard drive. Consequently, energy conservation has been largely considered in the hardware design of the mobile terminal (Chandrakasan and Brodersen, 1995) and in components such as CPU, disks, displays, etc. Signicant additional power savings may result by incorporating low-power strategies into the design of network protocols used for data communication. This paper addresses the incorporation of energy conservation at all layers of the protocol stack for wireless networks. The remainder of this paper is organized as follows. Section 2 introduces the network architectures and wireless protocol stack considered in this paper. Low-power design within the physical layer is brie y discussed in Section 2.3. Sources of power consumption within mobile terminals and general guidelines for reducing the power consumed are presented in Section 3. Section 4 describes work dealing with energy ecient protocols within the MAC layer of wireless networks, and power conserving protocols within the LLC layer are addressed in Section 5. Section 6 discusses power aware protocols within the network layer. Opportunities for saving battery power within the transport layer are discussed in Section 7. Section 8 presents techniques at the OS/middleware and application layers for energy ecient operation. Finally, Section 9 summarizes and concludes the paper. 2. Background This section describes the wireless network architectures considered in this paper. Also, a discussion of the wireless protocol stack is included along with a brief description of each individual protocol layer. The physical layer is further discussed. """ corrected = pdf_lines_gluer._preprocess_pdf(text, clf, v) print(corrected) 

بعد الشفاء ، نحصل على:


استعادة النص الانكليزي

يعد التوسع السريع في الخدمات اللاسلكية مثل الصوت الخلوي ، وأجهزة الكمبيوتر الشخصية (خدمات الاتصالات الشخصية) ، وبيانات الهواتف المحمولة والشبكات المحلية اللاسلكية في السنوات الأخيرة مؤشرا على أن القيمة الجوهرية توضع على إمكانية الوصول وقابلية النقل باعتبارهما من السمات الرئيسية للاتصالات (Salkintzis و Mathiopoulos (Guest Ed .) ، 2000). الأجهزة لها أقصى فائدة عندما يمكن استخدامها في أي مكان وفي أي وقت. "ومع ذلك ، فإن أحد أكبر القيود على تحقيق هذا الهدف هو توفير الطاقة بشكل بسيط. نظرًا لأن البطاريات توفر طاقة محدودة ، فإن العائق العام للاتصالات اللاسلكية هو وقت التشغيل المستمر القصير للهاتف المحمول. لذا ، فإن إدارة الطاقة هي y المراسل المقابل: د. كريشنا سيفالينجام ، وأيد جزء من هذا البحث من قبل القوات الجوية أويس للبحوث العلمية منح F-49620-97-10471 و F-49620-99-1-0125 ؛ بواسطة Telcordia تقنيات وإنتل: تم إنجاز جزء من العمل بينما كان المؤلف الأول في جامعة ولاية واشنطن ، ويمكن الوصول إلى المؤلفين على: cej@bbn.com ، krishna@eecs.wsu.edu ، pagrawal@research.telcordia.com ، jcchen@research.telcordia.com ج
2001 كلوير للنشر الأكاديمي. طبع في هولندا.
جونز ، سيفالينجام ، أغراوال وتشن واحدة من أكثر المشاكل تحديا في مجال الاتصالات اللاسلكية ، وقد تناولت الأبحاث الحديثة هذا الموضوع (بامبوس ، 1998). من الأمثلة على ذلك مجموعة من الأوراق المتاحة في (Zorzi (Guest Ed.) ، 1998) وبرنامج تعليمي حديث للمؤتمرات (Srivastava ، 2000) ، وكلاهما مخصص لتصميم شبكات الطاقة اللاسلكية.
تشير الدراسات إلى أن المستهلكين البارزين للطاقة في جهاز كمبيوتر محمول نموذجي هم المعالج الدقيق (CPU) وشاشة الكريستال السائل (LCD) والقرص الثابت وذاكرة النظام (DRAM) ولوحة المفاتيح / الماوس ومحرك CDROM ومحرك الأقراص oppy ونظام الإدخال / الإخراج الفرعي ، وبطاقة واجهة الشبكة اللاسلكية (Udani and Smith، 1996، Stemm and Katz، 1997). مثال نموذجي من كمبيوتر Toshiba 410 CDT المحمول يوضح أن ما يقرب من 36 ٪ من الطاقة المستهلكة يتم بواسطة الشاشة ، و 21 ٪ من وحدة المعالجة المركزية / الذاكرة ،
18 ٪ من الواجهة اللاسلكية ، و 18 ٪ من القرص الصلب. وبالتالي ، تم مراعاة الحفاظ على الطاقة إلى حد كبير في تصميم الأجهزة الطرفية المتنقلة (Chandrakasan و Brodersen ، 1995) وفي مكونات مثل وحدة المعالجة المركزية ، والأقراص ، والعروض ، إلخ. قد ينتج عن توفير الطاقة الإضافي الهام عن طريق دمج استراتيجيات منخفضة الطاقة في تصميم بروتوكولات الشبكة المستخدمة في نقل البيانات. تتناول هذه الورقة دمج حفظ الطاقة في جميع طبقات مكدس البروتوكول للشبكات اللاسلكية.
تم تنظيم ما تبقى من هذه الورقة على النحو التالي. يقدم القسم 2 تصميمات الشبكات ومكدس البروتوكولات اللاسلكية المعتبر في هذه الورقة. تصميم منخفض الطاقة داخل الطبقة المادية هو brie y
تمت مناقشته في القسم 2.3. وترد في القسم 3. مصادر استهلاك الطاقة داخل الأجهزة المتنقلة والمبادئ التوجيهية العامة لتخفيض الطاقة المستهلكة. ويصف القسم 4 العمل الذي يتعامل مع بروتوكولات الطاقة الصديقة للبيئة ضمن طبقة MAC للشبكات اللاسلكية ، ويتم تناول بروتوكولات الحفاظ على الطاقة داخل طبقة LLC في القسم
5. يناقش القسم 6 البروتوكولات المدركة للطاقة داخل طبقة الشبكة. تتم مناقشة فرص توفير طاقة البطارية داخل طبقة النقل في القسم 7. ويعرض القسم 8 التقنيات في طبقات التشغيل / الوسيطة والتطبيق لتشغيل الطاقة الصديقة للبيئة.
أخيرًا ، يلخص القسم 9 الورقة ويختتمها.
2. الخلفية
يصف هذا القسم معماريات الشبكة اللاسلكية التي تم بحثها في هذه الورقة. أيضًا ، يتم تضمين مناقشة مكدس البروتوكول اللاسلكي مع وصف موجز لكل طبقة بروتوكول الفردية. تمت مناقشة الطبقة المادية.


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


لكننا كنا نخطط لجعل خيارًا مستقلاً عن اللغة. وهذا هو بالضبط ما تهدف مجموعة من الميزات لدينا. دعونا نتحقق من النص الروسي (أيضًا جزء من النص من PDF):


النص الروسي الأصلي
 ru_text = """       -       (. 1.10),    ,   - .       ,      , -   .       ,       .          : 1.        ,       -  (   ,   . 1.10,    ). 2.    ( )           ,     .      ,     .""" corrected = pdf_lines_gluer._preprocess_pdf(ru_text, clf, v) print(corrected) 

تلقينا:


استعادة النص الروسي

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


كل شيء مثالي هنا.


كيفية الاستخدام (توليد الكود)


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


  • بالنسبة لـ DictVectorizer ، يكفي حفظ أسماء المعالم وحقول المفردات
  • LogisticRegression has coef ، classes ، intercept_

لذلك ، وُلد خيار آخر مع إنشاء الشفرة (في الكمبيوتر المحمول ، يذهب في قسم "Serialize as code"):


  1. نقرأ ملف pdf_lines_gluer.py ، الذي يحتوي على تعليمات برمجية مساعدة لتوجيه واستعادة النص باستخدام مصنف مدرّب.
  2. في المكان المحدد في المصدر على أنه "# inject code here #" ، نقوم بإدراج الكود الذي يهيئ DictVectorizer و LogisticRegression في الحالة التي حصلنا عليها في جهاز الكمبيوتر المحمول لدينا بعد التدريب. نقوم أيضًا بحقن وظيفة preprocess_pdf العامة الوحيدة (إلى أقصى حد ممكن لـ Python):
     def preprocess_pdf(text: str) -> str: return _preprocess_pdf(text, _clf, _v) 
  3. تتم كتابة التعليمات البرمجية الناتجة إلى ملف pdf_preprocessor.py

هذا هو ملف pdf_preprocessor.py الذي تم إنشاؤه والذي يحتوي على كل ما نحتاجه. لاستخدامها ، ما عليك سوى أخذ هذا الملف واحد وإفلاته في مشروعك. استخدام:


 from pdf_preprocessor import preprocess_pdf ... print(preprocess_pdf(text)) 

إذا كانت لديك أي مشاكل في بعض النصوص ، فإليك ما عليك القيام به:


  1. ضع نصوصك في مجلد الإحضار ، وعلق عليها.
  2. أطلق جهاز الكمبيوتر المحمول https://github.com/serge-sotnyk/pdf-lines-gluer/blob/master/pdf_gluer.ipynb - يستغرق الأمر أقل من 5 ثوانٍ في النصوص الحالية.
  3. خذ واختبر الإصدار الجديد من ملف pdf_preprocessor.py

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


C # و ML.NET


في شركتنا ، يعتمد معظم كود الواجهة الخلفية على .Net. بالطبع ، التفاعل مع بيثون يضيف إزعاجًا هنا. وأود الحصول على حل مماثل في C #. لقد تابعت تطوير إطار ML.NET لفترة طويلة . لقد قمت بمحاولات صغيرة لفعل شيء ما في العام الماضي ، لكنهم كانوا مخيبين للآمال بسبب عدم كفاية تغطية الحالات المختلفة ، وكمية صغيرة من الوثائق ، وعدم استقرار API. منذ ربيع هذا العام ، تحول الإطار إلى حالة إصدار وقررت تجربته مرة أخرى. وعلاوة على ذلك ، فإن العمل الأكثر مملة مع تخطيط الجسم قد تم بالفعل.


للوهلة الأولى ، أضاف الإطار راحة. في كثير من الأحيان بدأت في العثور على الوثائق اللازمة (على الرغم من أنها لا تزال بعيدة عن الجودة والكمية في sklearn). ولكن الأهم من ذلك - منذ عام ما زلت لا أعرف sklearn. والآن بدأت أرى أن العديد من الأشياء في ML.NET كانت تحاول القيام بها في الصورة ومثالها (إلى أقصى حد ممكن ، بالنظر إلى الفرق في المنصات). سهّلت هذه التشبيهات تعلم مبادئ ML.NET في الممارسة العملية.


يمكن الاطلاع على مشروع عمل على هذه المنصة على https://github.com/serge-sotnyk/pdf-postprocess.cs


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


لكنني هنا لم أشارك في إنشاء الشفرة بعد الآن. لاستخدام النموذج المدربين ، استخدم مشروع PdfPostprocessor (والذي يحتوي داخليًا على نموذج PdfPostprocessModel.zip الذي تم تجميعه كمورد). بعد ذلك ، يمكن استخدام النموذج ، كما هو موضح في المثال الأدنى - https://github.com/serge-sotnyk/pdf-postprocess.cs/blob/master/MinimalUsageExample/Program.cs :


 using PdfPostprocessor; ... static void Main(string[] args) { var postprocessor = new Postprocessor(); Console.WriteLine(); Console.WriteLine("Restored paragraphs in the English text:"); Console.WriteLine(postprocessor.RestoreText(EnText)); Console.WriteLine(); Console.WriteLine("Restored paragraphs in the Russian text:"); Console.WriteLine(postprocessor.RestoreText(RuText)); } 

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


هناك nuget-package - PdfPostprocessor. لاستخدام الحزمة والطراز الذي قمت بتدريبه ، استخدم مُنشئ Postprocessor المحملة بشكل زائد.


مقارنة الخيارات في Python و C #


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


ما لم يعجبني عند التبديل إلى C #


  • الإسهاب. لا يزال ، رمز بيثون هو أكثر إحكاما. هذا هو عدم وجود أقواس المشغل ، والأقواس بعد إذا ، ل. عدم وجود جديدة لا نهاية لها. الاستخدام الفعال للحقول حيث من السهل أن تتحول إلى خصائص إذا لزم الأمر. حتى إلى حقيقة أن الخصوصية في Python ، والتي يشار إليها ببساطة من قبل الشرطة السفلية في بداية المعرف ، تعتاد على ذلك ، ومن الناحية العملية اتضح أنها مريحة للغاية وأكثر ملاءمة من مجموعة من معدّلات الخصوصية بلغات أخرى. كما أن اختصار الإنشاءات يسرع عملية التطوير ويسهل قراءة الكود.
  • في معظم الحالات ، يبدو رمز Python أنظف وأكثر أناقة (هذا شخصي فقط). هذا يجعلها أسهل في القراءة والصيانة.
  • بالنسبة لـ Python ، في كل شيء تقريبًا ، هناك نوع من الوظيفة أو الديكور في نوع ما من الحزمة ، ولكن في C # يجب إضافة الكثير. هذا يزيد من تضخيم رمز مع وظائف مختلفة ، والطبقات. ويستغرق المزيد من الوقت.
  • درجة توثيق C # وأطرها أقل بكثير من مثيلتها في نظام Python البيئي.
  • إن الكتابة الأكثر صرامة لـ ML.NET مقارنة بال sklearn النهمة أجبرتنا أيضًا على قضاء بعض الوقت في البحث عن التحولات الصحيحة ، ولم تسهم الفقرة السابقة في حل هذه المشكلة.

ما الذي أعجبك عند التبديل إلى C #


  • شعور الموثوقية. بالفعل في كثير من الأحيان ، ولكن بشكل منتظم ، يقودني بايثون النهمة إلى مشاكل بعيدة المنال. والآن ، عند نقل الرمز إلى C # ، حدث خطأ جعل بعض الميزات غير مجدية. بعد التصحيح ، ارتفعت دقة بنسبة اثنين في المئة.
  • السرعة. في رمز Python ، كان علي أن أتخلى عن الميزات التي تم ربطها بقرار اللصق الذي تم اتخاذه في العروض السابقة - إذا قمت بتقديم مقترحات إلى المصنف واحدًا تلو الآخر ، فإن السرعة الإجمالية ستكون أقل من اللوح الأساسي. لكي تكون معالجة البيانات في Python سريعة ، من الضروري توجيهها إلى أقصى حد ممكن وأحيانًا تجعلنا نرفض الخيارات المحتملة المفيدة ، أو يكون من الصعب جدًا القيام بها.
  • ينق. أنها أكثر ملاءمة بكثير من قائمة الفهم (LC) في بيثون. حتى LC مع واحد يجبرني على الكتابة أولاً بعد ، ثم العودة إلى البداية والإلحاق بها ، وعندها فقط كتابة تعبير في بداية LC. أعتقد أنه - حسب هذا الترتيب - مصدر السجلات والعناصر وما الذي يجب التحويل إليه. LINQ ( "" ) . LC ( for) . , , .
  • Lambda. , . , C# .

— . , .Net , . - — REST C#.


C# . — , - . Microsoft Kotlin — .Net , . Python- — , Julia . .


استنتاج


:


  • , — , , - . , , - .
  • . , ML.NET - . .
  • , Python- .Net. , .

Source: https://habr.com/ru/post/ar457072/


All Articles