Pytanie Java: jak sprawdzić, czy znak należy do określonego bloku Unicode?


Muszę określić, w jakim języku naturalnym moje wejście należy. Celem jest rozróżnienie pomiędzy arabski i język angielski słowa w mieszanym wejściu, gdzie dane wejściowe są w Unicode i są wyodrębniane z węzłów tekstowych XML. Zauważyłem klasę Character.UnicodeBlock. Czy jest to związane z moim problemem? Jak mogę go uruchomić?

Edytować:       The Character.UnicodeBlock podejście było przydatne dla języka arabskiego, ale najwyraźniej nie robi tego dla języka angielskiego (lub innych języków europejskich), ponieważ BASIC_LATIN Blok Unicode obejmuje symbole i znaki niedrukowalne, a także litery. Więc teraz używam matches() metoda String obiekt z wyrażeniem regularnym "[A-Za-z]+" zamiast. Mogę z tym żyć, ale być może ktoś może zaproponować lepszy / szybszy sposób.


14
2018-01-01 08:43


pochodzenie




Odpowiedzi:


Tak, możesz po prostu użyć Character.UnicodeBlock.of (char)


18
2018-01-01 08:49





Gdyby [A-Za-z]+ spełnia twoje wymagania, nie znajdziesz niczego szybszego ani ładniejszego. Jeśli jednak chcesz dopasować wszystkie litery w bloku Latin1 (w tym akcentowane litery i ligatury), możesz użyć tego:

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

To przecięcie zbioru wszystkich liter Unicode i zestawu wszystkich znaków Latin1.


5
2018-01-04 11:31





The Właściwość skryptu Unicode jest prawdopodobnie bardziej przydatny. W Javie można go wyszukać za pomocą java.lang.Character.UnicodeScript klasa:

Character.UnicodeScript script = Character.UnicodeScript.of(c);

1
2017-10-07 13:19





Masz przeciwny problem ten, ale, jak na ironię, to, co dla niego nie działa, powinno po prostu dobrze działać. Po prostu szukaj słów po angielsku (tylko znaki kompatybilne z ASCII) z reg-exp "\ w".


0
2018-01-03 13:08





Znaki angielskie występują w tych 4 blokach 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);

Więc jeśli masz ciąg, możesz zapętlić wszystkie znaki i zobaczyć, w jakim bloku Unicode znajduje się każda postać:

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

Jeśli wszystkie są po angielsku, to wiesz, że masz postacie w języku angielskim. Możesz to powtórzyć dla dowolnego języka; musisz po prostu dowiedzieć się, jaki kod Unicode blokuje dla każdego języka.

Uwaga: NIE oznacza to, że sprawdziłeś język jest Język angielski. Udowodniono, że używa znaków znalezionych w języku angielskim. Może to być francuski, niemiecki, hiszpański lub inne języki, których postacie mają wiele wspólnego z angielskim.

Istnieją inne sposoby na wykrycie rzeczywistego języka naturalnego. Biblioteki takie jak langdetect, z których korzystałem z dużym powodzeniem, mogą zrobić to za Ciebie:

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


0
2017-10-03 13:31