2012-05-07 21 views
5

Mam plik, file1.txt, zawierający tekst w języku angielskim, chińskim, japońskim i koreańskim. Do stosowania w kontekście muszę zaznaczyć każdy region tekstu w pliku w zależności od języka, za wyjątkiem angielskiego, a wyjściem nowy plik, na przykład, tutaj jest linia próbka:Jak oznaczyć cały tekst CJK w dokumencie?

The 恐龙 ate 鱼. 

Ponieważ zawiera tekst w chińskie znaki, to dostanie oznaczone tak:

The \language[cn]{恐龙} ate \language[cn]{鱼}. 
  • dokument zostanie zapisany jako UTF-8.
  • Tekst w języku chińskim powinien być oznaczony jako \language[cn]{*}.
  • Tekst w języku japońskim powinien być oznaczony jako \language[ja]{*}.
  • Tekst w języku koreańskim powinien być oznaczony jako \language[ko]{*}.
  • Zawartość nigdy nie przechodzi z jednego wiersza do drugiego.
  • Jeśli kod zawiera jakiekolwiek wątpliwości dotyczące tego, czy coś jest chińskie, japońskie lub koreańskie, najlepiej, jeśli domyślnie jest to chiński.

Jak mogę oznaczyć tekst zgodnie z obecnym językiem?

+0

Jak ustalić, czy dana postać jest chińska czy japońska? Dzielą wiele postaci. – Daenyth

+0

Jeśli w trzech językach nie ma miejsca w Unicode, to uprość moje pytanie, aby zaznaczyć wszystko od CJK do '\ language [cn] {*}'. – Village

+1

To jest bardziej skomplikowane. Trzy języki udostępniają znaki (kod numeryczny), ale niekoniecznie glif (graficzna reprezentacja postaci). Spójrz na FAQ Unicode CJK http://unicode.org/faq/han_cjk.htm – mirod

Odpowiedz

6

Surowy Algorytm:

use 5.014; 
use utf8; 
while (<DATA>) { 
    s 
     {(\p{Hangul}+)} 
     {\\language[ko]{$1}}g; 
    s 
     {(\p{Hani}+)} 
     {\\language[zh]{$1}}g; 
    s 
     {(\p{Hiragana}+|\p{Katakana}+)} 
     {\\language[ja]{$1}}g; 
    say; 
} 

__DATA__ 
The 恐龙 ate 鱼. 
The 恐竜 ate 魚. 
The キョウリュウ ate うお. 
The 공룡 ate 물고기. 

(patrz także Detect chinese character using perl?)

Występują problemy z tym. Daenyth komentarze, np.恐 竜 jest błędnie zidentyfikowany jako chiński. Uważam za mało prawdopodobne, że naprawdę pracujesz z mieszanym angielskim CJK i podajesz tylko zły przykładowy tekst. Wykonaj najpierw analizę leksykalną, aby odróżnić język chiński od japońskiego.

+0

Jak mogę użyć tego skryptu do edycji pliku? – Village

5

Chciałbym dostarczyć rozwiązanie Python. Bez względu na język, jest oparty na informacji o kodzie Unicode (z bazy danych Unicode, inaczej UCD). Perl ma raczej szczegółowy UCD niż Python.
Python nie ma otwartych informacji o Skrypcie w module "unicodedata". Ale ktoś dodał go tutaj https://gist.github.com/2204527 (małe i użyteczne). Moja implementacja jest na nim oparta. BTW, nie jest przestrzenią wrażliwą (nie ma potrzeby analizy leksykalnej).

# coding=utf8 
    import unicodedata2 
    text=u"""The恐龙ate鱼. 
    The 恐竜ate 魚. 
    Theキョウリュウ ate うお. 
    The공룡 ate 물고기. """ 

    langs = { 
    'Han':'cn', 
    'Katakana':'ja', 
    'Hiragana':'ja', 
    'Hangul':'ko' 
    } 

    alist = [(x,unicodedata2.script_cat(x)[0]) for x in text] 
    # Add Last 
    alist.append(("","")) 
    newlist = [] 
    langlist = [] 
    prevlang = "" 
    for raw, lang in alist: 
     if prevlang in langs and prevlang != lang: 
      newlist.append("\language[%s]{" % langs[prevlang] +"".join(langlist) + "}") 
      langlist = [] 

     if lang not in langs: 
      newlist.append(raw) 
     else:      
      langlist.append(raw) 
     prevlang = lang 

    newtext = "".join(newlist) 
    print newtext 

wyjście jest:

$ python test.py 
    The\language[cn]{恐龙}ate\language[cn]{鱼}. 
    The \language[cn]{恐竜}ate \language[cn]{魚}. 
    The\language[ja]{キョウリュウ} ate \language[ja]{うお}. 
    The\language[ko]{공룡} ate \language[ko]{물고기}. 
+0

Jak mogę użyć tego skryptu do edycji pliku? – Village

3

Choć koreański nie używa dużo sinograms [漢字/Kanji] więcej, wciąż pojawiają się czasami. Niektóre japońskie sinogramy są wyłącznie japońskie, takie jak 竜, ale wiele z nich jest identycznych z uproszczonym chińskim lub tradycyjnym. Więc utknąłeś w pewnym sensie. Więc musisz spojrzeć na pełne zdanie, jeśli masz jakieś znaki "Han". Jeśli ma jakieś hiragana/katakana + kanji, prawdopodobieństwo jest bardzo wysokie, to jest japoński. Podobnie, kilka sylab i kilka sinogramów powie ci, że zdanie jest po koreańsku.

Następnie, jeśli są to wszystkie znaki Han, np. Chiński, można sprawdzić, czy niektóre znaki są uproszczone: kZVariant oznacza uproszczony chiński znak. Oh, i kSpecializedSemanticVariant jest bardzo często używany dla japońskich znaków specjalnych.内 i 內 mogą wyglądać tak samo, ale pierwszy z nich to japoński, drugi tradycyjny chiński i koreański (koreański używa tradycyjnie chińskiego jako standardu).

Mam kod gdzieś, który zwraca, dla jednego codepoint, nazwę skryptu. To mogłoby pomóc. Przejdziesz przez zdanie i zobaczysz, co zostało na końcu. Podam gdzieś kod.

EDIT: kod

http://pastebin.com/e276zn6y

W odpowiedzi na komentarz poniżej:

Funkcja ta powyżej jest zbudowany na podstawie danych dostarczonych przez Unicode.org ... Chociaż nie będąc ekspertem per se, trochę przyczyniłem się do bazy danych Unihan - i zdarzyło mi się mówić CJK. Tak, wszystkie 3. Mam trochę kodu, który wykorzystuje właściwości kXXX w bazie danych Unihan, ale A/I nie wiedziałem, że powinniśmy napisać kod dla OP, a B/wymaga to logistyki, która może wykracza poza to, co OP jest gotowe do wdrożenia. Moja rada stoi. Za pomocą powyższej funkcji przeprowadź jedno pełne zdanie. Jeśli wszystkie punkty kodowe to "Han" (lub "Han" + "łacina"), istnieje duże prawdopodobieństwo, że jest to chiński. Jeśli z drugiej strony wynik jest mieszanką "Han" + "Hangul" (prawdopodobnie "łaciński"), nie możesz pomylić się z koreańskim. Podobnie, mix "Han" i "Katakana"/"Hiragana" masz japoński.

szybki test

Część kodu należy stosować użyciu funkcji związanych z wcześniej.

function guessLanguage(x) { 
    var results={}; 
    var s=''; 
    var i,j=x.length; 
    for(i=0;i<j;i++) { 
    s=scriptName(x.substr(i,1)); 
    if(results.hasOwnProperty(s)) { 
     results[s]+=1; 
    } else { 
     results[s]=1; 
    } 
    } 
    console.log(results); 
    mostCount=0; 
    mostName=''; 
    for(x in results) { 
    if (results.hasOwnProperty(x)) { 
     if(results[x]>mostCount) { 
     mostCount=results[x]; 
     mostName=x; 
     } 
    } 
    } 
    return mostName; 
} 

Niektóre testy:

r=guessLanguage("外人だけど、日本語をペラペラしゃべるよ!"); 
Object 
    Common: 2 
    Han: 5 
    Hiragana: 9 
    Katakana: 4 
    __proto__: Object 
"Hiragana" 

Przedmiotem r zawiera liczbę wystąpień każdego skryptu. Hiragana jest najczęstsza, a Hiragana + Katakana -> 2/3 zdania.

r=guessLanguage("我唔知道,佢講乜話.") 
Object 
    Common: 2 
    Han: 8 
    __proto__: Object 
"Han" 

Oczywisty przypadek Chińczyków (w tym przypadku kantoński).

r=guessLanguage("中國이 韓國보다 훨씬 크지만, 꼭 아름다운 나라가 아니다..."); 
Object 
    Common: 11 
    Han: 4 
    Hangul: 19 
    __proto__: Object 
"Hangul" 

Niektóre postacie Han, a także wiele hangulów. Pewnie koreańskie zdanie.

Powiązane problemy