5

file1.txt英語、中国語、日本語、および韓国語のテキストを含むファイル があります。ConTeXt で使用するには、英語を除く言語に従ってファイル内のテキストの各領域をマークし、新しいファイルを出力する必要があります。たとえば、次のサンプル行があります。

The 恐龙 ate 鱼.

これには漢字のテキストが含まれているため、次のようにマークされます。

The \language[cn]{恐龙} ate \language[cn]{鱼}.
  • ドキュメントは UTF-8 として保存されます。
  • 中国語のテキストはマークする必要があります\language[cn]{*}
  • 日本語のテキストはマークする必要があります\language[ja]{*}
  • 韓国語のテキストはマークする必要があります\language[ko]{*}
  • 内容が次の行に続くことはありません。
  • コードが中国語、日本語、韓国語のいずれであるかについて疑問がある場合は、デフォルトで中国語に設定するのが最善です。

現在の言語に従ってテキストをマークするにはどうすればよいですか?

4

3 に答える 3

5

Pythonソリューションを提供したいと思います。どの言語でも、Unicodeスクリプト情報(Unicodeデータベース、別名UCDから)に基づいています。PerlはPythonと比較してかなり詳細なUCDを持っています。
Pythonの「unicodedata」モジュールで開かれるスクリプト情報はありません。しかし、誰かがここ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]{물고기}.
于 2012-05-07T20:55:39.040 に答える
3

韓国語はもはやサイノグラム[漢字/漢字]をあまり使用していませんが、それでも時々ポップアップします。一部の日本語のサイノグラムは竜のように日本語のみですが、多くは簡体字中国語または繁体字と同じです。だからあなたはちょっと立ち往生しています。したがって、「ハン」文字がある場合は、全文を確認する必要があります。ひらがな/カタカナ+漢字があれば、日本人である可能性が非常に高くなります。同様に、一連のハングル音節文字といくつかのサイノグラムから、その文が韓国語であることがわかります。

次に、すべて漢字、つまり中国語の場合、一部の文字が簡体字であるかどうかを確認できます。kZVariantは簡体字中国語の文字を示します。ああ、kSpecializedSemanticVariantは、日本語固有の簡略化された文字に非常によく使用されます。内と內は同じように見えるかもしれませんが、1つ目は日本語、2つ目は繁体字中国語と韓国語です(韓国語では繁体字中国語を標準として使用しています)。

1つのコードポイントに対してスクリプト名を返すコードがどこかにあります。それは役立つかもしれません。あなたは文を読み、最後に何が残っているかを確認します。コードをどこかに置きます。

編集:コード

http://pastebin.com/e276zn6y

以下のコメントに応えて:

上記のこの関数は、Unicode.orgによって提供されたデータに基づいて構築されています...それ自体は専門家ではありませんが、私はUnihanデータベースにかなり貢献しました–そして私はたまたまCJKを話します。はい、すべて3. kXXXUnihanデータベースのプロパティを利用するコードはありますが、A / OPのコードを作成することになっていることに気づいていませんでした。また、B/ロジスティクスが必要になる可能性があります。 OPが実装する準備ができているものを超えて。私のアドバイスは立っています。上記の関数を使用して、1つの完全な文をループします。すべてのコードポイントが「Han」(または「Han」+「Latin」)の場合、中国語である可能性が高くなります。一方、結果が「ハン」+「ハングル」(おそらく「ラテン」)の組み合わせである場合は、韓国語を間違えることはできません。同様に、「ハン」と「

クイックテスト

以前にリンクした関数で使用するコード。

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"

いくつかの漢字、そしてたくさんのハングル。確かに韓国語の文章。

于 2012-05-19T17:04:59.603 に答える