2010-02-24 17 views
25

Supongamos que tenemos un archivo de texto con el contenido: "Je suis un homme Beau ..."¿Cómo puedo saber en qué idioma está escrito un archivo de texto plano?

otra con: "Soy un hombre valiente"

el tercero con un texto en alemán: "Guten morgen. ¿Wie geht's?"

¿Cómo escribimos una función que nos diga: con tal probabilidad, el texto en el primer archivo está en inglés, en el segundo tenemos francés, etc.?

Se aceptan enlaces a libros o soluciones listas para usar. Escribo en Java, pero puedo aprender Python si es necesario.

Mis comentarios

  1. Hay una pequeña comentario tengo que añadir. El texto puede contener frases en diferentes idiomas, como parte de un todo o como resultado de un error. En la literatura clásica tenemos muchos ejemplos, porque los miembros de la aristocracia eran multilingües. Entonces, la probabilidad describe mejor la situación, ya que la mayoría de las partes del texto están en un idioma, mientras que otras pueden escribirse en otro.
  2. Google API - Conexión a Internet. Preferiría no usar funciones/servicios remotos, ya que necesito hacerlo yo mismo o usar una biblioteca descargable. Me gustaría hacer una investigación sobre ese tema.
+0

@EugeneP: french sería más "Je suis un bel homme ...";) pero es poco probable que un detector de idiomas detecte ese error (o al menos un uso muy poco común). – SyntaxT3rr0r

+0

@WizardOfOdds Je suis un bonhomme alors, merci, quand meme;) – EugeneP

+2

Además, espero que ya haya verificado esto: http://stackoverflow.com/questions/1383503/how-to-determine-the-natural-language-of- a-document –

Respuesta

19

Hay un paquete llamado JLangDetect que parece hacer exactamente lo que quiere:

langof("un texte en français") = fr : OK 
langof("a text in english") = en : OK 
langof("un texto en español") = es : OK 
langof("un texte un peu plus long en français") = fr : OK 
langof("a text a little longer in english") = en : OK 
langof("a little longer text in english") = en : OK 
langof("un texto un poco mas largo en español") = es : OK 
langof("J'aime les bisounours !") = fr : OK 
langof("Bienvenue à Montmartre !") = fr : OK 
langof("Welcome to London !") = en : OK 
// ... 

Editar: como Kevin señaló, existe una funcionalidad similar en el Nutch project proporcionado por el paquete org.apache.nutch.analysis.lang.

+0

¿por qué no hay un ejemplo en alemán? – Chris

+0

@Chris Bueno, una buena pregunta. Solo sé una frase, veamos si puedo escribirla correctamente. – EugeneP

+0

No lo sé, pero el alemán figura como idioma admitido –

0

¿Tiene conexión a internet si ello ocurre, Google API Idioma ser perfecto para usted.

// This example request includes an optional API key which you will need to 
// remove or replace with your own key. 
// Read more about why it's useful to have an API key. 
// The request also includes the userip parameter which provides the end 
// user's IP address. Doing so will help distinguish this legitimate 
// server-side traffic from traffic which doesn't come from an end-user. 
URL url = new URL(
    "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&" 
    + "q=Paris%20Hilton&key=INSERT-YOUR-KEY&userip=USERS-IP-ADDRESS"); 
URLConnection connection = url.openConnection(); 
connection.addRequestProperty("Referer", /* Enter the URL of your site here */); 

String line; 
StringBuilder builder = new StringBuilder(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
while((line = reader.readLine()) != null) { 
builder.append(line); 
} 

JSONObject json = new JSONObject(builder.toString()); 
// now have some fun with the results... 

Si no hay otros métodos.

3

Buscar cadenas de Markov.

Básicamente, necesitará muestras estadísticamente significativas de los idiomas que desea reconocer. Cuando obtiene un archivo nuevo, vea cuáles son las frecuencias de sílabas o fonemas específicos y compare la muestra precalculada. Elija el más cercano.

5

Para corpi de textos más grandes usualmente usas la distribución de letras, dígrafos e incluso trigraphs y lo comparas con las distribuciones conocidas para los idiomas que deseas detectar.

Sin embargo, es muy probable que una sola frase sea demasiado corta para dar lugar a medidas estadísticas útiles. Puede tener más suerte al emparejar palabras individuales con un diccionario, entonces.

2

Aunque es una solución más complicada de lo que está buscando, puede usar Vowpal Wabbit y entrenarlo con oraciones de diferentes idiomas.

En teoría, puede recuperar un idioma para cada oración en sus documentos.

http://hunch.net/~vw/

(No se deje engañar por la "línea" en el subtítulo del proyecto - eso es sólo MathSpeak para aprende sin necesidad de tener material de aprendizaje conjunto en la memoria)

+0

Gracias por su respuesta. – EugeneP

4

NGramJ parece ser un poco más hasta a la fecha:

http://ngramj.sourceforge.net/

también cuenta con dos perfiles de los personajes y orientadas orientados a bytes, por lo que debe ser capaz de identificar el conjunto de caracteres también.

Para documentos en varios idiomas debe identificar el juego de caracteres (ICU4J tiene que puede hacer esto), luego divida el texto en algo razonable como múltiples saltos de línea o párrafos si el texto está marcado.

+0

Gracias por su respuesta. – EugeneP

4

Pruebe Nutch's Language Identifier. Está entrenado con perfiles de n-gram de idiomas y el perfil de idiomas disponibles se combina con el texto de entrada. Lo interesante es que puedes agregar más idiomas, si es necesario.

+0

Usamos el identificador de idioma de nutch con muy buenos resultados. Es una implementación estándar de un modelo bigram que funciona para idiomas que comparten un conjunto de caracteres. –

2

Si usted está interesado en el mecanismo por el cual detección de idioma puede llevarse a cabo, lo que se refieren a la siguiente article (pitón basados) que utiliza una (muy) Método ingenuo, pero es una buena introducción a este problema en particular y machine learning (solo una gran palabra) en general.

Para las implementaciones Java, JLangDetect y Nutch como lo sugieren los otros carteles son bastante buenos. También echa un vistazo a Lingpipe, JTCL y NGramJ.


Para el problema en el que tiene múltiples idiomas en la misma página, se puede utilizar un detector de límite de frase para cortar una página en frases y luego tratar de identificar el idioma de cada oración. Suponiendo que una oración contenga solo un idioma (principal), aún debe obtener buenos resultados con cualquiera de las implementaciones anteriores.

Nota: Un detector de límite de frase (SBD) es teóricamente un lenguaje específico (problema de la gallina del huevo ya que se necesita uno para el otro). Pero para los idiomas basados ​​en scripts latinos (inglés, francés, alemán, etc.) que usan principalmente períodos (aparte de exclamaciones, etc.) para delimitar oraciones, obtendrá resultados aceptables incluso si usa un SBD diseñado para inglés. Escribí un SBD en inglés basado en reglas que funcionó muy bien para el texto en francés. Para las implementaciones, consulte OpenNLP.

Una opción alternativa al uso del SBD es utilizar una ventana deslizante de, digamos, 10 fichas (espacios en blanco delimitados) para crear un pseudo-frase (PS) y tratar de identificar la frontera, donde los cambios en el lenguaje. Esto tiene la desventaja de que si su documento completo tiene n fichas, realizará aproximadamente n-10 operaciones de clasificación en cadenas de 10 tokens de longitud cada una. En el otro enfoque, si la oración promedio tiene 10 tokens, habría realizado aproximadamente n/10 operaciones de clasificación. Si n = 1000 palabras en un documento, está comparando 990 operaciones versus 100 operaciones: una diferencia de orden de magnitud.


Si tiene frases cortas (menos de 20 caracteres), la precisión de la detección de idioma es pobre en mi experiencia. Particularmente en el caso de sustantivos propios y sustantivos que son los mismos en idiomas como "chocolate". P.ej. ¿Es "Nueva York" una palabra en inglés o una palabra en francés si aparece en una oración en francés?

0

Los modelos bigram funcionan bien, son sencillos de escribir, fáciles de entrenar y requieren solo una pequeña cantidad de texto para su detección. El identificador de idioma nutch es una implementación java que encontramos y usamos con un envoltorio delgado.

Tuvimos problemas con un modelo bigram para texto mixto CJK e inglés (es decir, un tweet es en su mayoría japonés, pero tiene una sola palabra en inglés). Esto es obvio en retrospectiva al mirar las matemáticas (el japonés tiene muchos más caracteres, por lo que las probabilidades de cualquier par dado son bajas). Creo que podrías resolver esto con una comparación logarítmica más complicada, pero hice trampa y usé un filtro simple basado en juegos de caracteres que son exclusivos de ciertos idiomas (es decir, si solo contiene Han unificado, entonces es chino, si contiene alguno Kana japonesa y Han unificada, entonces es japonesa).

Cuestiones relacionadas