TIKA - Detección de idioma

Necesidad de detección de idioma

Para la clasificación de documentos según el idioma en el que están escritos en un sitio web multilingüe, se necesita una herramienta de detección de idioma. Esta herramienta debe aceptar documentos sin anotaciones de idioma (metadatos) y agregar esa información en los metadatos del documento detectando el idioma.

Algoritmos para perfilar Corpus

¿Qué es Corpus?

Para detectar el idioma de un documento, se construye un perfil de idioma y se compara con el perfil de los idiomas conocidos. El conjunto de texto de estos idiomas conocidos se conoce comocorpus.

Un corpus es una colección de textos de una lengua escrita que explica cómo se usa la lengua en situaciones reales.

El corpus se desarrolla a partir de libros, transcripciones y otros recursos de datos como Internet. La precisión del corpus depende del algoritmo de creación de perfiles que usemos para enmarcar el corpus.

¿Qué son los algoritmos de creación de perfiles?

La forma habitual de detectar idiomas es mediante diccionarios. Las palabras utilizadas en un texto determinado se compararán con las que se encuentran en los diccionarios.

Una lista de palabras comunes utilizadas en un idioma será el corpus más simple y efectivo para detectar un idioma en particular, por ejemplo, artículos. a, an, the en inglés.

Usar conjuntos de palabras como corpus

Usando conjuntos de palabras, se enmarca un algoritmo simple para encontrar la distancia entre dos cuerpos, que será igual a la suma de las diferencias entre las frecuencias de las palabras coincidentes.

Tales algoritmos adolecen de los siguientes problemas:

  • Dado que la frecuencia de palabras coincidentes es muy inferior, el algoritmo no puede funcionar de manera eficiente con textos pequeños que tienen pocas oraciones. Necesita mucho texto para una coincidencia precisa.

  • No puede detectar los límites de las palabras para los idiomas que tienen oraciones compuestas y los que no tienen separadores de palabras, como espacios o signos de puntuación.

Debido a estas dificultades en el uso de conjuntos de palabras como corpus, se consideran caracteres individuales o grupos de caracteres.

Usar juegos de caracteres como corpus

Dado que los caracteres que se usan comúnmente en un idioma son finitos en número, es fácil aplicar un algoritmo basado en frecuencias de palabras en lugar de caracteres. Este algoritmo funciona incluso mejor en el caso de ciertos juegos de caracteres utilizados en uno o muy pocos idiomas.

Este algoritmo adolece de los siguientes inconvenientes:

  • Es difícil diferenciar dos idiomas que tienen frecuencias de caracteres similares.

  • No existe una herramienta o algoritmo específico para identificar específicamente un idioma con la ayuda (como corpus) del conjunto de caracteres utilizado por varios idiomas.

Algoritmo de N-gram

Los inconvenientes mencionados anteriormente dieron lugar a un nuevo enfoque de utilizar secuencias de caracteres de una longitud determinada para el perfil del corpus. Dicha secuencia de caracteres se denomina N-gramas en general, donde N representa la longitud de la secuencia de caracteres.

  • El algoritmo N-gram es un método eficaz para la detección de idiomas, especialmente en el caso de idiomas europeos como el inglés.

  • Este algoritmo funciona bien con textos cortos.

  • Aunque existen algoritmos avanzados de creación de perfiles de idiomas para detectar varios idiomas en un documento multilingüe que tienen características más atractivas, Tika utiliza el algoritmo de 3 gramos, ya que es adecuado en la mayoría de situaciones prácticas.

Detección de idioma en Tika

Entre los 184 idiomas estándar estandarizados por ISO 639-1, Tika puede detectar 18 idiomas. La detección de idioma en Tika se realiza mediante elgetLanguage() método del LanguageIdentifierclase. Este método devuelve el nombre de código del idioma en formato String. A continuación se muestra la lista de los 18 pares de código de idioma detectados por Tika:

da — danés de — alemán et — estonio el — griego
en — inglés es — español fi — finlandés fr — francés
hu — húngaro es — islandés it — italiano nl — holandés
no — noruego pl — polaco pt: portugués ru — ruso
sv — sueco th — tailandés

Mientras instancia el LanguageIdentifier clase, debe pasar el formato de cadena del contenido que se extraerá, o un LanguageProfile objeto de clase.

LanguageIdentifier object = new LanguageIdentifier(“this is english”);

A continuación se muestra el programa de ejemplo para la detección de idiomas en Tika.

import java.io.IOException;

import org.apache.tika.exception.TikaException;
import org.apache.tika.language.LanguageIdentifier;

import org.xml.sax.SAXException;

public class LanguageDetection {

   public static void main(String args[])throws IOException, SAXException, TikaException {

      LanguageIdentifier identifier = new LanguageIdentifier("this is english ");
      String language = identifier.getLanguage();
      System.out.println("Language of the given content is : " + language);
   }
}

Guarde el código anterior como LanguageDetection.java y ejecútelo desde el símbolo del sistema usando los siguientes comandos:

javac  LanguageDetection.java 
java  LanguageDetection

Si ejecuta el programa anterior, da la siguiente salida:

Language of the given content is : en

Detección de idioma de un documento

Para detectar el idioma de un documento dado, debe analizarlo usando el método parse (). El método parse () analiza el contenido y lo almacena en el objeto controlador, que se le pasó como uno de los argumentos. Pase el formato de cadena del objeto controlador al constructor delLanguageIdentifier clase como se muestra a continuación -

parser.parse(inputstream, handler, metadata, context);
LanguageIdentifier object = new LanguageIdentifier(handler.toString());

A continuación se muestra el programa completo que demuestra cómo detectar el idioma de un documento determinado:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.apache.tika.language.*;

import org.xml.sax.SAXException;

public class DocumentLanguageDetection {

   public static void main(final String[] args) throws IOException, SAXException, TikaException {

      //Instantiating a file object
      File file = new File("Example.txt");

      //Parser method parameters
      Parser parser = new AutoDetectParser();
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream content = new FileInputStream(file);

      //Parsing the given document
      parser.parse(content, handler, metadata, new ParseContext());

      LanguageIdentifier object = new LanguageIdentifier(handler.toString());
      System.out.println("Language name :" + object.getLanguage());
   }
}

Guarde el código anterior como SetMetadata.java y ejecútelo desde el símbolo del sistema -

javac  SetMetadata.java 
java  SetMetadata

A continuación se muestra el contenido de Example.txt.

Hi students welcome to tutorialspoint

Si ejecuta el programa anterior, le dará el siguiente resultado:

Language name :en

Junto con el tarro de Tika, Tika proporciona una aplicación de interfaz gráfica de usuario (GUI) y una aplicación de interfaz de línea de comandos (CLI). También puede ejecutar una aplicación Tika desde el símbolo del sistema como otras aplicaciones Java.