2009-01-01 9 views
14

Ich muss identifizieren, welche natürliche Sprache meine Eingabe gehört. Das Ziel ist, zwischen Arabisch und Englisch Wörter in einer gemischten Eingabe zu unterscheiden, wobei die Eingabe Unicode ist und aus XML-Textknoten extrahiert wird. Ich habe die Klasse Character.UnicodeBlock bemerkt. Ist es mit meinem Problem verbunden? Wie kann ich es zur Arbeit bringen?Java: Wie überprüft man, ob ein Zeichen zu einem bestimmten Unicode-Block gehört?

Edit: Die Character.UnicodeBlock Ansatz war nützlich für Arabisch, aber anscheinend nicht für Englisch macht (oder andere europäische Sprachen), weil der BASIC_LATIN Unicode Block Symbole und nicht druckbare Zeichen sowie Buchstaben bedeckt. So jetzt verwende ich die matches() Methode des String Objekts mit dem Regex Ausdruck "[A-Za-z]+" stattdessen. Ich kann damit leben, aber vielleicht kann jemand einen schöneren/schnelleren Weg vorschlagen. Ja

Antwort

0

Sie verwenden das entgegengesetzte Problem zu this one haben, aber ironischerweise, was für ihn nicht funktioniert es sollte nur für Sie große Arbeit. Es ist nur nach Wörtern auf Englisch (nur ASCII-kompatible Zeichen) mit reg-exp "\ w" zu suchen.

5

Wenn [A-Za-z]+ Ihre Anforderung erfüllt, werden Sie nichts schneller oder hübscher finden. Wenn Sie jedoch alle Buchstaben in der Latin1 Block übereinstimmen soll (einschließlich Umlaute und Ligatur), können Sie diese verwenden:

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

dass der Schnittpunkt der Menge aller Unicode Buchstaben und die Menge aller Latin1 Zeichen ist .

0

englische Zeichen sind in der Regel in diesen 4 Unicode-Blöcke sein:

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

Wenn Sie also einen String haben, können Sie eine Schleife über alle Zeichen und sehen, was jedes Zeichen im Unicode-Block ist:

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

Wenn sie alle Englisch sind, dann wissen Sie, dass Sie alle Englisch Zeichen haben. Du könntest das für jede Sprache wiederholen; Sie müssen nur herausfinden, was Unicode für jede verwendete Sprache blockiert.

Hinweis: Dies bedeutet NICHT, dass Sie die Sprache Englisch getestet haben. Sie haben nur bewiesen, dass es Zeichen aus dem Englischen verwendet. Es könnte Französisch, Deutsch, Spanisch oder andere Sprachen sein, deren Zeichen sich stark mit Englisch überschneiden.

Es gibt andere Möglichkeiten, die tatsächliche natürliche Sprache zu erkennen. Bibliotheken wie langdetect, die ich mit großem Erfolg eingesetzt haben, können dies für Sie tun:

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