You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
5.2 KiB
183 lines
5.2 KiB
/*
|
|
* Copyright (C) 2018 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.google.android.textclassifier;
|
|
|
|
import android.content.res.AssetFileDescriptor;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
/**
|
|
* Java wrapper for LangId native library interface. This class is used to detect languages in text.
|
|
*
|
|
* @hide
|
|
*/
|
|
public final class LangIdModel implements AutoCloseable {
|
|
private final AtomicBoolean isClosed = new AtomicBoolean(false);
|
|
|
|
static {
|
|
System.loadLibrary("textclassifier");
|
|
}
|
|
|
|
private long modelPtr;
|
|
|
|
/** Creates a new instance of LangId predictor, using the provided model image. */
|
|
public LangIdModel(int fd) {
|
|
modelPtr = nativeNew(fd);
|
|
if (modelPtr == 0L) {
|
|
throw new IllegalArgumentException("Couldn't initialize LangId from given file descriptor.");
|
|
}
|
|
}
|
|
|
|
/** Creates a new instance of LangId predictor, using the provided model image. */
|
|
public LangIdModel(String modelPath) {
|
|
modelPtr = nativeNewFromPath(modelPath);
|
|
if (modelPtr == 0L) {
|
|
throw new IllegalArgumentException("Couldn't initialize LangId from given file.");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates a new instance of LangId predictor, using the provided model image, given as an {@link
|
|
* AssetFileDescriptor}.
|
|
*/
|
|
public LangIdModel(AssetFileDescriptor assetFileDescriptor) {
|
|
modelPtr =
|
|
nativeNewWithOffset(
|
|
assetFileDescriptor.getParcelFileDescriptor().getFd(),
|
|
assetFileDescriptor.getStartOffset(),
|
|
assetFileDescriptor.getLength());
|
|
if (modelPtr == 0L) {
|
|
throw new IllegalArgumentException("Couldn't initialize LangId from asset file descriptor.");
|
|
}
|
|
}
|
|
|
|
/** Creates a new instance of LangId predictor, using the provided model image. */
|
|
public LangIdModel(int fd, long offset, long size) {
|
|
modelPtr = nativeNewWithOffset(fd, offset, size);
|
|
if (modelPtr == 0L) {
|
|
throw new IllegalArgumentException("Couldn't initialize LangId from given file descriptor.");
|
|
}
|
|
}
|
|
|
|
/** Detects the languages for given text. */
|
|
public LanguageResult[] detectLanguages(String text) {
|
|
return nativeDetectLanguages(modelPtr, text);
|
|
}
|
|
|
|
/** Frees up the allocated memory. */
|
|
@Override
|
|
public void close() {
|
|
if (isClosed.compareAndSet(false, true)) {
|
|
nativeClose(modelPtr);
|
|
modelPtr = 0L;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void finalize() throws Throwable {
|
|
try {
|
|
close();
|
|
} finally {
|
|
super.finalize();
|
|
}
|
|
}
|
|
|
|
/** Result for detectLanguages method. */
|
|
public static final class LanguageResult {
|
|
final String mLanguage;
|
|
final float mScore;
|
|
|
|
LanguageResult(String language, float score) {
|
|
mLanguage = language;
|
|
mScore = score;
|
|
}
|
|
|
|
public final String getLanguage() {
|
|
return mLanguage;
|
|
}
|
|
|
|
public final float getScore() {
|
|
return mScore;
|
|
}
|
|
}
|
|
|
|
/** Returns the version of the LangId model used. */
|
|
public int getVersion() {
|
|
return nativeGetVersion(modelPtr);
|
|
}
|
|
|
|
public static int getVersion(int fd) {
|
|
return nativeGetVersionFromFd(fd);
|
|
}
|
|
|
|
/** Returns the version of the model. */
|
|
public static int getVersion(AssetFileDescriptor assetFileDescriptor) {
|
|
return nativeGetVersionWithOffset(
|
|
assetFileDescriptor.getParcelFileDescriptor().getFd(),
|
|
assetFileDescriptor.getStartOffset(),
|
|
assetFileDescriptor.getLength());
|
|
}
|
|
|
|
public float getLangIdThreshold() {
|
|
return nativeGetLangIdThreshold(modelPtr);
|
|
}
|
|
|
|
/** Retrieves the pointer to the native object. */
|
|
long getNativePointer() {
|
|
return modelPtr;
|
|
}
|
|
|
|
// Visible for testing.
|
|
float getLangIdNoiseThreshold() {
|
|
return nativeGetLangIdNoiseThreshold(modelPtr);
|
|
}
|
|
|
|
// Visible for testing.
|
|
int getMinTextSizeInBytes() {
|
|
return nativeGetMinTextSizeInBytes(modelPtr);
|
|
}
|
|
|
|
/**
|
|
* Returns the pointer to the native object. Note: Need to keep the LangIdModel alive as long as
|
|
* the pointer is used.
|
|
*/
|
|
long getNativeLangIdPointer() {
|
|
return modelPtr;
|
|
}
|
|
|
|
private static native long nativeNew(int fd);
|
|
|
|
private static native long nativeNewFromPath(String path);
|
|
|
|
private static native long nativeNewWithOffset(int fd, long offset, long size);
|
|
|
|
private native LanguageResult[] nativeDetectLanguages(long nativePtr, String text);
|
|
|
|
private native void nativeClose(long nativePtr);
|
|
|
|
private native int nativeGetVersion(long nativePtr);
|
|
|
|
private static native int nativeGetVersionFromFd(int fd);
|
|
|
|
private native float nativeGetLangIdThreshold(long nativePtr);
|
|
|
|
private native float nativeGetLangIdNoiseThreshold(long nativePtr);
|
|
|
|
private native int nativeGetMinTextSizeInBytes(long nativePtr);
|
|
|
|
private static native int nativeGetVersionWithOffset(int fd, long offset, long size);
|
|
}
|