Secciones

  
4. Frecuencias Relativas de Lenguajes

Ganzúa incluye algunos archivos con frecuencias relativas estándar de lenguajes, pero probablemente no las incluye para el idioma o alfabeto que usted desea usar. Todos esos archivos fueron generados con el programa langFreq.jar. Este programa de línea de comandos puede obtener frecuencias relativas estándar para alfabetos arbitrarios a partir de un archivo de texto. Dado que es un programa de línea de comandos, tendrá que ejecutarlo desde una terminal4.1.

Para que las frecuencias relativas sean representativas del idioma, el archivo del que las obtiene debe ser lo más grande posible. Las las frecuencias incluidas con Ganzúa fueron obtenidas de novelas que puede encontrar en el sitio de Project Gutenberg (http://www.promo.net/pg/). En particular las estadísticas para el idioma inglés se obtuvieron de David Copperfield, de Charles Dickens y las de la lengua española de El Ingenioso Hidalgo Don Quijote de la Mancha de Miguel de Cervantes Saavedra. A diferencia de Ganzúa, que no está hecho para manejar documentos extensos, langFreq.jar puede usar documentos muy grandes.

La información sobre el archivo de texto y el alfabeto que quiera usar se coloca en un documento XML como los que se encuentran en el directorio examples/alphabetRules/en de Ganzúa. Estos documentos XML son casos particulares de el esquema AlphabetRules.xsd. Se les llama documentos de reglas para alfabetos (alphabet rules) porque especifican los caracteres a incluir en el alfabeto y cómo se deben manejar aquellos que no se encuentran dentro de éste.

Si encuentra la siguiente sección complicada o le gustaría saber algo sobre XML antes de empezar a escribir sus propios documentos XML, hojee alguna de las muchas lecciones sobre XML disponibles en Internet, como la que se encuentra en http://www.w3schools.com.

4.1 Documentos XML de Reglas para Alfabetos

Abra uno de los documentos de reglas para alfabetos (examples/alphabetRules/es) con su editor de texto (o XML) favorito para que pueda ver un ejemplo completo mientras se explican las diferentes secciones de este tipo de documento XML.

<?xml version="1.0"  encoding="UTF-8"?>

La primera línea debe indicar la codificación usada por el archivo XML. Si no sabe qué codificación está usando, probablemente sea la que usa por omisión su sistema. Puede usar Ganzúa para averiguar cuál es la codificación por omisión de su plataforma (vea Abrir criptotexto en la sección 3.2.1).

<alphabetRules xmlns="http://ganzua.sourceforge.net/rules"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://ganzua.sourceforge.net/rules
                                   ../schemata/AlphabetRules.xsd"
                language="en" country="GB"
                source="/home/user/cprfd10.txt" sourceEncoding="ISO-8859-15">

Las siguientes líneas contienen la etiqueta de apertura del elemento alphabetRules y sus atributos. Los únicos atributos que debe modificar4.2 son aquellos que especifican características del archivo de texto del que obtendrá las frecuencias relativas.

language
Identifica el lenguaje en el que está escrito el archivo de texto usando su código ISO 639 de dos letras.
country
identifica el país de origen del documento en el archivo de texto con el código ISO 3166 de dos letras del país. Este atributo se usa para identificar las diferencias en el uso de un idioma en distintos países; por ejemplo, el español como se habla en España del que se habla en México.
Este atributo puede ser omitido por completo.
source
Indica el archivo de texto del que se van a obtener las frecuencias relativas. Su valor debe ser el nombre completo del archivo (con su trayectoria absoluta).
sourceEncoding
Indica la codificación usada en el archivo de texto.

Los siguientes elementos especifican los caracteres que conforman el alfabeto. Esto se puede hacer de dos maneras:

Si quiere listar todos los caracteres del alfabeto, que es la manera más sencilla, use el elemento includeExclusively (incluir únicamente).

<includeExclusively>
   <character char="A" />
   <character char="B" />
   <character char="C" />
   <character char="D" />
           . . .
</includeExclusively>

Cada elemento character especifica un carácter a ser incluido en el alfabeto en su atributo char. Todo carácter en el archivo de texto que no se encuentre en el elemento includeExclusively será ignorado cuando el programa obtenga las frecuencias relativas. ES_27_Min.xml y ES_26_May.xml son ejemplos de archivos de reglas para alfabetos que usan este elemento.

Recuerde:
Los caracteres de retorno de carro, espacio y control son considerados especiales por Ganzúa y no deben formar parte del alfabeto plano o de cifrado.
No ponga caracteres especiales dentro de includeExclusively.

Para dejar que langFreq.jar añada caracteres al alfabeto de cifrado como los va encontrando en el archivo de texto, use los elementos include e ignore. En el siguiente ejemplo se especifican algunos caracteres haciendo referencia a su valor en el estándar Unicode (por ejemplo &#10; para el salto de línea) o usando entidades (como &quot; para el carácter "). Las entidades que hacen referencia al valor de Unicode son de la forma &#NUM; donde NUM es el número decimal (no hexadecimal) del carácter en las tablas de Unicode. Si desea aprender más sobre Unicode, visite http://www.unicode.org .

<include>
   <character char="A" />
   <character char="B" />
   <character char="C" />
   <character char="D" />
           . . .
</include>
<ignore>
   <character char=" " /> <!- espacio ->
   <character char="&#9;" /> <!- tabulación horizontal ->
   <character char="&#10;" /> <!- cambio de línea ->
   <character char="&#13;" /> <!- retorno de carro ->
   <character char="&#13;&#10;" /> <!- línea nueva ->
   <character char="&quot;" /> <!- comillas ->
   <character char="-" />
           . . .
</ignore>

Todos los caracteres en el elemento include, serán parte del alfabeto aún si no aparecen en el archivo de texto; mientras que los caracteres en el elemento ignore no serán añadidos al alfabeto aunque aparezcan en el archivo de texto.

IMPORTANTE:
Nunca ponga los mismos caracteres tanto en el elemento include como en el ignore. De hacer esto, esos caracteres estarán en el alfabeto, pero sus apariciones en el texto serán ignoradas, por lo que tendrán frecuencia cero en el archivo de frecuencias relativas y no aparecerán en ningún digrama o trigrama.

Dado que los caracteres de salto de línea, espacio y control son considerados especiales por Ganzúa, no deben aparecer en el elemento include y siempre deben ser ignorados. En el ejemplo anterior los caracteres de espacio, tabulación, cambio de línea, retorno de carro y linea nueva son ignorados. Si usa el elemento include, al menos esos caracteres deben aparecer dentro del elemento ignore.

ES_26_May_Ignr.xml, ES_27_Min_Ignr.xml y el resto de los ejemplos de reglas para alfabetos cuyos nombres incluyen Ignr usan los elementos include e ignore.

El siguiente elemento hace que langFreq.jar maneje las apariciones de ciertos caracteres como si fueran otros. El programa no hace esto automáticamente, si su alfabeto contiene únicamente letras mayúsculas (como en un elemento includeExclusively), sólo esos caracteres serán considerados y todas las letras minúsculas serán descartadas. Esto es, a menos que el elemento replace especifique que las minúsculas deben de ser manejadas como caracteres que forman parte del alfabeto.

<replace>
   <occurrences ofChar="a" byChar="A" />
   <occurrences ofChar="b" byChar="B" />
   <occurrences ofChar="c" byChar="C" />
   <occurrences ofChar="d" byChar="D" />
           . . .
</replace>

Los elementos occurrences indican el carácter a substituir en su atributo ofChar y el carácter de reemplazo en el atributo byChar. De esta manera puede hacer que se considere el carácter Ñ como N, etc.

Note que si especifica en replace que un carácter debe ser reemplazado por otro a ser ignorado, ambos serán ignorados. También debe considerar que langFreq.jar no reemplaza los caracteres recursivamente. Por ejemplo, si las siguientes líneas están dentro del elemento replace:

<occurrences ofChar="a" byChar="A" />
<occurrences ofChar="A" byChar="X" />

Las apariciones del carácter a en el texto contarán como A, y aquellas de A como X, pero a no contará como X.

Todos los ejemplos de reglas para alfabetos incluidos con Ganzúa usan el elemento replace.

4.2 Usando langFreq.jar

Para usar langFreq.jar necesita tener el archivo de texto del que va a obtener las frecuencias relativas y el documento XML con las reglas para el alfabeto. Una vez que tenga esto, abra una terminal de línea de comandos y cambie de su directorio actual al que contiene su documento XML. Ahora use el comando:

java -jar GANZÚA/langFreq.jar reglas.xml

Donde GANZÚA es el directorio que contiene a langFreq.jar y reglas.xml es el nombre del archivo XML que quiere usar. Este comando hará que langFreq.jar analice el documento XML, reporte cualquier error sintáctico que encuentre en él y si no hay ninguno, genere un documento XML con las frecuencias relativas. El programa reporta el nombre del archivo y el directorio donde puso el archivo con las frecuencias relativas al terminar el proceso. Por omisión, tratará de poner el archivo nuevo de frecuencias junto con las demás, en el directorio de frecuencias de Ganzúa, pero si no tiene permisos de escritura para ese directorio, lo pondrá en el directorio de inicio del usuario. El archivo será nombrado usando el código del idioma y un número arbitrario.

Si quiere especificar el directorio y nombre del archivo que quiere que escriba langFreq.jar, use la opción -o. Por ejemplo, si usa el comando:

java -jar GANZÚA/langFreq.jar -o frecuencias.xml reglas.xml

langFreq.jar escribirá las frecuencias relativas en el archivo frecuencias.xml en el directorio actual.

Si hace archivos de frecuencias nuevos, por favor considere donarlos al proyecto Ganzúa, especialmente si son de lenguajes para los que aún no cuenta con ningún archivo. El capítulo 5 explica cómo contribuir a Ganzúa.



Notas a pie de página

... terminal4.1
En Mac OS X puede encontrar el programa Terminal en Aplicaciones/Utilidades
... modificar4.2
Cambie el valor entre comillas, cuidando no borrar las comillas.
Jesús Adolfo García Pasquel 2004-10-04