Android ile metin sınıflandırması

Bu eğitimde, doğal dil metnini sınıflandırmak için TensorFlow Lite kullanarak bir Android uygulamasının nasıl oluşturulacağı gösterilmektedir. Bu uygulama fiziksel bir Android cihazı için tasarlanmıştır ancak aynı zamanda bir cihaz emülatöründe de çalışabilir.

Örnek uygulama, metin sınıflandırma makine öğrenimi modellerinin yürütülmesini sağlamak amacıyla doğal dil için Görev kitaplığını (NL) kullanarak metni pozitif veya negatif olarak sınıflandırmak için TensorFlow Lite'ı kullanır.

Mevcut bir projeyi güncelliyorsanız örnek uygulamayı referans veya şablon olarak kullanabilirsiniz. Mevcut bir uygulamaya metin sınıflandırmasının nasıl ekleneceğine ilişkin talimatlar için Uygulamanızı güncelleme ve değiştirme konusuna bakın.

Metin sınıflandırmasına genel bakış

Metin sınıflandırma, açık uçlu metne önceden tanımlanmış bir dizi kategoriyi atayan makine öğrenimi görevidir. Bir metin sınıflandırma modeli, kelimelerin veya cümlelerin manuel olarak sınıflandırıldığı bir doğal dil metni topluluğu üzerinde eğitilir.

Eğitilen model, metni girdi olarak alır ve sınıflandırmak üzere eğitildiği bilinen sınıflar kümesine göre metni kategorilere ayırmaya çalışır. Örneğin, bu örnekteki modeller bir metin parçasını kabul eder ve metnin duygusunun olumlu mu yoksa olumsuz mu olduğunu belirler. Metin sınıflandırma modeli, her metin parçacığı için metnin olumlu veya olumsuz olarak doğru şekilde sınıflandırılmasının güvenilirliğini gösteren bir puan üretir.

Bu eğitimdeki modellerin nasıl oluşturulduğu hakkında daha fazla bilgi için TensorFlow Lite Model Oluşturucu eğitiminde Metin sınıflandırmasına bakın.

Modeller ve veri kümesi

Bu eğitimde SST-2 (Stanford Sentiment Treebank) veri kümesi kullanılarak eğitilmiş modeller kullanılmaktadır. SST-2, eğitim için 67.349 film incelemesi ve test için 872 film incelemesi içerir; her inceleme olumlu veya olumsuz olarak kategorize edilir. Bu uygulamada kullanılan modeller TensorFlow Lite Model Maker aracı kullanılarak eğitilmiştir.

Örnek uygulama aşağıdaki önceden eğitilmiş modelleri kullanır:

  • Ortalama Kelime Vektörü ( NLClassifier ) ​​- Görev Kitaplığı'nın NLClassifier giriş metnini farklı kategorilerde sınıflandırır ve çoğu metin sınıflandırma modelini işleyebilir.

  • MobileBERT ( BertNLClassifier ) ​​- Görev Kitaplığının BertNLClassifier NLClassifier'a benzer ancak grafik dışı Wordpiece ve Cümle Parçası belirteçleri gerektiren durumlar için uyarlanmıştır.

Örnek uygulamayı kurun ve çalıştırın

Metin sınıflandırma uygulamasını ayarlamak için örnek uygulamayı GitHub'dan indirin ve Android Studio'yu kullanarak çalıştırın.

Sistem gereksinimleri

  • Android Studio sürüm 2021.1.1 (Bumblebee) veya üzeri.
  • Android SDK sürüm 31 veya üzeri
  • Geliştirici modunun etkin olduğu minimum işletim sistemi sürümü SDK 21'e (Android 7.0 - Nougat) veya bir Android Emulator'a sahip Android cihazı.

Örnek kodu alın

Örnek kodun yerel bir kopyasını oluşturun. Android Studio'da proje oluşturup örnek uygulamayı çalıştırmak için bu kodu kullanacaksınız.

Örnek kodu klonlamak ve ayarlamak için:

  1. Git deposu
    git clone https://github.com/tensorflow/examples.git
    
    klonlayın
  2. İsteğe bağlı olarak git örneğinizi seyrek ödeme kullanacak şekilde yapılandırın, böylece yalnızca metin sınıflandırması örnek uygulamasına ait dosyalara sahip olursunuz:
    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/text_classification/android
    

Projeyi içe aktarın ve çalıştırın

İndirilen örnek koddan bir proje oluşturun, projeyi derleyin ve ardından çalıştırın.

Örnek kod projesini içe aktarmak ve oluşturmak için:

  1. Android Studio'yu başlatın.
  2. Android Studio'dan Dosya > Yeni > Projeyi İçe Aktar'ı seçin.
  3. build.gradle dosyasını içeren örnek kod dizinine gidin ( .../examples/lite/examples/text_classification/android/build.gradle ) ve bu dizini seçin.
  4. Android Studio Gradle Sync isterse Tamam'ı seçin.
  5. Android cihazınızın bilgisayarınıza bağlı olduğundan ve geliştirici modunun etkinleştirildiğinden emin olun. Yeşil Run okunu tıklayın.

Doğru dizini seçerseniz Android Studio yeni bir proje oluşturur ve onu derler. Bu işlem, bilgisayarınızın hızına ve Android Studio'yu başka projeler için kullanıp kullanmadığınıza bağlı olarak birkaç dakika sürebilir. Derleme tamamlandığında Android Studio, Derleme Çıktısı durum panelinde OLUŞTURMA BUILD SUCCESSFUL mesajını görüntüler.

Projeyi çalıştırmak için:

  1. Android Studio'dan Run > Run…' ı seçerek projeyi çalıştırın.
  2. Uygulamayı test etmek için bağlı bir Android cihazını (veya emülatörünü) seçin.

Uygulamayı kullanma

Android'de metin sınıflandırma örnek uygulaması

Projeyi Android Studio'da çalıştırdıktan sonra uygulama bağlı cihazda veya cihaz emülatöründe otomatik olarak açılacaktır.

Metin sınıflandırıcıyı kullanmak için:

  1. Metin kutusuna bir metin parçası girin.
  2. Temsilci açılır menüsünden CPU veya NNAPI seçin.
  3. AverageWordVec veya MobileBERT seçerek bir model belirtin.
  4. Sınıflandır'ı seçin.

Uygulama bir pozitif puan ve bir negatif puan verir. Bu iki puanın toplamı 1'e eşit olacak ve giriş metninin olumlu ya da olumsuz olma olasılığını ölçecektir. Daha yüksek bir sayı, daha yüksek bir güven düzeyini ifade eder.

Artık işleyen bir metin sınıflandırma uygulamanız var. Örnek uygulamanın nasıl çalıştığını ve metin sınıflandırma özelliklerinin üretim uygulamalarınıza nasıl uygulanacağını daha iyi anlamak için aşağıdaki bölümleri kullanın:

Örnek uygulama nasıl çalışır?

Uygulama, metin sınıflandırma modellerini uygulamak için doğal dil (NL) paketi için Görev kitaplığı'nı kullanır. Ortalama Kelime Vektörü ve MobileBERT olmak üzere iki model, TensorFlow Lite Model Maker kullanılarak eğitildi. Uygulama, NNAPI temsilcisini kullanarak donanım hızlandırma seçeneğiyle varsayılan olarak CPU üzerinde çalışır.

Aşağıdaki dosyalar ve dizinler bu metin sınıflandırma uygulaması için önemli kodu içerir:

Uygulamanızı değiştirin

Aşağıdaki bölümlerde, örnek uygulamada gösterilen modeli çalıştıracak şekilde kendi Android uygulamanızı değiştirmeye yönelik temel adımlar açıklanmaktadır. Bu talimatlar örnek uygulamayı referans noktası olarak kullanır. Kendi uygulamanız için gereken belirli değişiklikler örnek uygulamadan farklı olabilir.

Bir Android projesi açın veya oluşturun

Bu talimatların geri kalanıyla birlikte takip etmek için Android Studio'da bir Android geliştirme projesine ihtiyacınız var. Mevcut bir projeyi açmak veya yeni bir proje oluşturmak için aşağıdaki talimatları izleyin.

Mevcut bir Android geliştirme projesini açmak için:

  • Android Studio'da Dosya > Aç'ı seçin ve mevcut bir projeyi seçin.

Temel bir Android geliştirme projesi oluşturmak için:

Android Studio'yu kullanma hakkında daha fazla bilgi için Android Studio belgelerine bakın.

Proje bağımlılıkları ekleyin

Kendi uygulamanızda, TensorFlow Lite makine öğrenimi modellerini çalıştırmak için belirli proje bağımlılıkları eklemeniz ve dizeler gibi verileri, kullandığınız model tarafından işlenebilecek bir tensör veri formatına dönüştüren yardımcı program işlevlerine erişmeniz gerekir.

Aşağıdaki talimatlar, gerekli proje ve modül bağımlılıklarını kendi Android uygulama projenize nasıl ekleyeceğinizi açıklamaktadır.

Modül bağımlılıkları eklemek için:

  1. TensorFlow Lite kullanan modülde, modülün build.gradle dosyasını aşağıdaki bağımlılıkları içerecek şekilde güncelleyin.

    Örnek uygulamada bağımlılıklar app/build.gradle konumunda bulunur:

    dependencies {
      ...
      implementation 'org.tensorflow:tensorflow-lite-task-text:0.4.0'
    }
    

    Projenin Metin görev kitaplığını ( tensorflow-lite-task-text ) içermesi gerekir.

    Bu uygulamayı bir grafik işlem biriminde (GPU) çalışacak şekilde değiştirmek istiyorsanız GPU kitaplığı ( tensorflow-lite-gpu-delegate-plugin ) uygulamayı GPU'da çalıştırmak için altyapıyı sağlar ve Delege ( tensorflow-lite-gpu ) uyumluluk listesini sağlar. Bu uygulamayı GPU'da çalıştırmak bu eğitimin kapsamı dışındadır.

  2. Android Studio'da, şunu seçerek proje bağımlılıklarını senkronize edin: File > Sync Project with Gradle Files .

ML modellerini başlatın

Android uygulamanızda, tahminleri modelle çalıştırmadan önce TensorFlow Lite makine öğrenimi modelini parametrelerle başlatmanız gerekir.

TensorFlow Lite modeli *.tflite dosyası olarak saklanır. Model dosyası tahmin mantığını içerir ve genellikle tahmin sınıfı adları gibi tahmin sonuçlarının nasıl yorumlanacağına ilişkin meta verileri içerir. Tipik olarak model dosyaları, kod örneğinde olduğu gibi geliştirme projenizin src/main/assets dizininde saklanır:

  • <project>/src/main/assets/mobilebert.tflite
  • <project>/src/main/assets/wordvec.tflite

Kolaylık ve kod okunabilirliği için örnek, modelin ayarlarını tanımlayan bir tamamlayıcı nesneyi bildirir.

Modeli uygulamanızda başlatmak için:

  1. Modelin ayarlarını tanımlamak için tamamlayıcı bir nesne oluşturun. Örnek uygulamada bu nesne TextClassificationHelper.kt konumunda bulunur:

    companion object {
      const val DELEGATE_CPU = 0
      const val DELEGATE_NNAPI = 1
      const val WORD_VEC = "wordvec.tflite"
      const val MOBILEBERT = "mobilebert.tflite"
    }
    
  2. Bir sınıflandırıcı nesnesi oluşturarak modelin ayarlarını oluşturun ve BertNLClassifier veya NLClassifier kullanarak bir TensorFlow Lite nesnesi oluşturun.

    Örnek uygulamada bu, TextClassificationHelper.kt içindeki initClassifier işlevinde bulunur:

    fun initClassifier() {
      ...
      if( currentModel == MOBILEBERT ) {
        ...
        bertClassifier = BertNLClassifier.createFromFileAndOptions(
          context,
          MOBILEBERT,
          options)
      } else if (currentModel == WORD_VEC) {
          ...
          nlClassifier = NLClassifier.createFromFileAndOptions(
            context,
            WORD_VEC,
            options)
      }
    }
    

Donanım hızlandırmayı etkinleştirin (isteğe bağlı)

Uygulamanızda bir TensorFlow Lite modelini başlatırken, modelin tahmin hesaplamalarını hızlandırmak için donanım hızlandırma özelliklerini kullanmayı düşünmelisiniz. TensorFlow Lite delegeleri , grafik işleme birimi (GPU'lar) veya tensör işleme birimleri (TPU'lar) gibi bir mobil cihazda özel işleme donanımını kullanarak makine öğrenimi modellerinin yürütülmesini hızlandıran yazılım modülleridir.

Uygulamanızda donanım hızlandırmayı etkinleştirmek için:

  1. Uygulamanın kullanacağı temsilciyi tanımlamak için bir değişken oluşturun. Örnek uygulamada bu değişken TextClassificationHelper.kt dosyasının başlarında bulunur:

    var currentDelegate: Int = 0
    
  2. Bir temsilci seçici oluşturun. Örnek uygulamada, temsilci seçici TextClassificationHelper.kt içindeki initClassifier işlevinde bulunur:

    val baseOptionsBuilder = BaseOptions.builder()
    when (currentDelegate) {
       DELEGATE_CPU -> {
           // Default
       }
       DELEGATE_NNAPI -> {
           baseOptionsBuilder.useNnapi()
       }
    }
    

TensorFlow Lite modellerini çalıştırmak için delegelerin kullanılması önerilir ancak zorunlu değildir. Temsilcileri TensorFlow Lite ile kullanma hakkında daha fazla bilgi için bkz. TensorFlow Lite Temsilcileri .

Model için veri hazırlama

Android uygulamanızda kodunuz, ham metin gibi mevcut verileri modeliniz tarafından işlenebilecek bir Tensor veri formatına dönüştürerek yorumlanmak üzere modele veri sağlar. Bir modele ilettiğiniz Tensördeki verilerin, modeli eğitmek için kullanılan veri formatıyla eşleşen belirli boyutlara veya şekle sahip olması gerekir.

Bu metin sınıflandırma uygulaması girdi olarak bir dizeyi kabul eder ve modeller yalnızca İngilizce dil külliyatı üzerinde eğitilir. Çıkarım sırasında özel karakterler ve İngilizce olmayan kelimeler dikkate alınmaz.

Modele metin verileri sağlamak için:

  1. ML modellerini başlatma ve Donanım hızlandırmayı etkinleştirme bölümlerinde açıklandığı gibi, initClassifier işlevinin temsilci ve modeller için kodu içerdiğinden emin olun.

  2. initClassifier işlevini çağırmak için init bloğunu kullanın. Örnek uygulamada init , TextClassificationHelper.kt konumunda bulunur:

    init {
      initClassifier()
    }
    

Tahminleri çalıştır

Android uygulamanızda, bir BertNLClassifier veya NLClassifier nesnesini başlattığınızda, modelin "pozitif" veya "negatif" olarak sınıflandırılması için giriş metnini beslemeye başlayabilirsiniz.

Tahminleri çalıştırmak için:

  1. Seçilen sınıflandırıcıyı ( currentModel ) kullanan ve giriş metnini ( inferenceTime ) sınıflandırmak için geçen süreyi ölçen bir classify işlevi oluşturun. Örnek uygulamada, classify işlevi TextClassificationHelper.kt dosyasında bulunur:

    fun classify(text: String) {
      executor = ScheduledThreadPoolExecutor(1)
    
      executor.execute {
        val results: List<Category>
        // inferenceTime is the amount of time, in milliseconds, that it takes to
        // classify the input text.
        var inferenceTime = SystemClock.uptimeMillis()
    
        // Use the appropriate classifier based on the selected model
        if(currentModel == MOBILEBERT) {
          results = bertClassifier.classify(text)
        } else {
          results = nlClassifier.classify(text)
        }
    
        inferenceTime = SystemClock.uptimeMillis() - inferenceTime
    
        listener.onResult(results, inferenceTime)
      }
    }
    
  2. Sonuçları classify dinleyici nesnesine iletin.

    fun classify(text: String) {
      ...
      listener.onResult(results, inferenceTime)
    }
    

Model çıktısını işle

Bir satır metin girdikten sonra model, 'pozitif' ve 'negatif' kategoriler için 0 ile 1 arasında Kayan Nokta olarak ifade edilen bir tahmin puanı üretir.

Modelden tahmin sonuçlarını almak için:

  1. Dinleyici nesnesinin çıktıyı işlemesi için bir onResult işlevi oluşturun. Örnek uygulamada dinleyici nesnesi MainActivity.kt'de bulunmaktadır.

    private val listener = object : TextClassificationHelper.TextResultsListener {
      override fun onResult(results: List<Category>, inferenceTime: Long) {
        runOnUiThread {
          activityMainBinding.bottomSheetLayout.inferenceTimeVal.text =
            String.format("%d ms", inferenceTime)
    
          adapter.resultsList = results.sortedByDescending {
            it.score
          }
    
          adapter.notifyDataSetChanged()
        }
      }
      ...
    }
    
  2. Hataları işlemek için dinleyici nesnesine bir onError işlevi ekleyin:

      private val listener = object : TextClassificationHelper.TextResultsListener {
        ...
        override fun onError(error: String) {
          Toast.makeText(this@MainActivity, error, Toast.LENGTH_SHORT).show()
        }
      }
    

Model bir dizi tahmin sonucu döndürdüğünde uygulamanız, sonucu kullanıcınıza sunarak veya ek mantık yürüterek bu tahminlere göre hareket edebilir. Örnek uygulama, kullanıcı arayüzündeki tahmin puanlarını listeler.

Sonraki adımlar