realizar - Para dividir solo caracteres chinos en java
realizar divisiones en java (3)
Aquí hay un enfoque que tomaría.
Puede usar Character.codePointAt (char [] charArray, int index) para devolver el valor Unicode de un char en su matriz char.
También necesitará una asignación de caracteres latinos Unicode.
Si busca en la fuente de Character.UnicodeBlock, el bloque LATIN completo es el intervalo [0x0000, 0x0249]. Entonces, básicamente, comprueba si su punto de código Unicode está en algún lugar dentro de ese intervalo.
Sospecho que hay una manera de simplemente usar un Character.Subset para verificar si contiene tu char, pero no he investigado eso.
Estoy escribiendo una aplicación java; pero atascado en este punto
Básicamente, tengo una cadena de caracteres chinos con TAMBIÉN algunos caracteres o números latinos posibles, digamos:
查詢促進民間參與公共建設法(210BOT法).
Quiero dividir esos caracteres chinos excepto el latín o los números como "BOT" arriba. Entonces, al final tendré este tipo de lista:
[ 查, 詢, 促, 進, 民, 間, 參, 與, 公, 共, 建, 設, 法, (, 210, BOT, 法, ), ., ]
¿Cómo puedo resolver este problema (para java)?
Los caracteres chinos se encuentran dentro de ciertos rangos Unicode:
- 2F00-2FDF: Kangxi
- 4E00-9FAF: CJK
- 3400-4DBF: Extensión CJK
Entonces todo lo que debes hacer es verificar si el punto de código del personaje se encuentra dentro de los rangos conocidos. Este ejemplo es un buen punto de partida para escribir un analizador / separador basado en pila, solo necesita extenderlo para separar los dígitos de las letras latinas, lo que debería ser lo suficientemente obvio (pista: Character#isDigit()
):
Set<UnicodeBlock> chineseUnicodeBlocks = new HashSet<UnicodeBlock>() {{
add(UnicodeBlock.CJK_COMPATIBILITY);
add(UnicodeBlock.CJK_COMPATIBILITY_FORMS);
add(UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS);
add(UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT);
add(UnicodeBlock.CJK_RADICALS_SUPPLEMENT);
add(UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION);
add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS);
add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A);
add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B);
add(UnicodeBlock.KANGXI_RADICALS);
add(UnicodeBlock.IDEOGRAPHIC_DESCRIPTION_CHARACTERS);
}};
String mixedChinese = "查詢促進民間參與公共建設法(210BOT法)";
for (char c : mixedChinese.toCharArray()) {
if (chineseUnicodeBlocks.contains(UnicodeBlock.of(c))) {
System.out.println(c + " is chinese");
} else {
System.out.println(c + " is not chinese");
}
}
Buena suerte.
Diclaimer: soy un novato completo de Lucene.
Utilizando la última versión de Lucene (3.6.0 en el momento de escribir esto) me las arreglo para acercarme al resultado que necesita.
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36, Collections.emptySet());
List<String> words = new ArrayList<String>();
TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(original));
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute.class);
try {
tokenStream.reset(); // Resets this stream to the beginning. (Required)
while (tokenStream.incrementToken()) {
words.add(termAttribute.toString());
}
tokenStream.end(); // Perform end-of-stream operations, e.g. set the final offset.
}
finally {
tokenStream.close(); // Release resources associated with this stream.
}
El resultado que obtengo es:
[查, 詢, 促, 進, 民, 間, 參, 與, 公, 共, 建, 設, 法, 210bot, 法]