2009-01-01 26 views
14

Necesito identificar a qué idioma natural pertenece mi entrada. El objetivo es distinguir entre árabe y inglés palabras en una entrada mixta, donde la entrada es Unicode y se extrae de los nodos de texto XML. He notado la clase Character.UnicodeBlock. ¿Está relacionado con mi problema? ¿Cómo puedo hacer que funcione?Java: cómo comprobar si el carácter pertenece a un bloque Unicode específico?

Editar: El Character.UnicodeBlock enfoque era útil para el árabe, pero al parecer no lo hace para Inglés (u otros idiomas europeos) debido a que el bloque de Unicode BASIC_LATIN cubre símbolos y caracteres no imprimibles, así como letras. Así que ahora estoy usando el método matches() del objeto String con la expresión de expresiones regulares "[A-Za-z]+" en su lugar. Puedo vivir con eso, pero tal vez alguien pueda sugerir una manera mejor/más rápida.

Respuesta

0

Usted tiene el problema opuesto a this one, pero, irónicamente, lo que no funciona para él sólo se debe trabajar mucho para usted. Es solo buscar palabras en inglés (solo caracteres compatibles con ASCII) con reg-exp "\ w".

5

Si cumple con su requisito [A-Za-z]+, no encontrará nada más rápido o más bonito. Sin embargo, si desea hacer coincidir todas las letras en el bloque Latin1 (incluyendo letras y ligaduras acentuados), puede utilizar esto:

Pattern p = Pattern.compile("[\\pL&&\\p{L1}]+"); 

Esa es la intersección del conjunto de todas las cartas Unicode y el conjunto de todos los caracteres Latin1 .

0

caracteres ingleses tienden a ser en estos 4 Unicode bloques:

ArrayList<Character.UnicodeBlock> english = new ArrayList<>(); 
english.add(Character.UnicodeBlock.BASIC_LATIN); 
english.add(Character.UnicodeBlock.LATIN_1_SUPPLEMENT); 
english.add(Character.UnicodeBlock.LATIN_EXTENDED_A); 
english.add(Character.UnicodeBlock.GENERAL_PUNCTUATION); 

Así que si usted tiene una cadena, puede bucle sobre todos los personajes y ver lo Unicode bloquear cada personaje está en:

for (char currentChar : myString.toCharArray()) 
{ 
    Character.UnicodeBlock unicodeBlock = Character.UnicodeBlock.of(currentChar); 
    if (english.contains(unicodeBlock)) 
    { 
     // This character is English 
    } 
} 

Si son todas inglesas, entonces usted sabe que tiene caracteres que todo el inglés. Puedes repetir esto para cualquier idioma; Tendrás que descubrir qué bloques Unicode usa cada idioma.

Nota: Esto NO significa que haya probado que el idioma es inglés. Solo has probado que usa caracteres encontrados en inglés. Podría ser francés, alemán, español u otros idiomas cuyos caracteres tengan una gran coincidencia con el inglés.

Existen otras maneras de detectar el lenguaje natural real. Bibliotecas como langdetect, que he utilizado con gran éxito, pueden hacer esto para usted:

https://code.google.com/p/language-detection/

Cuestiones relacionadas