2017-06-12 8 views
3

J'ai utilisé BreakIterator.getWordInstance pour diviser un texte chinois en mots. Voici mon exempleBreakIterator ne fonctionnait pas correctement avec du texte chinois

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)); 
     } 
    } 
} 

Mon exemple texte est tiré de https://stackoverflow.com/a/42219474/954439

La sortie que je reçois est

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

considérant que, le résultat attendu est

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

J'ai même essayé le texte chinois pur, mais les mots sont brisés sur les espaces et la ponctuation char acters.

Je suis en train de programmer pour un serveur, donc la taille du fichier jar n'est pas un gros problème. J'essaie de trouver le nombre de mots qui est différent dans un contenu donné par rapport à un exemple de contenu en utilisant moins la sous-séquence commune (mais sur les mots).

Qu'est-ce que je fais mal?

+0

@Suragch Je suis en train de programmer pour un serveur, donc la taille du fichier jar n'est pas un gros problème. J'essaie de trouver le nombre de mots qui est différent dans un contenu donné par rapport à un exemple de contenu en utilisant moins la sous-séquence commune (mais sur les mots). – srgsanky

Répondre

3

La norme BreakIterator ne prend pas en charge la détection des limites de «mot» dans les chaînes ininterrompues d'idéogrammes CJK. Il y a un bug report sur ce sujet, mais il a été fermé en 2006 en tant que "Will not Fix". Au lieu de cela, vous devrez utiliser le code ICU implementation. Si vous développez sur Android, vous l'avez déjà comme android.icu.text.BreakIterator. Sinon, vous devrez télécharger la bibliothèque ICU4J de http://site.icu-project.org/download, qui l'a comme com.ibm.icu.text.BreakIterator.

+1

Je me demande comment cela a fonctionné pour la personne qui a répondu https://stackoverflow.com/a/42219474/954439. Je voyais aussi d'autres sites qui prétendent que BreakIterator fonctionne avec du texte chinois. – srgsanky

+0

@srgsanky Il semble que le code de la réponse fonctionne sous Android, qui a une implémentation BreakIterator différente. – VGR

+0

Mis à jour ma réponse, il existe une autre implémentation qui fonctionne. –