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

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

نام SDK موجودیت-استخراج
پیاده سازی دارایی‌های آشکارساز پایه به‌طور ایستا به برنامه شما در زمان ساخت مرتبط هستند.
تاثیر اندازه دارایی استخراج موجودیت تا 5.6 ​​مگابایت تأثیر اندازه برنامه دارد.

آن را امتحان کنید

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

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

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

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

یک شیء 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.
          }
        });