2012-05-07 15 views
5

Tengo un archivo, file1.txt, que contiene texto en inglés, chino, japonés y coreano. Para su uso en el contexto, tengo que marcar cada región de texto dentro del archivo de acuerdo al idioma, a excepción de Inglés, y la salida de un nuevo archivo, por ejemplo, aquí hay una línea de muestra:¿Cómo marcar todo el texto CJK en un documento?

The 恐龙 ate 鱼. 

ya que contiene texto en caracteres chinos, esto se marcarán como esto:

The \language[cn]{恐龙} ate \language[cn]{鱼}. 
  • El documento se guarda como UTF-8.
  • El texto en chino debe marcarse \language[cn]{*}.
  • El texto en japonés debe marcarse \language[ja]{*}.
  • El texto en coreano debe marcarse \language[ko]{*}.
  • El contenido nunca continúa de una línea a otra.
  • Si el código tiene alguna duda sobre si algo es chino, japonés o coreano, es mejor si se establece de forma predeterminada en chino.

¿Cómo puedo marcar el texto según el idioma presente?

+0

¿Cómo determinará si un personaje en particular es chino o japonés? Comparten muchos personajes. – Daenyth

+0

Si los tres idiomas que no aparecen tienen lugares dentro de Unicode, entonces simplificaré mi pregunta para simplemente marcar todo, desde CJK hasta '\ language [cn] {*}'. – Village

+1

Es más complicado que eso. Los 3 idiomas comparten puntos de carácter (el código numérico), pero no necesariamente el glifo (la representación gráfica del personaje). Eche un vistazo a las preguntas frecuentes de Unicode CJK http://unicode.org/faq/han_cjk.htm – mirod

Respuesta

6

Un algoritmo de crudo:

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

(Véase también Detect chinese character using perl?)

hay problemas con eso. Daenyth comentarios que, p.恐 mis está mal identificado como chino. Me parece poco probable que realmente estés trabajando con mixto de inglés-CJK, y solo estoy dando un mal ejemplo de texto. Realice primero un análisis léxico para diferenciar el chino del japonés.

+0

¿Cómo puedo usar este script para editar un archivo? – Village

5

Me gustaría ofrecer una solución de Python. No importa qué idioma, se basa en la información del script Unicode (desde la base de datos Unicode, también conocida como UCD). Perl tiene UCD bastante detallado en comparación con Python.
Python no tiene información de script abierta en su módulo "unicodedata". Pero alguien lo ha agregado aquí https://gist.github.com/2204527 (pequeño y útil). Mi implementación está basada en eso. Por cierto, no es sensible al espacio (no es necesario ningún análisis léxico).

# 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 

la salida es:

$ 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

¿Cómo puedo usar este script para editar un archivo? – Village

3

Mientras que Corea no utiliza mucho sinogrammes [漢字/Kanji] más, que todavía pop-up veces. Algunos sinogramas japoneses son exclusivamente japoneses, como 竜, pero muchos son idénticos a los chinos simplificados o tradicionales. Entonces estás atascado. Por lo tanto, debe ver una oración completa si tiene algunos caracteres "Han". Si tiene algún hiragana/katakana + kanji, la probabilidad es muy alta, es japonés. Del mismo modo, un grupo de hangul sílabas y un par de sinogramas le dirá que la oración está en coreano.

Luego, si se trata de todos los caracteres Han, es decir, chinos, puede ver si algunos de los caracteres están simplificados: kZVariant denota un carácter chino simplificado. Ah, y kSpecializedSemanticVariant se usa muy a menudo para los caracteres simplificados japoneses.内 y 內 pueden parecer lo mismo para usted, pero el primero es japonés, el segundo chino tradicional y coreano (el coreano usa el chino tradicional como estándar).

Tengo un código en alguna parte que devuelve, para un punto de código, el nombre del script. Eso podría ayudar. Pasas por una oración y ves lo que queda al final. Pondré el código en alguna parte.

EDIT: el código

http://pastebin.com/e276zn6y

En respuesta al comentario a continuación:

Esta función anterior construido en base a datos proporcionados por Unicode.org ... Aunque no siendo un experto per se, contribuí bastante a la base de datos de Unihan, y por casualidad hablo CJK. Sí, todo 3. Tengo un código que aprovecha las propiedades kXXX en la base de datos Unihan, pero A/I no sabía que debíamos escribir código para el OP, y B/requeriría una logística que podría ir más allá de lo que el OP está listo para implementar. Mi consejo es válido. Con la función anterior, repite una oración completa. Si todos los puntos de código son "Han", (o "Han" + "Latin"), es probable que sea chino. Si, por otro lado, el resultado es una mezcla de "Han" + "Hangul" (+ "latino" posiblemente), no se puede equivocar con el coreano. Del mismo modo, una mezcla de "Han" y "Katakana"/"Hiragana" tiene japonés.

A TEST RÁPIDO

algo de código para ser utilizado con la función he vinculado a antes.

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

Algunas pruebas:

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

El objeto r contiene el número de ocurrencias de cada secuencia de comandos. Hiragana es el más frecuente, e Hiragana + Katakana -> 2/3 de la oración.

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

Un caso obvio de chino (cantonés en este caso).

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

Algunos caracteres Han, y un montón de Hangul. Una frase coreana, sin dudas.

Cuestiones relacionadas