database - كيفية إنشاء محرك التوصية الخاصة بي؟




recommendation-engine collective-intelligence (4)

أنا مهتم بمحركات التوصية هذه الأيام وأريد تحسين نفسي في هذا المجال. أقرأ حاليًا " الذكاء الجماعي للبرمجة " أعتقد أن هذا هو أفضل كتاب عن هذا الموضوع ، من أورايلي. لكن ليس لدي أي أفكار حول كيفية تنفيذ المحرك ؛ ما أقصده "لا فكرة" هو "لا أعرف كيف تبدأ". لدي مشروع مثل Last.fm في ذهني.

  1. أين (يجب أن يتم تنفيذه على جانب قاعدة البيانات أو جانب الواجهة الخلفية) أبدأ في إنشاء محرك توصية؟
  2. ما هو مستوى المعرفة قاعدة البيانات ستكون هناك حاجة؟
  3. هل هناك أي مصادر مفتوحة يمكن استخدامها للمساعدة أو أي مورد؟
  4. ما هي الخطوات الأولى التي يجب علي القيام بها؟

تم نشر مثال على محرك توصية مثال مفتوح المصدر (مرخص AGPLv3) بواسطة Filmaster.com مؤخرًا. إنه مكتوب بلغة C ++ ويستخدم أفضل الممارسات من الأوراق البيضاء التي تم إنتاجها كجزء من تحدي Netflix. يمكن العثور على مقالة حول هذا الموضوع على: http://polishlinux.org/gnu/open-source-film-recommendation-engine/ والرمز هنا: http://bitbucket.org/filmaster/filmaster-test/src/tip/count_recommendations.cpp


قمت ببناء واحدة لبوابة الفيديو بنفسي. كانت الفكرة الرئيسية التي كانت لدي حول جمع البيانات حول كل شيء:

  • من قام بتحميل فيديو؟
  • من علق على الفيديو؟
  • ما العلامات التي تم إنشاؤها؟
  • من زار الفيديو؟ (تتبع أيضا الزوار المجهولين)
  • من فضل الفيديو؟
  • من قيّم الفيديو؟
  • ما القنوات التي تم تخصيص الفيديو لها؟
  • يتم جمع تدفقات النص من العنوان والوصف والعلامات والقنوات والتعليقات بواسطة مفهرس النص الكامل الذي يضع وزنا على كل من مصادر البيانات.

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

  • مقاطع فيديو مماثلة عن طريق البحث عن النص الكامل
  • مقاطع الفيديو المحملة بواسطة المستخدم نفسه
  • مقاطع الفيديو الأخرى التي علق عليها المستخدمون من هذه التعليقات
  • مقاطع الفيديو الأخرى التي يفضلها المستخدمون من هذه المفضلة
  • مقاطع الفيديو الأخرى التي صنفها المقيمون من هذه التصنيفات تم تقييمها أيضًا على (مرجح)
  • مقاطع الفيديو الأخرى في نفس القنوات
  • مقاطع فيديو أخرى بنفس العلامات (مرجحة بـ "تعبير" العلامات)
  • مقاطع الفيديو الأخرى التي قام بتشغيلها الأشخاص الذين قاموا بتشغيل هذا الفيديو (XY آخر تشغيلات)
  • مقاطع فيديو مماثلة عن طريق التعليقات النص الكامل
  • مقاطع فيديو مماثلة حسب العنوان fulltext
  • مقاطع فيديو مماثلة حسب النص الكامل
  • مقاطع فيديو مشابهة بالعلامات النص الكامل

سيتم دمج كل هذه الأشياء في قائمة واحدة عن طريق جمع الأوزان حسب معرفات الفيديو ، ثم فرزها حسب الوزن. هذا يعمل بشكل جيد لنحو 1000 فيديو الآن. ولكن عليك القيام بمعالجة الخلفية أو التخزين المؤقت الشديد حتى تكون سريعة.

آمل أن أتمكن من تقليص ذلك إلى محرك توصية عام أو آلة حاسبة للتشابه قريبًا وإصداره كمكون إضافي لسكك الحديدية / activerecord. في الوقت الحالي ، ما زال جزءًا لا يتجزأ من مشروعي.

لإعطاء تلميح صغير ، في كود الياقوت ، يبدو كما يلي:

def related_by_tags
  tag_names.find(:all, :include => :videos).inject([]) { |result,t|
    result + t.video_ids.map { |v|
      [v, TAG_WEIGHT / (0.1 + Math.log(t.video_ids.length) / Math.log(2))]
    }
  }
end

سأكون مهتمًا بكيفية حل الآخرين لهذه الخوارزميات.


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

المدونة: http://glinden.blogspot.com/ الورق: http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344 (أخشى أنك بحاجة إلى تسجيل الدخول لقراءتها بالكامل ، نظرًا لأنك طالب في CS ، يجب أن يكون هذا ممكنًا).

تحرير يمكنك أيضًا إلقاء نظرة على Infer.Net ، وهي تتضمن مثالًا على بناء نظام التوصية لبيانات الأفلام.


يمكن تقسيم التوصيات المقدمة إلى قسمين رئيسيين:

  1. ميزة استخراج
  2. توصية

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

لا يتطلب تنفيذ التوصية الفعلية سوى متجهات الميزات المدروسة جيدًا. لاحظ أنه إذا لم تختر الميزات الصحيحة ، فسيفشل محرك التوصية. سيكون هذا مثل طلب منك أن تخبرني بنفسي على أساس عمري. بالطبع قد يوفر عمري القليل من المعلومات ، لكنني أعتقد أنه يمكنك تخيل أسئلة أفضل لطرحها. على أي حال ، بمجرد حصولك على متجهات الميزات لكل مستخدم وكل أغنية ، ستحتاج إلى تدريب محرك التوصية. أعتقد أن أفضل طريقة للقيام بذلك هي الحصول على مجموعة كاملة من المستخدمين لإجراء الاختبار الديموغرافي الخاص بك ومن ثم إخبارك بأغاني معينة يرغبون فيها. في هذه المرحلة ، لديك كل المعلومات التي تحتاجها. مهمتك هي رسم حدود القرار مع المعلومات التي لديك. النظر في مثال بسيط. كنت ترغب في التنبؤ بما إذا كان المستخدم يحب أو لا "AC in DC" لـ "Back in Black" على أساس العمر والجنس. تخيل رسم بياني يوضح 100 نقطة بيانات. المحور س هو العمر ، المحور ص هو الجنس (1 الذكور ، 2 الإناث). تشير العلامة السوداء إلى أن المستخدم يحب الأغنية بينما تعني العلامة الحمراء أنه لا يحب الأغنية. أعتقد أن هذا الرسم البياني قد يحتوي على الكثير من العلامات السوداء التي تتوافق مع المستخدمين الذين تتراوح أعمارهم بين 12 و 37 عامًا بينما ستكون بقية العلامات باللون الأحمر. لذلك ، إذا كان علينا تحديد حدود القرار يدويًا ، فسيكون مستطيلًا حول هذه المنطقة به غالبية العلامات السوداء. يُطلق على ذلك حدود القرار لأنه ، إذا جاء إليك شخص جديد تمامًا وأبلغك بعمر وجنسك ، فيجب عليك فقط رسمه على الرسم البياني والسؤال عما إذا كان يقع داخل هذا المربع أم لا.

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

أعلم أن الوقت متأخر بعض الشيء ، لكنني آمل أن يساعد هذا أي شخص يتعثر في هذا الموضوع.







collective-intelligence