Detectar idioma de un texto con python

Aunque poco corriente, ¿has tenido que detectar el idioma de un texto almacenado en una variable de forma automática? A continuación vamos a ver una forma de hacer esto muy fácilmente con Python en unas pocas líneas de código.
Antes de ver el código, analicemos un poco la situación. Partimos de una cadena de texto almacenada en una variable en Python, y nuestro objetivo es averiguar el idioma en el que se encuentra dicho texto. Para ello haremos uso de las stopwords, o "palabras vacías", que son palabras que no contienen ningún significado por sí solas, como son los artículos o las preposiciones.
La razón del uso de estas stopwords es que puede encontrarse un conjunto de ellas en casi todos los idiomas, y aunque no aporten significado a los textos, permiten la unión de palabras más influyentes entre ellas, lo que las hace imprescindibles en el lenguaje natural.
Entonces, nuestro objetivo será analizar el texto proporcionado, palabra a palabra, contando el número de stopwords que se encuentran en él para cada idioma. Pero ¿de dónde obtenemos las stopwords en los diferentes idiomas? Fácil solución, del módulo NLTK (Natural Language Toolkit) de Python (sigue las instrucciones para instalarlo facilmente aquí). Además, es necesario instalar el NLTK Data, que no es más que una enorme base de datos de archivos con textos históricos, palabras...y por supuesto, stopwords.
Una vez instalado y configurado el módulo NLTK, podemos pasar a ver el código que realiza esta tarea:

  1: import nltk # Importar la librería nltk
  2: 
  3: # Lista de idiomas disponibles en la nltk
  4: languages = ["spanish","english","dutch","finnish","german","italian","portuguese","turkish","danish","french","hungarian","norwegian","russian","swedish"]
  5: 
  6: # Texto a analizar
  7: text_to_detect = "Texto a analizar y del cual detectar el idioma en el que se encuentra"
  8: 
  9: # Dividimos el texto de entrada en tokens o palabras únicas
 10: tokens = nltk.tokenize.word_tokenize(text_to_detect)
 11: tokens = [t.strip().lower() for t in tokens] # Convierte todos los textos a minúsculas para su posterior comparación
 12: 
 13: # Creamos un dict donde almacenaremos la cuenta de las stopwords para cada idioma
 14: lang_count = {}
 15: 
 16: # Por cada idioma
 17: for lang in languages:
 18:     # Obtenemos las stopwords del idioma del módulo nltk
 19:     stop_words = unicode(nltk.corpus.stopwords.words(lang))
 20:     lang_count[lang] = 0 # Inicializa a 0 el contador para cada idioma
 21: 
 22:     # Recorremos las palabras del texto a analizar
 23:     for word in tokens:
 24:         if word in stop_words: # Si la palabra se encuentra entre las stopwords, incrementa el contador
 25:             lang_count[lang] += 1
 26: 
 27: # Obtiene el idioma con el número mayor de coincidencias
 28: detected_language = max(lang_count, key=lang_count.get)
 29: 
 30: print detected_language


Aunque seguramente no será el mejor método de detección de idiomas, es un sistema bastante fiable, rápido y, sobre todo, fácil de implementar. Además, éste método permite detectar textos en idiomas muy extendidos como el castellano o el inglés, y algunos poco habituales como el húngaro, el turco o el danés.


Y tú, ¿qué algoritmo para la detección de idiomas empleas en Python o en otros lenguajes?

0 comentarios: (+add yours?)

Publicar un comentario