ML Kit を使用してテキストの言語を識別する(Android)

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

ML Kit を使用すると、テキスト文字列の言語を識別できます。文字列の可能性が高い言語と、その文字列のすべての言語の信頼スコアを取得できます。

ML Kit は、100 を超えるさまざまな言語のテキストをネイティブ スクリプトで認識します。また、アラビア語、ブルガリア語、中国語、ギリシャ語、ヒンディー語、日本語、ロシア語でもローマ字テキストを認識できます。サポートされている言語とスクリプトの全リストをご覧ください。

言語識別を統合するには 2 つの方法があります。1 つの方法として、モデルをアプリの一部としてバンドルする方法と、Google Play 開発者サービスに依存するバンドルされていないモデルを使用する方法です。バンドルされていないモデルを選択すると、アプリのサイズが小さくなります。詳しくは、以下の表をご覧ください。

併用型バンドルされていません
ライブラリ名com.google.mlkit:language-idcom.google.android.gms:play-services-mlkit-language-id
実装モデルはビルド時にアプリに静的にリンクされます。モデルは Google Play 開発者サービスを介して動的にダウンロードされます。
アプリのサイズへの影響約 900 KB の増加。約 200 KB の増加。
初期化時間モデルはすぐに利用できます。モデルをダウンロードする前に、最初の使用を待たなければならない場合があります。

始める前に

  1. プロジェクト レベルの build.gradle ファイルの buildscript セクションと allprojects セクションの両方に Google の Maven リポジトリを組み込みます。

  2. ML Kit Android ライブラリの依存関係をモジュールのアプリレベルの Gradle ファイル(通常は app/build.gradle)に追加します。必要に応じて、次のいずれかの依存関係を選択します。

    モデルをアプリにバンドルする場合:

    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:language-id:17.0.4'
    }
    

    Google Play 開発者サービスでモデルを使用するには:

    dependencies {
      // ...
      // Use this dependency to use the dynamically downloaded model in Google Play Services
      implementation 'com.google.android.gms:play-services-mlkit-language-id:17.0.0'
    }
    
  3. Google Play 開発者サービスでモデルを使用する場合、アプリを Play ストアからインストールした後、自動的にデバイスにモデルをダウンロードするようにアプリを構成できます。これを行うには、アプリの AndroidManifest.xml ファイルに次の宣言を追加します。

    <application ...>
          ...
          <meta-data
              android:name="com.google.mlkit.vision.DEPENDENCIES"
              android:value="langid" >
          <!-- To use multiple models: android:value="langid,model2,model3" -->
    </application>
    

    モデルの可用性を明示的にチェックし、Google Play 開発者サービスの ModuleInstallClient API を使用してダウンロードをリクエストすることもできます。

    インストール時モデルのダウンロードを有効にしない場合、または明示的なダウンロードをリクエストしていない場合、モデルは ID の初回実行時にダウンロードされます。ダウンロードが完了する前にリクエストしても、結果はありません。

文字列の言語を識別する

文字列の言語を識別するには、LanguageIdentification.getClient() を呼び出して LanguageIdentifier のインスタンスを取得し、その文字列を LanguageIdentifieridentifyLanguage() メソッドに渡します。

例:

Kotlin

val languageIdentifier = LanguageIdentification.getClient()
languageIdentifier.identifyLanguage(text)
        .addOnSuccessListener { languageCode ->
            if (languageCode == "und") {
                Log.i(TAG, "Can't identify language.")
            } else {
                Log.i(TAG, "Language: $languageCode")
            }
        }
        .addOnFailureListener {
            // Model couldn’t be loaded or other internal error.
            // ...
        }

Java

LanguageIdentifier languageIdentifier =
        LanguageIdentification.getClient();
languageIdentifier.identifyLanguage(text)
        .addOnSuccessListener(
                new OnSuccessListener<String>() {
                    @Override
                    public void onSuccess(@Nullable String languageCode) {
                        if (languageCode.equals("und")) {
                            Log.i(TAG, "Can't identify language.");
                        } else {
                            Log.i(TAG, "Language: " + languageCode);
                        }
                    }
                })
        .addOnFailureListener(
                new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // Model couldn’t be loaded or other internal error.
                        // ...
                    }
                });

呼び出しが成功すると、BCP-47 言語コードが成功リスナーに渡され、テキストの言語が示されます。言語が検出されない場合は、コード und(不確定)が渡されます。

デフォルトでは、ML Kit は、信頼値が 0.5 以上の言語を識別する場合にのみ、und 以外の値を返します。このしきい値を変更するには、LanguageIdentificationOptions オブジェクトを getClient() に渡します。

Kotlin

val languageIdentifier = LanguageIdentification
        .getClient(LanguageIdentificationOptions.Builder()
                .setConfidenceThreshold(0.34f)
                .build())

Java

LanguageIdentifier languageIdentifier = LanguageIdentification.getClient(
        new LanguageIdentificationOptions.Builder()
                .setConfidenceThreshold(0.34f)
                .build());

文字列の言語候補を取得する

文字列の可能性が高い言語の信頼値を取得するには、LanguageIdentifier のインスタンスを取得して、文字列を identifyPossibleLanguages() メソッドに渡します。

例:

Kotlin

val languageIdentifier = LanguageIdentification.getClient()
languageIdentifier.identifyPossibleLanguages(text)
        .addOnSuccessListener { identifiedLanguages ->
            for (identifiedLanguage in identifiedLanguages) {
                val language = identifiedLanguage.languageTag
                val confidence = identifiedLanguage.confidence
                Log.i(TAG, "$language $confidence")
            }
        }
        .addOnFailureListener {
            // Model couldn’t be loaded or other internal error.
            // ...
        }

Java

LanguageIdentifier languageIdentifier =
        LanguageIdentification.getClient();
languageIdentifier.identifyPossibleLanguages(text)
        .addOnSuccessListener(new OnSuccessListener<List<IdentifiedLanguage>>() {
            @Override
            public void onSuccess(List<IdentifiedLanguage> identifiedLanguages) {
                for (IdentifiedLanguage identifiedLanguage : identifiedLanguages) {
                    String language = identifiedLanguage.getLanguageTag();
                    float confidence = identifiedLanguage.getConfidence();
                    Log.i(TAG, language + " (" + confidence + ")");
                }
            }
        })
        .addOnFailureListener(
                new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // Model couldn’t be loaded or other internal error.
                        // ...
                    }
                });

呼び出しが成功すると、IdentifiedLanguage オブジェクトのリストが成功リスナーに渡されます。各オブジェクトから、言語の BCP-47 コードと、その言語における文字列の信頼度を取得できます。これらの値は、文字列全体が特定の言語であることの信頼度を示します。ML Kit は 1 つの文字列で複数の言語を識別することはありません。

デフォルトでは、ML Kit は、信頼値が 0.01 以上の言語のみを返します。このしきい値は、LanguageIdentificationOptions オブジェクトを getClient() に渡すことで変更できます。

Kotlin

val languageIdentifier = LanguageIdentification
      .getClient(LanguageIdentificationOptions.Builder()
              .setConfidenceThreshold(0.5f)
              .build())

Java

LanguageIdentifier languageIdentifier = LanguageIdentification.getClient(
      new LanguageIdentificationOptions.Builder()
              .setConfidenceThreshold(0.5f)
              .build());

このしきい値に一致する言語がない場合、リストには項目が 1 つあり、値は und になります。