2012-05-07 9 views
5

मेरे पास एक फ़ाइल है, file1.txt, जिसमें अंग्रेजी, चीनी, जापानी और कोरियाई में टेक्स्ट शामिल है। संदर्भ में उपयोग के लिए, मैं भाषा के अनुसार फ़ाइल के भीतर पाठ के प्रत्येक क्षेत्र चिह्नित करने की आवश्यकता, अंग्रेजी, और एक नई फ़ाइल उत्पादन, जैसे के अलावा, यहाँ एक नमूना लाइन है:किसी दस्तावेज़ में सभी सीजेके टेक्स्ट को कैसे चिह्नित करें?

The 恐龙 ate 鱼. 

इस रूप में पाठ शामिल चीनी अक्षरों, इस इस तरह के रूप में चिह्नित किया जाएगा:

The \language[cn]{恐龙} ate \language[cn]{鱼}. 
  • दस्तावेज़ UTF-8 के रूप में सहेजा गया है।
  • चीनी में पाठ \language[cn]{*} चिह्नित किया जाना चाहिए।
  • जापानी में टेक्स्ट \language[ja]{*} चिह्नित किया जाना चाहिए।
  • कोरियाई में पाठ \language[ko]{*} चिह्नित किया जाना चाहिए।
  • सामग्री कभी भी एक पंक्ति से अगले तक जारी नहीं है।
  • यदि कोड में कभी संदेह है कि चीनी, जापानी या कोरियाई कुछ है या नहीं, तो यह चीनी के लिए डिफ़ॉल्ट है।

मैं भाषा के अनुसार पाठ को कैसे चिह्नित कर सकता हूं?

+0

आप कैसे निर्धारित करेंगे कि कोई विशेष चरित्र चीनी या जापानी है या नहीं? वे कई पात्रों को साझा करते हैं। – Daenyth

+0

यदि तीन भाषाओं में चेहरे पर नहीं है तो यूनिकोड के भीतर स्थान हैं, तो मैं सीजेके से '\ language [cn] {*}' तक सबकुछ चिह्नित करने के लिए अपने प्रश्न को सरल बना दूंगा। – Village

+1

इसकी तुलना में यह अधिक जटिल है। 3 भाषाएं चरित्र बिंदु (संख्यात्मक कोड) साझा करती हैं, लेकिन जरूरी नहीं कि ग्लिफ (चरित्र का ग्राफिकल प्रतिनिधित्व)। यूनिकोड सीजेके एफएक्यू पर एक नज़र डालें 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 टिप्पणियां जो उदा।恐 竜 चीनी के रूप में गलत पहचान है। मुझे यह असंभव लगता है कि आप वास्तव में मिश्रित अंग्रेजी-सीजेके के साथ काम कर रहे हैं, और सिर्फ खराब उदाहरण पाठ दे रहे हैं। जापानी से चीनी को अलग करने के लिए पहले एक व्याख्यात्मक विश्लेषण करें।

+0

मैं इस स्क्रिप्ट का उपयोग फ़ाइल को संपादित करने के लिए कैसे कर सकता हूं? – Village

5

मैं एक पायथन समाधान प्रदान करना चाहता हूं। कोई फर्क नहीं पड़ता कि कौन सी भाषा, यह यूनिकोड स्क्रिप्ट जानकारी (यूनिकोड डेटाबेस, उर्फ ​​यूसीडी से) पर आधारित है। पर्ल ने पाइथन की तुलना में विस्तृत यूसीडी की है।
पायथन के पास "यूनिकोडेडटाटा" मॉड्यूल में कोई स्क्रिप्ट जानकारी नहीं खोली गई है। लेकिन किसी ने इसे https://gist.github.com/2204527 (छोटे और उपयोगी) में जोड़ा है। मेरा कार्यान्वयन इस पर आधारित है। बीटीडब्ल्यू, यह अंतरिक्ष संवेदनशील नहीं है (किसी भी व्याख्यात्मक विश्लेषण की आवश्यकता नहीं है)।

# 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 

आउटपुट है:

$ 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

कोरियाई ज्यादा sinograms का उपयोग नहीं करता है, [漢字/कांजी] अब, वे अभी भी ऊपर कभी कभी पॉप। कुछ जापानी sinograms पूरी तरह से जापानी हैं, जैसे 竜, लेकिन कई सरलीकृत चीनी या पारंपरिक के समान हैं। तो आप फंस गए हैं। इसलिए यदि आपके पास कुछ "हान" वर्ण हैं तो आपको एक पूर्ण वाक्य को देखने की आवश्यकता है। अगर इसमें कुछ हिरागाना/कटकाना + कांजी है, तो संभावना है कि यह जापानी है। इसी तरह, का एक गुच्छा हैंगुल अक्षरों और कुछ साइनोग्राम आपको बताएंगे कि वाक्य कोरियाई में है।

फिर, यदि यह सभी हान पात्रों, यानी चीनी है, तो आप देख सकते हैं कि कुछ वर्ण सरलीकृत हैं या नहीं: kZVariant एक सरलीकृत चीनी चार को दर्शाता है। ओह, और kSpecializedSemanticVariant अक्सर जापानी विशिष्ट सरलीकृत वर्णों के लिए उपयोग किया जाता है।内 और 內 आप के लिए समान दिख सकते हैं, लेकिन पहला जापानी है, दूसरा पारंपरिक चीनी और कोरियाई (कोरियाई पारंपरिक चीनी को मानक के रूप में उपयोग करता है)।

मेरे पास कोड है जो एक कोडपॉइंट, स्क्रिप्ट नाम के लिए कहीं लौटाता है। वह मदद कर सकता है। आप एक वाक्य के माध्यम से जाते हैं, और अंत में क्या बचा है देखें। मैं कहीं कोड डाल दूंगा।

संपादित करें: कोड

http://pastebin.com/e276zn6y

नीचे टिप्पणी के जवाब में:

ऊपर इस समारोह Unicode.org द्वारा उपलब्ध कराए गए आंकड़ों के आधार पर बनाया गया है ... जबकि एक विशेषज्ञ नहीं किया जा रहा प्रति से, मैंने यूनिहान डेटाबेस में काफी योगदान दिया - और मैं सीजेके बोलना चाहता हूं। हां, सब 3. मेरे पास कुछ कोड है जो यूनिहान डेटाबेस में kXXX गुणों का लाभ उठाता है, लेकिन ए/मुझे पता नहीं था कि हमें ओपी के लिए कोड लिखना था, और बी/इसके लिए एक रसद की आवश्यकता होगी ओपी लागू करने के लिए तैयार क्या है उससे परे जाओ। मेरी सलाह खड़ा है। ऊपर दिए गए कार्य के साथ, एक पूर्ण वाक्य के माध्यम से लूप। यदि सभी कोडपॉइंट "हान" हैं, (या "हान" + "लैटिन"), संभावना है कि यह चीनी है। यदि दूसरी ओर परिणाम "हान" + "हंगुल" (+ "लैटिन" संभवतः) का मिश्रण है तो आप कोरियाई के साथ गलत नहीं जा सकते हैं। इसी तरह, "हान" और "कटाकाना"/"हिरगाना" का मिश्रण आपके पास जापानी है।

एक त्वरित परीक्षण

कुछ कोड समारोह मैं पहले से जुड़ा हुआ साथ प्रयोग किया जा करने के लिए।

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" 

कुछ हान पात्र, और एक बहुत सारे हैंगुल। एक कोरियाई वाक्य, निश्चित रूप से।

संबंधित मुद्दे