إضافة الاقتراحات إلى تطبيقك باستخدام TensorFlow Lite وFirebase - درس تطبيقي حول الترميز في Android

1. نظرة عامة

مرحبًا بك في الدرس التطبيقي حول "الاقتراحات باستخدام TensorFlow Lite وFirebase". في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية استخدام TensorFlow Lite وFirebase لنشر نموذج اقتراحات في تطبيقك. يستند هذا الدرس التطبيقي حول الترميز إلى هذا المثال على TensorFlow Lite.

تسمح الاقتراحات للتطبيقات باستخدام تكنولوجيا تعلُّم الآلة لعرض المحتوى الأكثر ملاءمة لكل مستخدم بذكاء. وتأخذ هذه الأنظمة في الاعتبار سلوك المستخدم السابق لاقتراح محتوى التطبيق الذي قد يرغب المستخدم في التفاعل معه في المستقبل، وذلك باستخدام نموذج تم تدريبه على السلوك المجمّع لعدد كبير من المستخدمين الآخرين.

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

أهداف الدورة التعليمية

  • دمج "إحصاءات Firebase" في تطبيق Android لجمع بيانات سلوك المستخدِمين
  • تصدير هذه البيانات إلى Google Big Query
  • المعالجة المُسبقة للبيانات وتدريب نموذج توصيات TF Lite
  • نشر نموذج TF Lite على Firebase ML والوصول إليه من تطبيقك
  • تنفيذ الاستدلال على الجهاز باستخدام النموذج لاقتراح توصيات للمستخدمين

المتطلبات

  • أحدث إصدار من استوديو Android
  • نموذج التعليمات البرمجية
  • جهاز اختبار يعمل بالإصدار 7 من نظام التشغيل Android أو الإصدارات الأحدث و"خدمات Google Play" بالإصدار 9.8 أو الإصدارات الأحدث، أو محاكي يعمل بالإصدار 9.8 من "خدمات Google Play" أو الإصدارات الأحدث
  • إذا كنت تستخدم جهازًا، ستحتاج إلى كابل توصيل.

كيف ستستخدم هذا البرنامج التعليمي؟

قراءة المحتوى فقط قراءة المحتوى وإكمال التمارين

كيف تقيّم تجربتك في إنشاء تطبيقات Android؟

مبتدئ متوسط متقدّم

2. الحصول على الرمز النموذجي

استنسِخ مستودع GitHub من سطر الأوامر.

$ git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-android.git

3- استيراد التطبيق النموذجي

من "استوديو Android"، اختَر الدليل codelab-recommendations-android ( android_studio_folder.png) من عملية تنزيل نموذج الرمز البرمجي (ملف > فتح > .../codelab-recommendations-android/start).

يجب أن يكون مشروع البدء مفتوحًا الآن في "استوديو Android".

4. إنشاء مشروع في "وحدة تحكّم Firebase"

إنشاء مشروع جديد

  1. انتقِل إلى وحدة تحكّم Firebase.
  2. انقر على إضافة مشروع (أو إنشاء مشروع إذا كان هذا هو المشروع الأول).
  3. اختَر اسم مشروع أو أدخِله، ثم انقر على متابعة.
  4. تأكَّد من تفعيل الخيار "تفعيل إحصاءات Google لهذا المشروع".
  5. اتّبِع خطوات الإعداد المتبقية في وحدة تحكّم Firebase، ثم انقر على "إنشاء مشروع" (أو "إضافة Firebase"، إذا كنت تستخدم مشروعًا حاليًا على Google).

5- إضافة Firebase

  1. من شاشة النظرة العامة لمشروعك الجديد، انقر على رمز Android لبدء سير عمل الإعداد.
  2. أدخِل اسم حزمة التطبيق الخاص بدرس البرمجة: com.google.firebase.codelabs.recommendations
  3. انقر على تسجيل التطبيق.

إضافة ملف google-services.json إلى تطبيقك

بعد إضافة اسم الحزمة واختيار "تسجيل"، انقر على تنزيل ملف google-services.json للحصول على ملف إعداد Android في Firebase، ثم انسخ ملف google-services.json إلى الدليل app في مشروعك. بعد تنزيل الملف، يمكنك تخطّي الخطوات التالية المعروضة في وحدة التحكّم (تم تنفيذها مسبقًا في مشروع build-android-start).

إضافة المكوّن الإضافي google-services إلى تطبيقك

يستخدم المكوّن الإضافي google-services ملف google-services.json لإعداد تطبيقك لاستخدام Firebase. يجب أن تكون الأسطر التالية قد تمت إضافتها إلى ملفات build.gradle.kts في المشروع (تحقَّق من ذلك):

app/build.grade.kts

plugins {
    id("com.google.gms.google-services")
}

build.grade.kts

plugins {
    id("com.google.gms.google-services") version "4.3.15" apply false
}

مزامنة مشروعك مع ملفات Gradle

للتأكّد من توفّر جميع التبعيات لتطبيقك، عليك مزامنة مشروعك مع ملفات Gradle في هذه المرحلة. انقر على ملف (File) > مزامنة المشروع مع ملفات Gradle (Sync Project with Gradle Files) من شريط أدوات "استوديو Android".

6. تشغيل التطبيق النموذجي

بعد استيراد المشروع إلى "استوديو Android" وإعداد المكوّن الإضافي google-services باستخدام ملف JSON، يمكنك تشغيل التطبيق للمرة الأولى. وصِّل جهاز Android وانقر على تشغيل ( execute.png) في شريط أدوات "استوديو Android".

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

7. إضافة "إحصاءات Firebase" إلى التطبيق

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

إضافة قائمة مواد Firebase وتبعيات "إحصاءات Google"

يجب توفُّر التبعيات التالية لإضافة "إحصاءات Firebase" إلى تطبيقك، ويجب أن تكون مضمَّنة في ملف app/build.gradle.kts (يجب التأكّد من ذلك).

app/build.grade.kts

implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")

إعداد "إحصاءات Firebase" في التطبيق

يحتوي LikedMoviesViewModel على دوال لتخزين الأفلام التي تعجب المستخدم. في كل مرة يعجب فيها المستخدم بفيلم جديد، نريد أيضًا إرسال حدث سجلّ إحصائي لتسجيل هذا الإعجاب.

أضِف الدالة onMovieLiked مع الرمز البرمجي أدناه لتسجيل حدث إحصائي عندما ينقر المستخدم على زر الإعجاب بفيلم.

LikedMoviesViewModel.kt

import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase


class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {

    ...

    fun onMovieLiked(movie: Movie) {
        movies.setLike(movie, true)
        logAnalyticsEvent(movie.id.toString())
    }
       
}

أضِف الحقل والدالة التاليَين لتسجيل حدث في "إحصاءات Google" عند إضافة فيلم إلى قائمة "الأفلام التي أعجبتني" الخاصة بالمستخدم.

LikedMoviesViewModel.kt

import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase


class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {
    ...
    private val firebaseAnalytics = Firebase.analytics

    ...

    /**
     * Logs an event in Firebase Analytics that is used in aggregate to train the recommendations
     * model.
     */
    private fun logAnalyticsEvent(id: String) {
        firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM) {
            param(FirebaseAnalytics.Param.ITEM_ID, id)
        }
    }

8. اختبار عملية دمج "إحصاءات Google"

في هذه الخطوة، سننشئ أحداث "إحصاءات Google" في التطبيق ونتأكّد من أنّه يتم إرسالها إلى "وحدة تحكّم Firebase".

تفعيل ميزة تسجيل معلومات تصحيح الأخطاء في "إحصاءات Google"

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

المحطة

adb shell setprop debug.firebase.analytics.app com.google.firebase.codelabs.recommendations

التأكّد من إنشاء أحداث "إحصاءات Google"

  1. في "استوديو Android"، افتح نافذة Logcat لفحص التسجيل من تطبيقك.
  2. اضبط فلتر Logcat على السلسلة "تسجيل الحدث".
  3. تأكَّد من إرسال أحداث "select_item" في "إحصاءات Google" في كل مرة تُعجب فيها بفيلم في التطبيق.

في هذه المرحلة، تكون قد أتممت عملية دمج "إحصاءات Firebase" في تطبيقك بنجاح. وعندما يستخدم المستخدمون تطبيقك ويعجبون بالأفلام، سيتم تسجيل إعجابهم بشكل مجمّع. سنستخدم هذه البيانات المجمّعة في بقية هذا الدرس التدريبي لتدريب نموذج الاقتراحات. في ما يلي خطوة اختيارية للاطّلاع على أحداث "إحصاءات Google" نفسها التي رأيتها في Logcat وهي يتم بثّها أيضًا إلى وحدة تحكّم Firebase. يمكنك الانتقال إلى الصفحة التالية.

اختياري: تأكيد أحداث "إحصاءات Google" في وحدة تحكّم Firebase

  1. انتقِل إلى وحدة تحكّم Firebase.
  2. اختَر DebugView ضِمن "إحصاءات Google".
  3. في "استوديو Android"، انقر على تشغيل لتشغيل التطبيق وإضافة بعض الأفلام إلى قائمة "أعجبني".
  4. في DebugView بوحدة تحكّم Firebase، تأكَّد من تسجيل هذه الأحداث أثناء إضافة الأفلام في التطبيق.

9. تصدير بيانات "إحصاءات Google" إلى BigQuery

‫BigQuery هو أحد منتجات Google Cloud التي تتيح لك فحص كميات كبيرة من البيانات ومعالجتها. في هذه الخطوة، عليك ربط مشروعك على "وحدة تحكّم Firebase" بأداة BigQuery حتى يتم تلقائيًا تصدير بيانات "إحصاءات Google" التي ينشئها تطبيقك إلى BigQuery.

تفعيل ميزة BigQuery Export

  1. انتقِل إلى وحدة تحكّم Firebase.
  2. انقر على رمز الترس "الإعدادات" بجانب نظرة عامة على المشروع، ثم انقر على إعدادات المشروع
  3. انقر على علامة التبويب عمليات الدمج.
  4. انقر على ربط (أو إدارة) داخل مربّع BigQuery.
  5. انقر على التالي في خطوة لمحة عن ربط Firebase بخدمة BigQuery.
  6. ضمن قسم ضبط عملية التكامل، انقر على مفتاح التبديل لتفعيل إرسال بيانات "إحصاءات Google"، ثمّ اختَر الربط بخدمة BigQuery.

لقد فعّلت الآن مشروع وحدة تحكّم Firebase لإرسال بيانات أحداث "إحصاءات Firebase" تلقائيًا إلى BigQuery. يحدث ذلك تلقائيًا بدون أي تفاعل إضافي، ولكن قد لا يتم التصدير الأول الذي ينشئ مجموعة بيانات الإحصاءات في BigQuery لمدة 24 ساعة. بعد إنشاء مجموعة البيانات، يواصل Firebase تصدير أحداث "إحصاءات Google" الجديدة إلى BigQuery في جدول الفترة خلال اليوم، ويجمّع الأحداث من الأيام السابقة في جدول الأحداث.

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

10. استخدام BigQuery للحصول على بيانات تدريب النماذج

بعد ربط "وحدة تحكّم Firebase" بخدمة BigQuery Export، ستظهر بيانات أحداث "إحصاءات التطبيق" تلقائيًا في وحدة تحكّم BigQuery بعد مرور بعض الوقت. للحصول على بعض البيانات الأولية لأغراض هذا البرنامج التعليمي، سنستورد في هذه الخطوة نموذج مجموعة بيانات حالية إلى وحدة تحكّم BigQuery لاستخدامها في تدريب نموذج الاقتراحات.

استيراد عيّنة مجموعة البيانات إلى BigQuery

  1. انتقِل إلى لوحة بيانات BigQuery في وحدة تحكّم Google Cloud.
  2. اختَر اسم مشروعك في القائمة.
  3. اختَر اسم مشروعك في أسفل شريط التنقّل الأيمن في BigQuery للاطّلاع على التفاصيل.
  4. انقر على إنشاء مجموعة بيانات لفتح لوحة إنشاء مجموعة البيانات.
  5. أدخِل firebase_recommendations_dataset في حقل معرّف مجموعة البيانات، ثمّ انقر على إنشاء مجموعة بيانات.
  6. ستظهر مجموعة البيانات الجديدة في القائمة اليمنى ضمن اسم المشروع. انقر عليه.
  7. انقر على إنشاء جدول لفتح لوحة إنشاء الجدول.
  8. بالنسبة إلى إنشاء جدول من، اختَر "Google Cloud Storage".
  9. في حقل اختيار ملف من حزمة GCS، أدخِل gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt‎.
  10. اختَر JSONL في القائمة المنسدلة تنسيق الملف.
  11. أدخِل "recommendations_table" في حقل اسم الجدول.
  12. ضَع علامة في المربّع ضمن المخطط > الاكتشاف التلقائي > المخطط ومعلمات الإدخال
  13. انقر على إنشاء جدول.

استكشاف مجموعة البيانات النموذجية

في هذه المرحلة، يمكنك استكشاف المخطط ومعاينة مجموعة البيانات هذه، إذا أردت ذلك.

  1. اختَر firebase-recommendations-dataset في القائمة اليمنى لتوسيع الجداول التي يحتوي عليها.
  2. اختَر الجدول recommendations-table لعرض مخطط الجدول.
  3. انقر على معاينة للاطّلاع على بيانات أحداث "إحصاءات Google" الفعلية التي يتضمّنها هذا الجدول.

إنشاء بيانات اعتماد حساب الخدمة

سننشئ الآن بيانات اعتماد حساب خدمة في مشروع Google Cloud Console الذي يمكننا استخدامه في بيئة Colab في الخطوة التالية للوصول إلى بيانات BigQuery وتحميلها.

  1. تأكَّد من تفعيل الفوترة لمشروعك على Google Cloud.
  2. فعِّل واجهتَي BigQuery API وBigQuery Storage API. < انقر هنا>
  3. انتقِل إلى صفحة إنشاء مفتاح حساب الخدمة.
  4. من قائمة حساب الخدمة، اختَر حساب خدمة جديد.
  5. في حقل اسم حساب الخدمة، أدخِل اسمًا.
  6. من قائمة الدور، اختَر المشروع > المالك.
  7. انقر على إنشاء. يتم تنزيل ملف JSON يحتوي على مفتاحك إلى جهاز الكمبيوتر.

في الخطوة التالية، سنستخدم Google Colab لإجراء المعالجة المسبقة لهذه البيانات وتدريب نموذج الاقتراحات.

11. المعالجة المُسبقة للبيانات وتدريب نموذج الاقتراحات

في هذه الخطوة، سنستخدم ورقة ملاحظات Colab لتنفيذ الخطوات التالية:

  1. استيراد بيانات BigQuery إلى دفتر ملاحظات Colab
  2. المعالجة المُسبقة للبيانات لإعدادها لتدريب النموذج
  3. تدريب نموذج الاقتراحات على بيانات "إحصاءات Google"
  4. تصدير النموذج كنموذج TF Lite
  5. نشر النموذج في "وحدة تحكّم Firebase" لنتمكّن من استخدامه في تطبيقنا

قبل إطلاق دفتر تدريب Colab، سنفعّل أولاً واجهة برمجة التطبيقات Firebase Model Management API حتى يتمكّن Colab من نشر النموذج المدرَّب في وحدة تحكّم Firebase.

تفعيل واجهة برمجة التطبيقات Firebase Model Management API

إنشاء حزمة لتخزين نماذج تعلُّم الآلة

في "وحدة تحكّم Firebase"، انتقِل إلى "مساحة التخزين" وانقر على "البدء". fbbea78f0eb3dc9f.png

اتّبِع الحوار لإعداد مجموعة الموارد.

19517c0d6d2aa14d.png

تفعيل واجهة برمجة التطبيقات Firebase ML API

انتقِل إلى صفحة Firebase ML API على Google Cloud Console وانقر على "تفعيل".

استخدام ورقة ملاحظات Colab لتدريب النموذج وتفعيله

افتح دفتر ملاحظات Colab باستخدام الرابط التالي وأكمِل الخطوات الواردة فيه. بعد الانتهاء من الخطوات الواردة في دفتر ملاحظات Colab، سيكون لديك ملف نموذج TF Lite تم نشره في وحدة تحكّم Firebase يمكننا مزامنته مع تطبيقنا.

الفتح في Colab

12. تنزيل النموذج في تطبيقك

في هذه الخطوة، سنعدّل تطبيقنا لتنزيل النموذج الذي درّبناه للتو من Firebase Machine Learning.

إضافة تبعية Firebase ML

يجب توفُّر التبعية التالية لاستخدام نماذج Firebase Machine Learning في تطبيقك، ويجب أن تكون قد أُضيفت بالفعل (يُرجى التأكّد من ذلك).

app/build.grade.kts

implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")

تنزيل النموذج باستخدام Firebase Model Manager API

انسخ الرمز البرمجي أدناه إلى RecommendationClient.kt لإعداد الشروط التي يتم بموجبها تنزيل النموذج وإنشاء مهمة تنزيل لمزامنة النموذج البعيد مع تطبيقنا.

RecommendationClient.kt

    private fun downloadModel(modelName: String) {
        val conditions = CustomModelDownloadConditions.Builder()
            .requireWifi()
            .build()
        FirebaseModelDownloader.getInstance()
            .getModel(modelName, DownloadType.LOCAL_MODEL, conditions)
            .addOnCompleteListener {
                if (!it.isSuccessful) {
                    showToast(context, "Failed to get model file.")
                } else {
                    showToast(context, "Downloaded remote model: $modelName")
                    GlobalScope.launch { initializeInterpreter(it.result) }
                }
            }
            .addOnFailureListener {
                showToast(context, "Model download failed for recommendations, please check your connection.")
            }
    }

13. دمج نموذج الاقتراحات في Tensorflow Lite في تطبيقك

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

تحميل القاموس والتصنيفات

تتضمّن قائمة التصنيفات المستخدَمة لإنشاء الاقتراحات المحتملة من خلال نموذج الاقتراحات الملف sorted_movie_vocab.json في مجلد res/assets. انسخ الرمز التالي لتحميل هذه الكلمات المرشّحة.

RecommendationClient.kt

    /** Load recommendation candidate list.  */
    private suspend fun loadCandidateList() {
        return withContext(Dispatchers.IO) {
            val collection = MovieRepository.getInstance(context).getContent()
            for (item in collection) {
                candidates[item.id] = item
            }
            Log.v(TAG, "Candidate list loaded.")
        }
    }

تنفيذ المعالجة المُسبقة

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

RecommendationClient.kt

    /** Given a list of selected items, preprocess to get tflite input.  */
    @Synchronized
    private suspend fun preprocess(selectedMovies: List<Movie>): IntArray {
        return withContext(Dispatchers.Default) {
            val inputContext = IntArray(config.inputLength)
            for (i in 0 until config.inputLength) {
                if (i < selectedMovies.size) {
                    val (id) = selectedMovies[i]
                    inputContext[i] = id
                } else {
                    // Padding input.
                    inputContext[i] = config.pad
                }
            }
            inputContext
        }
    }


تشغيل أداة الترجمة الفورية لإنشاء اقتراحات

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

RecommendationClient.kt

    /** Given a list of selected items, and returns the recommendation results.  */
    @Synchronized
    suspend fun recommend(selectedMovies: List<Movie>): List<Result> {
        return withContext(Dispatchers.Default) {
            val inputs = arrayOf<Any>(preprocess(selectedMovies))

            // Run inference.
            val outputIds = IntArray(config.outputLength)
            val confidences = FloatArray(config.outputLength)
            val outputs: MutableMap<Int, Any> = HashMap()
            outputs[config.outputIdsIndex] = outputIds
            outputs[config.outputScoresIndex] = confidences
            tflite?.let {
                it.runForMultipleInputsOutputs(inputs, outputs)
                postprocess(outputIds, confidences, selectedMovies)
            } ?: run {
                Log.e(TAG, "No tflite interpreter loaded")
                emptyList()
            }
        }
    }



تنفيذ المعالجة اللاحقة

أخيرًا، في هذه الخطوة، نعالج النتائج التي يعرضها النموذج بعد معالجتها، ونختار النتائج التي تتضمّن أعلى مستوى من الثقة ونزيل القيم المتضمّنة (الأفلام التي أعجب بها المستخدم من قبل). انسخ الرمز التالي في تطبيقك.

RecommendationClient.kt

    /** Postprocess to gets results from tflite inference.  */
    @Synchronized
    private suspend fun postprocess(
        outputIds: IntArray, confidences: FloatArray, selectedMovies: List<Movie>
    ): List<Result> {
        return withContext(Dispatchers.Default) {
            val results = ArrayList<Result>()

            // Add recommendation results. Filter null or contained items.
            for (i in outputIds.indices) {
                if (results.size >= config.topK) {
                    Log.v(TAG, String.format("Selected top K: %d. Ignore the rest.", config.topK))
                    break
                }
                val id = outputIds[i]
                val item = candidates[id]
                if (item == null) {
                    Log.v(TAG, String.format("Inference output[%d]. Id: %s is null", i, id))
                    continue
                }
                if (selectedMovies.contains(item)) {
                    Log.v(TAG, String.format("Inference output[%d]. Id: %s is contained", i, id))
                    continue
                }
                val result = Result(
                    id, item,
                    confidences[i]
                )
                results.add(result)
                Log.v(TAG, String.format("Inference output[%d]. Result: %s", i, result))
            }
            results
        }
    }


اختبِر تطبيقك

أعِد تشغيل تطبيقك. عند اختيار بعض الأفلام، من المفترض أن يتم تنزيل النموذج الجديد تلقائيًا والبدء في إنشاء اقتراحات.

14. تهانينا!

لقد أنشأت ميزة اقتراحات في تطبيقك باستخدام TensorFlow Lite وFirebase. يُرجى العِلم أنّه يمكن تعميم التقنيات وعملية المعالجة الموضّحة في هذا الدرس التطبيقي حول الترميز واستخدامها لعرض أنواع أخرى من الاقتراحات أيضًا.

المواضيع التي تناولناها

  • Firebase ML
  • "إحصاءات Firebase"
  • تصدير أحداث الإحصاءات إلى BigQuery
  • المعالجة المُسبَقة لأحداث "إحصاءات Google"
  • نموذج TensorFlow لاقتراحات التدريبات
  • تصدير النموذج ونشره في "وحدة تحكّم Firebase"
  • عرض اقتراحات الأفلام في تطبيق

الخطوات التالية

  • تنفيذ اقتراحات Firebase ML في تطبيقك

مزيد من المعلومات

هل لديك أي أسئلة؟

الإبلاغ عن المشاكل