2017-06-12 20 views
3

Ich habe BreakIterator.getWordInstance verwendet, um einen chinesischen Text in Wörter zu teilen. Hier ist mein BeispielBreakIterator funktioniert nicht korrekt mit chinesischem Text

import java.text.BreakIterator; 
import java.util.Locale; 

public class Sample { 
    public static void main(String[] args) { 
     String stringToExamine = "I like to eat apples. 我喜欢吃苹果。"; 

     //print each word in order 
     BreakIterator boundary = BreakIterator.getWordInstance(new Locale("zh", "CN")); 
     boundary.setText(stringToExamine); 

     printEachForward(boundary, stringToExamine); 
    } 

    public static void printEachForward(BreakIterator boundary, String source) { 
     int start = boundary.first(); 
     for (int end = boundary.next(); end != BreakIterator.DONE; start = end, end = boundary.next()) { 
      System.out.println(start + ": " + source.substring(start, end)); 
     } 
    } 
} 

Mein Beispiel Text aus https://stackoverflow.com/a/42219474/954439

Der Ausgang genommen wird, die ich erhalte, ist

0: I 
1: 
2: like 
6: 
7: to 
9: 
10: eat 
13: 
14: apples 
20: . 
21: 
22: 我喜欢吃苹果 
28: 。 

Während der erwartete Ausgang ist

0 I 
1 
2 like 
6 
7 to 
9 
10 eat 
13 
14 apples 
20 . 
21 
22 我 
23 喜欢 
25 吃 
26 苹果 
28 。 

ich auch versuchte reinen chinesischen Text, aber die Wörter sind gebrochen auf whitespace und Interpunktionszeichen acters.

Ich programmiere für einen Server, so dass die JAR-Dateigröße keine große Sorge ist. Ich versuche, die Anzahl der Wörter zu finden, die in einem bestimmten Inhalt anders als ein Beispielinhalt ist, der kleinste gemeinsame Untersequenz verwendet (aber auf Wörtern).

Was mache ich falsch?

+0

@Suragh Ich programmiere für einen Server, so dass die JAR-Dateigröße keine große Sorge ist. Ich versuche, die Anzahl der Wörter zu finden, die in einem bestimmten Inhalt anders als ein Beispielinhalt ist, der kleinste gemeinsame Untersequenz verwendet (aber auf Wörtern). – srgsanky

Antwort

3

Der Standard BreakIterator unterstützt nicht die Erkennung von "Wort" -Begrenzungen in ununterbrochenen Zeichenketten von CJK-Ideographen. Es gibt eine bug report zu diesem Thema, aber es wurde 2006 als "Will not Fix" geschlossen.

Stattdessen müssen Sie die ICU implementation verwenden. Wenn Sie auf Android entwickeln, haben Sie dies bereits als android.icu.text.BreakIterator. Andernfalls müssen Sie die ICU4J-Bibliothek von http://site.icu-project.org/download herunterladen, die sie als com.ibm.icu.text.BreakIterator hat.

+1

Ich frage mich, wie es für die Person funktioniert, die https://StackOverflow.com/a/42219474/954439 beantwortet. Ich habe auch andere Websites gesehen, die behaupten, dass BreakIterator mit chinesischem Text funktioniert. – srgsanky

+0

@srgsanky Es scheint, dass der Code der Antwort in Android läuft, der eine andere BreakIterator-Implementierung hat. – VGR

+0

Aktualisierte meine Antwort, es gibt eine alternative Implementierung, die funktioniert. –

Verwandte Themen