موجودیت ها را با ML Kit در اندروید استخراج کنید

برای تجزیه و تحلیل یک متن و استخراج موجودیت‌های موجود در آن، متد annotate() را فراخوانی کنید و رشته متنی یا نمونه‌ای از EntityExtractionParams را به آن منتقل کنید که می‌تواند گزینه‌های اضافی مانند زمان مرجع، منطقه زمانی یا فیلتری را برای محدود کردن جستجوی زیرمجموعه‌ای از انواع موجودیت‌ها مشخص کند. API لیستی از اشیاء EntityAnnotation را برمی‌گرداند که حاوی اطلاعاتی در مورد هر موجودیت است.

نام SDK استخراج موجودیت
پیاده‌سازی دارایی‌های مربوط به آشکارساز پایه در زمان ساخت به صورت ایستا به برنامه شما متصل می‌شوند.
تأثیر اندازه دارایی استخراج موجودیت‌ها تا حدود ۵.۶ مگابایت بر حجم برنامه تأثیر می‌گذارد.

امتحانش کن.

قبل از اینکه شروع کنی

  1. در فایل build.gradle سطح پروژه خود، مطمئن شوید که مخزن Maven گوگل در هر دو بخش buildscript و allprojects گنجانده شده است.
  2. وابستگی مربوط به کتابخانه استخراج موجودیت ML Kit را به فایل gradle سطح app ماژول خود که معمولاً app/build.gradle نام دارد، اضافه کنید:

    dependencies {
    // …
    
    implementation 'com.google.mlkit:entity-extraction:16.0.0-beta6'
    }
    

استخراج موجودیت‌ها

یک شیء EntityExtractor ایجاد کنید و آن را با EntityExtractorOptions پیکربندی کنید.

کاتلین

val entityExtractor =
   EntityExtraction.getClient(
       EntityExtractorOptions.Builder(EntityExtractorOptions.ENGLISH)
           .build())

جاوا

EntityExtractor entityExtractor =
        EntityExtraction.getClient(
            new EntityExtractorOptions.Builder(EntityExtractorOptions.ENGLISH)
                .build());

EntityExtractorOptions در صورت نیاز، یک Executor تعریف‌شده توسط کاربر را نیز می‌پذیرد، در غیر این صورت از Executor پیش‌فرض در ML Kit استفاده خواهد کرد.

مطمئن شوید که مدل مورد نیاز روی دستگاه دانلود شده است.

کاتلین

entityExtractor
  .downloadModelIfNeeded()
  .addOnSuccessListener { _ ->
    /* Model downloading succeeded, you can call extraction API here. */
  }
  .addOnFailureListener { _ -> /* Model downloading failed. */ }

جاوا

entityExtractor
    .downloadModelIfNeeded()
    .addOnSuccessListener(
        aVoid -> {
          // Model downloading succeeded, you can call the extraction API here. 
        })
    .addOnFailureListener(
        exception -> {
          // Model downloading failed.
        });

پس از تأیید دانلود مدل، یک رشته یا EntityExtractionParams به annotate() ارسال کنید. تا زمانی که از در دسترس بودن مدل مطمئن نشده‌اید annotate() فراخوانی نکنید.

کاتلین

val params =
      EntityExtractionParams.Builder("My flight is LX373, please pick me up at 8am tomorrow.")
        .setEntityTypesFilter((/* optional entity type filter */)
        .setPreferredLocale(/* optional preferred locale */)
        .setReferenceTime(/* optional reference date-time */)
        .setReferenceTimeZone(/* optional reference timezone */)
        .build()
entityExtractor
      .annotate(params)
      .addOnSuccessListener {
        // Annotation process was successful, you can parse the EntityAnnotations list here.
      }
      .addOnFailureListener {
        // Check failure message here.
      }

جاوا

EntityExtractionParams params = new EntityExtractionParams
        .Builder("My flight is LX373, please pick me up at 8am tomorrow.")
        .setEntityTypesFilter(/* optional entity type filter */)
        .setPreferredLocale(/* optional preferred locale */)
        .setReferenceTime(/* optional reference date-time */)
        .setReferenceTimeZone(/* optional reference timezone */)
        .build();
entityExtractor
        .annotate(params)
        .addOnSuccessListener(new OnSuccessListener<List<EntityAnnotation>>() {
          @Override
          public void onSuccess(List<EntityAnnotation> entityAnnotations) {
            // Annotation process was successful, you can parse the EntityAnnotations list here.
          }
        })
        .addOnFailureListener(new OnFailureListener() {
          @Override
          public void onFailure(@NonNull Exception e) {
            // Check failure message here.
          }
        });

PreferredLocale ، ReferenceTime و ReferenceTimeZone فقط موجودیت‌های DateTime را تحت تأثیر قرار می‌دهند. اگر این موارد به صراحت تنظیم نشده باشند، به طور پیش‌فرض مقادیری از دستگاه کاربر را در نظر می‌گیرند.

برای بازیابی اطلاعات مربوط به موجودیت‌های شناخته‌شده، روی نتایج حاشیه‌نویسی حلقه بزنید.

کاتلین

for (entityAnnotation in entityAnnotations) {
  val entities: List<Entity> = entityAnnotation.entities

  Log.d(TAG, "Range: ${entityAnnotation.start} - ${entityAnnotation.end}")
  for (entity in entities) {
    when (entity) {
      is DateTimeEntity -> {
        Log.d(TAG, "Granularity: ${entity.dateTimeGranularity}")
        Log.d(TAG, "TimeStamp: ${entity.timestampMillis}")
      }
      is FlightNumberEntity -> {
        Log.d(TAG, "Airline Code: ${entity.airlineCode}")
        Log.d(TAG, "Flight number: ${entity.flightNumber}")
      }
      is MoneyEntity -> {
        Log.d(TAG, "Currency: ${entity.unnormalizedCurrency}")
        Log.d(TAG, "Integer part: ${entity.integerPart}")
        Log.d(TAG, "Fractional Part: ${entity.fractionalPart}")
      }
      else -> {
        Log.d(TAG, "  $entity")
      }
    }
  }
}

جاوا

List<EntityAnnotation> entityAnnotations = /* Get from EntityExtractor */;
for (EntityAnnotation entityAnnotation : entityAnnotations) {
  List<Entity> entities = entityAnnotation.getEntities();

  Log.d(TAG, String.format("Range: [%d, %d)", entityAnnotation.getStart(), entityAnnotation.getEnd()));
  for (Entity entity : entities) {
    switch (entity.getType()) {
      case Entity.TYPE_DATE_TIME:
        DateTimeEntity dateTimeEntity = entity.asDateTimeEntity();
        Log.d(TAG, "Granularity: " + dateTimeEntity.getDateTimeGranularity());
        Log.d(TAG, "Timestamp: " + dateTimeEntity.getTimestampMillis());
      case Entity.TYPE_FLIGHT_NUMBER:
        FlightNumberEntity flightNumberEntity = entity.asFlightNumberEntity();
        Log.d(TAG, "Airline Code: " + flightNumberEntity.getAirlineCode());
        Log.d(TAG, "Flight number: " + flightNumberEntity.getFlightNumber());
      case Entity.TYPE_MONEY:
        MoneyEntity moneyEntity = entity.asMoneyEntity();
        Log.d(TAG, "Currency: " + moneyEntity.getUnnormalizedCurrency());
        Log.d(TAG, "Integer Part: " + moneyEntity.getIntegerPart());
        Log.d(TAG, "Fractional Part: " + moneyEntity.getFractionalPart());
      case Entity.TYPE_UNKNOWN:
      default:
        Log.d(TAG, "Entity: " + entity);
    }
  }
}

وقتی دیگر به شیء EntityExtractor نیازی ندارید، متد close() را فراخوانی کنید. اگر از EntityExtractor در یک Fragment یا AppCompatActivity استفاده می‌کنید، می‌توانید LifecycleOwner.getLifecycle() را روی Fragment یا AppCompatActivity و سپس Lifecycle.addObserver را فراخوانی کنید. برای مثال:

کاتلین

val options = 
val extractor = EntityExtraction.getClient(options);
getLifecycle().addObserver(extractor);

جاوا

EntityExtractorOptions options = 
EntityExtractor extractor = EntityExtraction.getClient(options);
getLifecycle().addObserver(extractor);

مدیریت صریح مدل‌های استخراج موجودیت

وقتی از API استخراج موجودیت همانطور که در بالا توضیح داده شد استفاده می‌کنید، ML Kit به طور خودکار مدل‌های خاص زبان را در صورت نیاز (هنگامی که downloadModelIfNeeded() را فراخوانی می‌کنید) روی دستگاه دانلود می‌کند. همچنین می‌توانید با استفاده از API مدیریت مدل ML Kit، مدل‌هایی را که می‌خواهید روی دستگاه موجود باشند، به طور صریح مدیریت کنید. این می‌تواند در صورتی مفید باشد که بخواهید مدل‌ها را از قبل دانلود کنید. API همچنین به شما امکان می‌دهد مدل‌هایی را که دیگر نیازی به آنها ندارید، حذف کنید.

کاتلین

val modelManager = RemoteModelManager.getInstance()

// Get entity extraction models stored on the device.
modelManager.getDownloadedModels(EntityExtractionRemoteModel::class.java)
  .addOnSuccessListener {
    // ...
  }
  .addOnFailureListener({
    // Error.
  })
    
// Delete the German model if it's on the device.
val germanModel =
  EntityExtractionRemoteModel.Builder(EntityExtractorOptions.GERMAN).build()
modelManager.deleteDownloadedModel(germanModel)
  .addOnSuccessListener({
    // Model deleted.
  })
  .addOnFailureListener({
    // Error.
  })
    
// Download the French model.
val frenchModel =
  EntityExtractionRemoteModel.Builder(EntityExtractorOptions.FRENCH).build()
val conditions =
  DownloadConditions.Builder()
    .requireWifi()
    .build()
modelManager.download(frenchModel, conditions)
  .addOnSuccessListener({
    // Model downloaded.
  })
  .addOnFailureListener({
    // Error.
  })

جاوا

// Get entity extraction models stored on the device.
modelManager.getDownloadedModels(EntityExtractionRemoteModel.class)
    .addOnSuccessListener(new OnSuccessListener<Set<EntityExtractionRemoteModel>>() {
      @Override
      public void onSuccess(Set<EntityExtractionRemoteModel> models) {
        // ...
      }
    })
    .addOnFailureListener(new OnFailureListener() {
      @Override
      public void onFailure(@NonNull Exception e) {
        // Error.
      }
    });

// Delete the German model if it's on the device.
EntityExtractionRemoteModel germanModel = new EntityExtractionRemoteModel.Builder(EntityExtractorOptions.GERMAN).build();
    modelManager.deleteDownloadedModel(germanModel)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
          @Override
          public void onSuccess(Void v) {
            // Model deleted.
          }
        })
        .addOnFailureListener(new OnFailureListener() {
          @Override
          public void onFailure(@NonNull Exception e) {
            // Error.
          }
        });

// Download the French model.
EntityExtractionRemoteModel frenchModel = new EntityExtractionRemoteModel.Builder(EntityExtractorOptions.FRENCH).build();
    DownloadConditions conditions = new DownloadConditions.Builder()
        .requireWifi()
        .build();
    modelManager.download(frenchModel, conditions)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
          @Override
          public void onSuccess(Void v) {
            // Model downloaded.
          }
        })
        .addOnFailureListener(new OnFailureListener() {
          @Override
          public void onFailure(@NonNull Exception e) {
            // Error.
          }
        });