test - Java: ¿cómo verificar si el carácter pertenece a un bloque Unicode específico?
regex one (5)
Necesito identificar a qué idioma natural pertenece mi entrada. El objetivo es distinguir entre palabras en árabe e inglés en una entrada mixta, donde la entrada es Unicode y se extrae de los nodos de texto XML. Me di cuenta de la clase Character.UnicodeBlock
. ¿Está relacionado con mi problema? ¿Cómo puedo hacer que funcione?
Editar: El enfoque Character.UnicodeBlock
fue útil para el árabe, pero aparentemente no lo hace para inglés (u otros idiomas europeos) porque el bloque Unicode de BASIC_LATIN
abarca 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 regular "[A-Za-z]+"
lugar. Puedo vivir con eso, pero tal vez alguien pueda sugerir una manera mejor / más rápida.
Si [A-Za-z]+
cumple con sus requisitos, no encontrará nada más rápido o más bonito. Sin embargo, si desea hacer coincidir todas las letras del bloque Latin1 (incluidas las letras y ligaduras acentuadas), puede usar esto:
Pattern p = Pattern.compile("[//pL&&//p{L1}]+");
Esa es la intersección del conjunto de todas las letras Unicode y el conjunto de todos los caracteres Latin1.
Sí, simplemente puede usar Character.UnicodeBlock.of (char)
Los caracteres en inglés tienden a estar en estos 4 bloques Unicode:
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);
Entonces, si tienes un String, puedes recorrer todos los caracteres y ver en qué bloque de Unicode está cada personaje:
for (char currentChar : myString.toCharArray())
{
Character.UnicodeBlock unicodeBlock = Character.UnicodeBlock.of(currentChar);
if (english.contains(unicodeBlock))
{
// This character is English
}
}
Si son todos ingleses, sabrá que tiene caracteres en 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.
Hay otras maneras de detectar el lenguaje natural real. Las bibliotecas como langdetect, que he utilizado con gran éxito, pueden hacer esto por usted:
La propiedad de secuencia de comandos Unicode es probablemente más útil. En Java, se puede buscar utilizando la clase java.lang.Character.UnicodeScript :
Character.UnicodeScript script = Character.UnicodeScript.of(c);
Tienes el problema opuesto a este , pero irónicamente lo que no funciona para él solo debería funcionar bien para ti. Es solo buscar palabras en inglés (solo caracteres compatibles con ASCII) con reg-exp "/ w".