2012-05-07 6 views
5

영어, 중국어, 일본어 및 한국어 텍스트가 포함 된 file1.txt 파일이 있습니다. 맥락에서 사용하기 위해, 내가 예를 들어 영어, 출력 새 파일을 제외하고, 언어에 따라 파일 내 텍스트의 각 지역을 표시해야합니다, 여기에 샘플 라인이로문서의 모든 CJK 텍스트를 표시하는 방법은 무엇입니까?

The 恐龙 ate 鱼. 

에 텍스트가 포함되어 있습니다 한자는, 이것은 다음과 같이 표시 얻을 것이다 :

The \language[cn]{恐龙} ate \language[cn]{鱼}. 
  • 문서가 UTF-8로 저장됩니다.
  • 중국어 텍스트는 \language[cn]{*}으로 표시해야합니다.
  • 일본어 텍스트는 \language[ja]{*}으로 표시해야합니다.
  • 한국어로 된 텍스트는 \language[ko]{*}으로 표시해야합니다.
  • 내용은 한 줄에서 다음 줄로 계속되지 않습니다.
  • 중국어, 일본어 또는 한국어인지 의심스러운 코드는 중국어가 기본값 인 경우 가장 좋습니다.

현재 표시된 언어에 따라 텍스트를 어떻게 표시합니까?

+0

특정 문자가 중국어인지 일본어인지 어떻게 결정합니까? 그들은 많은 문자를 공유합니다. – Daenyth

+0

3 개 언어가 유니 코드 내에 장소가없는 경우 CJK에서부터 \ language [cn] {*}'까지 모든 것을 표시하는 간단한 질문을 할 것입니다. – Village

+1

그것보다 더 복잡합니다. 3 개 국어는 문자 점수 (숫자 코드)를 공유하지만 반드시 문자 (문자의 그래픽 표현)는 아닙니다. 유니 코드 CJK FAQ를보십시오 http://unicode.org/faq/han_cjk.htm – mirod

답변

6

원유 알고리즘 :

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 물고기. 

는 문제가있다 (또한 Detect chinese character using perl? 참조). Daenyth은 예를 들어恐 竜은 중국인으로 오인되었다. 나는 당신이 정말로 영어 - CJK가 혼재되어있는 일이있을 것 같지 않고 나쁜 예제 텍스트를주고있다. 중국어와 일본어를 구별하기 위해 먼저 어휘 분석을 수행하십시오.

+0

이 스크립트를 사용하여 파일을 편집하려면 어떻게해야합니까? – Village

5

파이썬 솔루션을 제공하고 싶습니다. 어느 언어 든 유니 코드 스크립트 정보 (유니 코드 데이터베이스, 일명 UCD)를 기반으로합니다. Perl은 Python에 비해 오히려 상세한 UCD를 가지고 있습니다.
파이썬은 "unicodedata"모듈에서 열린 스크립트 정보가 없습니다. 하지만 여기 누군가가 https://gist.github.com/2204527 (작고 유용함)에 추가했습니다. 내 구현은 그것을 기반으로합니다. BTW, 공간에 민감하지 않습니다 (어휘 분석 필요 없음).

# 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 

출력은 다음과 같습니다 한국어가 많이 sinograms를 사용하지 않는 동안

$ 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

이 스크립트를 사용하여 파일을 편집하려면 어떻게해야합니까? – Village

3

가 [漢字/한자] 더 이상, 그들은 여전히 ​​때때로 팝업. 일부 일본의 사이 노 그램은 ε과 같이 전적으로 일본어이지만, 대부분은 중국어 (간체 또는 번체)와 동일합니다. 그래서 너는 달라 붙어. "한"문자가 있으면 전체 문장을 살펴야합니다. 히라가나/가타카나 + 한자가 있으면 확률이 매우 높습니다. 일본어입니다. 마찬가지로 한글 음절과 몇 개의 사이 노 그램이 문장이 한국어로 표시됩니다.

다음 중국어가 모두 한자 인 경우 일부 문자가 단순화되어 있는지 확인할 수 있습니다. kZVariant는 중국어 간체를 나타냅니다. 오, 그리고 kSpecializedSemanticVariant는 일본어의 간결한 문자에 자주 사용됩니다. 내외는 동일하게 보일지도 모르지만 첫 번째는 일본어이고 두 번째 중국어 번체와 한국어 (한국어는 중국어 번체를 표준으로 사용함).

하나의 코드 포인트에 대해 스크립트 이름을 반환하는 어딘가에 코드가 있습니다. 그것은 도움이 될 수 있습니다. 당신은 문장을 읽고, 마지막에 남은 것을 보게됩니다. 나는 어딘가에 코드를 올려 놓을 것이다.

EDIT : 코드 코멘트 아래에 응답

http://pastebin.com/e276zn6y

:

전문가되는 것은 아니지만 상술이 함수 ... Unicode.org 의해 제공된 데이터에 기초하여 구축

그 자체로 Unihan 데이터베이스에 상당히 기여했습니다. 그리고 저는 CJK를 말합니다. 예, 모두 3. Unihan 데이터베이스의 kXXX 속성을 활용하는 코드가 있지만 A/I는 OP 용 코드를 작성해야한다는 것을 모르고 있었고 B/OP가 구현할 준비가 된 것 이상으로 확장하십시오. 내 충고가있다. 위의 함수를 사용하여 하나의 완전한 문장으로 반복하십시오. 모든 코드 포인트가 "한"(또는 "한"+ "라틴") 인 경우 중국어 가능성이 높습니다. 반면에 결과가 "한"+ "한글"(+ "라틴어"가능성이 있음)의 혼합이면 한국어와 잘못 될 수 없습니다. 마찬가지로, "한"과 "가타가나"/ "히라가나"가 혼합되어 있으면 일본어가 있습니다.

빠른 테스트는

일부 코드 내가 전에에 링크 된 기능을 사용할 수 있습니다.

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

일부 테스트 :

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

r 객체는 각 스크립트의 발생 횟수가 포함되어 있습니다. 히라가나는 가장 빈번하며 히라가나 + 카타카나 -> 2/3의 문장입니다.

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

중국인 (이 경우 광둥어)의 분명한 경우입니다.

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

일부 한글 및 일부 한글. 확실하게 한국어 문장.