سؤال

لدي حوالي 300 كيلو الوثائق المخزنة في قاعدة بيانات بوستجرس التي هي ذات الكلمات الدلالية مع الموضوع فئات (هناك حوالي 150 الفئات في المجموع).لدي آخر 150k الوثائق التي لا تملك الفئات.أنا في محاولة للعثور على أفضل طريقة programmaticly تصنيف لهم.

لقد تم استكشاف NLTK و من السذاجة Bayes المصنف.يبدو مثل نقطة انطلاق جيدة (إذا كنت يمكن أن تشير إلى أفضل خوارزمية تصنيف لهذه المهمة, أنا كل آذان).

مشكلتي هي أنني لم يكن لديك ما يكفي من ذاكرة الوصول العشوائي لتدريب NaiveBayesClassifier على جميع 150 categoies/300k وثائق في آن واحد (التدريب على 5 فئات تستخدم 8GB).وعلاوة على ذلك, دقة المصنف يبدو أن إسقاط أتدرب على أكثر الفئات (90% دقة مع فئات 2, 81% مع 5 ، 61% مع 10).

يجب أن القطار المصنف على 5 فئات في تشغيل جميع 150k الوثائق عن طريق المصنف لمعرفة ما إذا كانت هناك مباريات ؟ يبدو مثل هذا العمل إلا أنه سيكون هناك الكثير من ايجابيات كاذبة حيث الوثائق التي لا تتطابق مع أي من الفئات الحصول على الحذاء مقرن في طريق المصنف لمجرد انها أفضل مباراة المتاحة...هل هناك طريقة أن يكون "أي من أعلاه" الخيار المصنف فقط في حالة وثيقة لا تنسجم مع أي من الفئات ؟

هنا هو بلدي اختبار الفصل http://gist.github.com/451880

هل كانت مفيدة؟

المحلول

يجب أن تبدأ بتحويل مستنداتك إلى متجهات TF-LOG (1 + IDF): ترددات المصطلحات قليلة ، لذا يجب عليك استخدام قول بيثون بمصطلح كمفاتيح واعتماد كقيم ثم تقسم على إجمالي عدد الترددات العالمية.

حل آخر هو استخدام ABS (التجزئة (المصطلح)) على سبيل المثال كمفاتيح عدد صحيح موجب. ثم يمكنك استخدام ناقلات scipy.sparse التي هي أكثر سهولة وأكثر كفاءة لإجراء عملية الجبر الخطي من Python Dict.

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

إذا لم يكن هذا جيدًا بما فيه الكفاية ، فعليك محاولة تدريب نموذج الانحدار اللوجستي باستخدام عقوبة L1 كما هو موضح في هذا المثال من Scikit-Learn (هذا غلاف لـ liblinar كما أوضحت من قبل ephes). يجب أن تكون المتجهات المستخدمة لتدريب نموذج الانحدار اللوجستي الخاص بك هو متجهات TD-LOG (1+IDF) التي تم تقديمها مسبقًا للحصول على أداء جيد (الدقة والاستدعاء). يقدم Scikit Learn Lib وحدة Sklearn.Metrics مع إجراءات لحساب تلك النتيجة لنموذج معين ومجموعة بيانات معينة.

للحصول على مجموعات بيانات أكبر: يجب أن تجرب vowpal wabbit ربما يكون أسرع أرنب على الأرض لمشاكل تصنيف المستندات على نطاق واسع (ولكن ليس من السهل استخدام أغلفة Python AFAIK).

نصائح أخرى

كيف كبيرة (عدد الكلمات) هي الوثائق ؟ استهلاك الذاكرة في 150K trainingdocs لا ينبغي أن يكون مشكلة.

من السذاجة Bayes هو خيار جيد خصوصا عندما يكون لديك العديد من الفئات فقط مع عدد قليل من الأمثلة التدريبية أو صاخبة جدا trainingdata.ولكن في عام الخطي تدعم ناقل آلات أداء أفضل بكثير.

مشكلتك multiclass (وثيقة ينتمي فقط إلى فئة واحدة exclusivly) أو multilabel (وثيقة ينتمي إلى واحدة أو أكثر من فئات)?

دقة هو سوء اختيار القاضي المصنف الأداء.يجب عليك بدلا من ذلك استخدام الدقة مقابل يذكر الدقة أذكر نقطة التعادل (prbp), f1, auc و أن ننظر إلى الدقة مقابل أذكر منحنى حيث يذكر (x) هو تآمر ضد الدقة (ص) على أساس قيمة الثقة عتبة (والطقس وثيقة ينتمي إلى فئة أو لا).عادة يمكنك أن بناء واحد ثنائي المصنف في الفئة (التدريب إيجابية أمثلة من فئة واحدة مقابل الأخرى trainingexamples التي لا تنتمي إلى الفئة الحالية).سيكون لديك لاختيار الأمثل الثقة عتبة لكل فئة.إذا كنت ترغب في الجمع بين تلك واحدة تدابير لكل فئة في الأداء العالمي قياس, عليك أن الصغير (تلخيص صحيح ايجابيات ايجابيات كاذبة كاذبة السلبيات الحقيقية السلبيات و احسب جنبا إلى جنب درجات) أو الكلي (احسب درجة لكل فئة ثم متوسط تلك الدرجات على جميع الفئات) متوسط.

لدينا مجموعة من عشرات ملايين الوثائق الملايين من الأمثلة التدريبية و الآلاف من فئات (multilabel).منذ نواجهها خطيرة وقت التدريب مشاكل (عدد الوثائق الجديدة, تحديث أو حذف في اليوم الواحد عالية جدا), يمكننا استخدام نسخة معدلة من liblinear.ولكن المشاكل الصغيرة باستخدام واحدة من بيثون مغلفة حول liblinear (liblinear2scipy أو scikit تعلم) يجب أن تعمل بشكل جيد.

هل هناك طريقة للحصول على خيار "لا شيء من المذكورة أعلاه" للمصنف فقط في حالة عدم ملاءمة المستند مع أي من الفئات؟

قد تحصل على هذا التأثير ببساطة من خلال تدريب "لا شيء من" الفئة الزائفة المذكورة أعلاه في كل مرة. إذا كان الحد الأقصى الذي يمكنك تدريبه هو 5 فئات (على الرغم من أنني لست متأكدًا من سبب تناولها كثيرًا من ذاكرة الوصول العشوائي) ، فقم بتدريب 4 فئات فعلية من مستنداتها الفعلية 2K لكل منها ، و "لا شيء مما سبق" مع مستندات 2K الخاصة به تم أخذها بشكل عشوائي من جميع الفئات الـ 146 الأخرى (حوالي 13-14 من كل منها إذا كنت تريد نهج "أخذ العينات الطبقية" ، والذي قد يكون أسلم).

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top