Text Classifier 구현

머신러닝 기법을 사용하는 Text Classifier로 개발자는 텍스트를 쉽게 분류할 수 있습니다.

Android 11 버전 Text Classifier

Android 11에서는 ExtServices 모듈에 업데이트 가능한 Text Classifier 서비스의 기본 구현이 도입되었습니다. Android 11 이상을 실행하는 기기에서는 getTextClassifier() 메서드가 ExtServices 모듈에 이 기본 구현을 반환합니다. 기기 제조업체는 이 TextClassifierService 구현을 사용하는 것이 좋습니다. 이 구현은 메인라인 OTA 업데이트를 통해 업데이트할 수 있기 때문입니다.

Android 11에서는 Android 8.1에서 도입된 로컬 Text Classifier 기본 구현도 삭제합니다. 따라서 getLocalTextClassifier()NO_OP Text Classifier를 반환합니다. 로컬 구현 대신 getDefaultTextClassifierImplementation() 메서드를 사용해야 합니다.

자체 텍스트 분류 알고리즘을 사용하려는 기기 제조업체의 경우 config.xml 파일에서 config_defaultTextClassifierPackage를 지정하여 맞춤 Text Classifier 서비스를 구현할 수 있습니다. 이 구성을 지정하지 않으면 기본 시스템 구현이 사용됩니다. 맞춤 구현은 TextClassifierService.getDefaultTextClassifierImplementation(Context)을 호출하여 기본 구현 인스턴스를 가져올 수 있습니다. 자세한 내용은 맞춤 Text Classifier 서비스 구현을 참고하세요.

테스트

Text Classifier 서비스 구현을 검증하려면 platform/cts/tests/tests/textclassifier/에서 호환성 테스트 모음(CTS) 테스트를 사용하세요.

Android 10 버전 Text Classifier 개선사항

Android 10의 TextClassifier API에 두 가지 메서드(suggestConversationActionsdetectLanguage)가 도입되었습니다. suggestConversationActions 메서드는 특정 대화에서 추천 답변 및 작업을 생성하며, detectLanguage 메서드는 텍스트 언어를 감지합니다.

이러한 메서드의 모델 파일은 아래에 나와 있으며 external/libtextclassifier/models/에서 확인할 수 있습니다.

  • suggestionConversationActions: actions_suggestions.universal.model
  • detectLanguage: lang_id.model

공장 출고 시 이미지의 최신 모델 파일로 기기를 출시하려면 다음을 실행하세요.

  1. 최신 모델 파일을 가져옵니다.

    external/libtextclassifier/models/update.sh
    
  2. 다운로드한 파일의 이름을 변경하고 기존 이름으로 교체합니다.
  3. 설정을 확인합니다.
    adb shell dumpsys textclassification
    

    다음은 명령어의 출력 예시입니다.

    TextClassifierImpl:
      Annotator model file(s):
        ModelFile { path=/etc/textclassifier/textclassifier.universal.model name=textclassifier.universal.model version=608 locales=und }
        ModelFile { path=/etc/textclassifier/textclassifier.en.model name=textclassifier.en.model version=608 locales=en }
      LangID model file(s):
        ModelFile { path=/etc/textclassifier/lang_id.model name=lang_id.model version=0 locales=und }
      Actions model file(s):
        ModelFile { path=/etc/textclassifier/actions_suggestions.universal.model name=actions_suggestions.universal.model version=0 locales=und }
    

Android 9 버전 Text Classifier 개선사항

Android 9에서는 새로운 Text Classifier 서비스를 통해 Android 8.1에 도입되었던 텍스트 분류 프레임워크를 확장했습니다. Text Classifier 서비스는 OEM이 텍스트 분류 시스템을 지원하기 위해 사용하면 좋은 권장 방법입니다. Text Classifier 서비스는 시스템 APK의 일부가 될 수 있고 필요할 때 업데이트할 수 있습니다.

Android 9에는 맞춤 Text Classifier 서비스 구현으로 대체하지 않는 이상 사용되는 기본 Text Classifier 서비스 구현(TextClassifierImpl)이 포함되어 있습니다.

맞춤 Text Classifier 서비스 구현

다음 섹션에서는 자체 개발한 맞춤 Text Classifier 서비스를 구현하는 방법을 설명합니다.

android.service.textclassifier.TextClassifierService 확장

public final class TextClassifierServiceImpl
        extends TextClassifierService {

    // Returns TextClassifierImpl.
    private final TextClassifier tc = getLocalTextClassifier();

    @Override
    public void onSuggestSelection(
            @Nullable TextClassificationSessionId sessionId,
            @NonNull TextSelection.Request request,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Callback<TextSelection> callback) {
        CompletableFuture.supplyAsync(
                () -> tc.suggestSelection(request))
                .thenAccept(r -> callback.onSuccess(r));
    }

    @Override
    public void onClassifyText(
            @Nullable TextClassificationSessionId sessionId,
		@NonNull TextClassification.Request request,
		@NonNull CancellationSignal cancellationSignal,
		@NonNull Callback<TextClassification> callback) {
        ...
    }

    @Override
    public void onGenerateLinks(
            @Nullable TextClassificationSessionId sessionId,
            @NonNull TextLinks.Request request,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Callback<TextLinks> callback) {
        ...
    }
    ...
}

Android 매니페스트에 서비스 정의

[AndroidManifest.xml]

<service android:name=".TextClassifierServiceImpl"
  android:permission="android.permission.BIND_TEXTCLASSIFIER_SERVICE">
    <intent-filter>
      <action android:name=
        "android.service.textclassifier.TextClassifierService"/>
    </intent-filter>
</service>

서비스는 android.permission.BIND_TEXTCLASSIFIER_SERVICE 권한을 요구해야 하고 android.service.textclassifier.TextClassifierService 인텐트 작업을 지정해야 합니다.

config 오버레이에 시스템 기본 Text Classifier 서비스 설정

[config.xml]

<string name="config_defaultTextClassifierPackage" translatable="false">com.example.textclassifierservice</string>

Text Classifier 서비스를 시스템 이미지에 빌드

맞춤 Text Classifier 서비스는 시스템 이미지에 빌드된 독립형 APK이거나 다른 시스템 APK의 일부일 수 있습니다. 시스템은 PackageManager.MATCH_SYSTEM_ONLY를 사용하여 서비스를 확인합니다.

테스트

android.view.textclassifier.cts에서 테스트를 실행합니다.

Android 9의 기타 텍스트 분류 변경사항

자세한 내용은 설치된 언어 모듈 검사를 참고하세요.

Android 9 모델 파일은 Android 8.x 모델 파일과 호환되지 않습니다.

Android 9 모델 파일에는 Android 8.x의 textclassifier.smartselection.en.model이 아닌 이름 지정 패턴 texclassifier.[language-code].model(예: textclassifier.en.model)이 있습니다.

최신 텍스트 분류 모델 파일 가져오기

다음 스크립트를 실행하여 최신 모델을 가져올 수 있습니다. 이는 소스 트리의 TextClassifier 모델을 업데이트합니다.

external/libtextclassifier/native/models/update.sh

Android 버전 8.1 Text Classifier

Android 8.1에는 텍스트 분류 구현을 위한 TextClassfier API가 도입되었습니다.

TextClassificationManager tcm =
    context.getSystemService(TextClassificationManager.class);
TextClassifier classifier = tcm.getTextClassifier();
TextSelection selection = classifier.suggestSelection(...);
TextClassification classification = classifier.classifyText(...);

개발자는 맞춤 Text Classifier를 설정할 수 있습니다.

tcm.setTextClassifier(customTextClassifier);

하지만 앱 개발자가 Text Classifier를 null로 설정하면 시스템 기본 Text Classifier가 getTextClassifier()에 반환됩니다.

android.view.textclassifier.TextClassifierImpl을 참고하세요.

TextView 및 WebView는 스마트한 선택 및 텍스트 공유 기능을 위해 TextClassifier를 사용합니다.

Text Classifier 사용

그림 1. TextClassifier 사용

TextClassifier 신경망 모델

Android 오픈소스 프로젝트(AOSP)에는 텍스트 분류를 위한 여러 신경망 모델이 있습니다. 각 모델 파일은 단일 언어에 학습됩니다. 어떤 모델 조합이라도 설치할 수 있습니다. 모델은 아래에 정의되어 있습니다.

external/libtextclassifier/Android.mk

기기에 언어 모델을 사전 설치

언어 모델 번들을 지정하여 기기에 설치할 수 있습니다.

# -----------------------
# Smart Selection bundles
# -----------------------

include $(CLEAR_VARS)
LOCAL_MODULE           := textclassifier.smartselection.bundle1
LOCAL_REQUIRED_MODULES := textclassifier.smartselection.en.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.es.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.de.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.fr.model
include $(BUILD_STATIC_LIBRARY)

예를 들어 device/google/marlin/device-common.mk에서

# TextClassifier smart selection model files
PRODUCT_PACKAGES += \
    textclassifier.smartselection.bundle1

설치된 언어 모듈 검사

ADB를 사용하여 디렉터리에 파일을 나열합니다.

$ adb shell ls -l /etc/textclassifier
-rw-r--r-- 1 root root ... textclassifier.smartselection.de.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.en.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.es.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.fr.model

모델 업데이트

모델은 새 모델을 시스템 이미지 업데이트의 일부로 포함하여 업데이트하거나 시스템 API ACTION_UPDATE_SMART_SELECTION 인텐트를 통해 업데이트를 트리거하는 시스템 구성요소를 보유하여 동적으로 업데이트할 수 있습니다. 프레임워크는 이러한 시스템 API 인텐트를 브로드캐스트하여 현재 설정된 언어의 언어 모델을 업데이트할 수 있습니다. 모델 자체에는 지원되는 언어와 버전 번호가 포함되어 있으므로 적절한 최신 모델이 사용됩니다.

따라서 모든 언어의 모델을 미리 로드할 필요는 없습니다. 이러한 모델은 나중에 추가할 수 있기 때문입니다. 지정된 언어에 관한 모델 파일을 찾지 못한 경우 텍스트 분류는 무작동 값을 반환합니다.

호환성 테스트 모음 테스트

관련 Android 호환성 테스트 모음(CTS) 테스트는 아래에서 찾을 수 있습니다.

cts/tests/tests/view/src/android/view/textclassifier/cts/TextClassificationManagerTest.java

cts/tests/tests/widget/src/android/widget/cts/TextViewTest.java

  • testSmartSelection
  • testSmartSelection_dragSelection
  • testSmartSelection_resetSelection