<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>La Distancia de Levenshtein lee a Cortázar {{ edition_count }}</title>
  <style>
    /* http://meyerweb.com/eric/tools/css/reset/ 
      v2.0 | 20110126
      License: none (public domain)
    */

    html, body, div, span, applet, object, iframe,
    h1, h2, h3, h4, h5, h6, p, blockquote, pre,
    a, abbr, acronym, address, big, cite, code,
    del, dfn, em, img, ins, kbd, q, s, samp,
    small, strike, strong, sub, sup, tt, var,
    b, u, i, center,
    dl, dt, dd, ol, ul, li,
    fieldset, form, label, legend,
    table, caption, tbody, tfoot, thead, tr, th, td,
    article, aside, canvas, details, embed, 
    figure, figcaption, footer, header, hgroup, 
    menu, nav, output, ruby, section, summary,
    time, mark, audio, video {
      margin: 0;
      padding: 0;
      border: 0;
      font-size: 100%;
      font: inherit;
      vertical-align: baseline;
    }
    /* HTML5 display-role reset for older browsers */
    article, aside, details, figcaption, figure, 
    footer, header, hgroup, menu, nav, section {
      display: block;
    }
    body {
      line-height: 1;
    }
    ol, ul {
      list-style: none;
    }
    blockquote, q {
      quotes: none;
    }
    blockquote:before, blockquote:after,
    q:before, q:after {
      content: '';
      content: none;
    }
    table {
      border-collapse: collapse;
      border-spacing: 0;
    }
  </style>
  <style>
    @font-face {
      font-family: XanhMono;
      src: url(file://{{ BASEDIR }}/static/fonts/XanhMono-Regular.woff2) format('woff2'),
           url(file://{{ BASEDIR }}/static/fonts/XanhMono-Regular.woff) format('woff'),
           url(file://{{ BASEDIR }}/static/fonts/XanhMono-Regular.ttf) format('truetype');
      font-weight: 400;
      font-style: normal;
    }

    @font-face {
      font-family: XanhMono;
      src: url(file://{{ BASEDIR }}/static/fonts/XanhMono-Italic.woff2) format('woff2'),
           url(file://{{ BASEDIR }}/static/fonts/XanhMono-Italic.woff) format('woff'),
           url(file://{{ BASEDIR }}/static/fonts/XanhMono-Italic.ttf) format('truetype');
      font-weight: 400;
      font-style: italic;
    }

    html, body {
      font-family: XanhMono;
      font-size: 8.15pt;
      line-height: 12pt;
    }

    body {
      margin-left: 9rem;
    }

    input, select, option, button {
      font: inherit;
    }

    h1 {
      font-size: 18pt;
      line-height: 26pt;
      margin-bottom: 12pt;
    }

    h2 {
      font-size: 14pt;
      line-height: 18pt;
      break-before: page;
      margin-bottom: 12pt;
    }

    h3 {
      font-size: 10pt;
      line-height: 12.5pt;
      break-before: page;
      margin-top: 6pt;
      margin-bottom: 6pt;
    }

    h3.extra-space {
      margin-top: 25pt;
    }

    h1 + h2,
    h2 + h3,
    .avoid-break {
      break-before: avoid;
    }

    a {
      color: currentColor;
    }

    p, ul, ol {
      max-width: 40rem;
      margin-bottom: 12pt;
    }

    h1, h2, h3 {
      max-width: 35rem;
    }

    pre {
      font-style: italic;
      margin-left: -9rem;
      margin-top: 12pt;
    }

    blockquote {
      font-style: italic;
    }

    footer {
      font-style: normal;
      font-size: 7pt
    }

    pre.normal-flow {
      margin-left: 0;
    }

    .two-col {
      columns: 2;
      margin-left: -8rem;
      column-fill: auto;
    }

    .two-col pre {
      margin-left: 0;
      margin-top: 0;
      orphans: 3;
      widows: 3;
    }

    ul, ol {
      margin-top: 12pt;
    }

    li {
      position: relative;
    }

    ol {
      counter-reset: list-counter 0;
    }

    ol li {
      counter-increment: list-counter 1;
    }

    ol > li {
      margin-bottom: 12pt;
    }

    ol li:before {
      position: absolute;
      left: -1.15em;
      content: counter(list-counter) '.';
    }

    ol ol {
      margin-left: 2em;
      counter-reset: sublist-counter;
    }

    ol ol li {
      counter-increment: sublist-counter 1;
    }


    ol ol li:before {
      left: -2.3em;
      content: counter(list-counter) '.' counter(sublist-counter);
    }

    ul li:before {
      content: '–';
      position: absolute;
      left: -1em;
    }

    @page {
      margin: 15mm 15mm;
    }

    @page:left {
      @bottom-left {
        content: counter(page);
      }
    }

    @page:right {
      @bottom-right {
        content: counter(page);
      }
    }

    @page:first {
      @bottom-right {
        content: '';
      }

      @bottom-left {
        content: '';
      }
    }
  </style>
</head>
<body>
  <!--title -->
  <pre>
{{ fragment_cover_map }}
    
    
    
    
    
    </pre>
      <h1>La Distancia de Levenshtein<br>lee a Cortázar</h1>
      <p>
        Generado el {{ date }} a las {{ time }}, N⁰ {{ edition_count}} 
      </p>
  <!--index -->
  <h2>Índice</h2>
  <ol>
    <li>Introducción</li>
    <li>Lectura de Cortázar
      <ol>
        <li>Fragmento original</li>
        <li>Fragmento adaptado</li>
        <li>Mapa del bosque</li>
        <li>Matriz de nuevas especies intermediarias</li>
        <li>Poesía repetitiva</li>
      </ol>
    </li>
    <li>Descripción general de La Distancia de Levenshtein</li>
    <li>La Distancia de Levenshtein explicada de manera técnica</li>
    <li>Código</li>
    <li>Créditos</li>
  </ol> 

  <!--introduction -->
  <h2>1. Introducción</h2>
  <p>La Distancia de Levenshtein lee a Cortázar es la primera versión del primer libro en la 'Editorial Algoliteraria: crear alianzas con los árboles'.</p>
  <p>El autor de este libro es el algoritmo <a href ="https://es.wikipedia.org/wiki/Distancia_de_Levenshtein">La Distancia de Levenhstein</a>, el tema es el eucalipto en "Fama y eucalipto", un fragmento de <a href ="https://es.wikipedia.org/wiki/Historias_de_cronopios_y_de_famas">Historias de Cronopios y de Famas</a> de <a href ="https://es.wikipedia.org/wiki/Julio_Cort%C3%A1zar">Julio Cortázar</a>.</p>
  <p>El libro es por definición infinito y cada copia es única.</p>
  <p><a href = "https://www.anaisberck.be">Anaïs Berck</a> es un seudónimo y representa una colaboración entre humanos, algoritmos y árboles. <a href = "https://www.anaisberck.be">Anaïs Berck</a> explora las especificidades de la inteligencia humana en compañía de las inteligencias artificiales y vegetales. En junio 2021, durante una residencia en Medialab Prado en Madrid, Anaïs Berck desarrollará un prototipo de la Editorial Algoliteraria, en la que los algoritmos son los autores de libros inusuales. La residencia fue concedida por el programa "Residencia Cultura Digital" iniciado por el Gobierno Flamenco.</p>
  <p>En esta obra Anaïs Berck está representadx por:</p>
  <ul>
    <li>el algoritmo <a href ="https://es.wikipedia.org/wiki/Distancia_de_Levenshtein">La Distancia de Levenhstein</a> del cual se encuentra una descripción en este libro</li>
    <li>el eucalipto en <a href ="https://es.wikipedia.org/wiki/Historias_de_cronopios_y_de_famas">Historias de Cronopios y de Famas</a> de <a href ="https://es.wikipedia.org/wiki/Julio_Cort%C3%A1zar">Julio Cortázar</a>, publicada en 1962 por la Editorial Minotauro</li>
    <li>los seres humanos An Mertens y Gijs de Heij. An ha publicado varios libros, como escritora de ficción y como artista e investigadora en <a href="https://constantvzw.org/">Constant</a>, una organización para el arte experimental y los medios de comunicación en Bruselas de la que es miembro desde 2008. Gijs es programador y diseñador, forma parte del colectivo de diseñadores, <a href="http://osp.kitchen/">Open Source Publishing</a> en Bruselas. Ambxs son miembrxs de <a href="https://algolit.net/">Algolit</a>, un grupo de experimentación artística en Bruselas alrededor de algoritmos y textos libres.</li>
  </ul>

  <!--Reading Cortazar -->
  <h2>2. Lectura de Cortázar</h2>
  <!--Reading Cortazar -original text -->
  <h3>2.1. Fragmento original</h3>
  <blockquote>
    <p>
      Un fama anda por el bosque y aunque no necesita leña mira codiciosamente los árboles. Los árboles tienen un miedo terrible porque conocen las costumbres de los famas y temen lo peor. En medio de todos está un eucalipto hermoso, y el fama al verlo da un grito de alegría y baila tregua y baila catala en torno del perturbado eucalipto, diciendo así:
    </p>
    <p>
      – Hojas antisépticas, invierno con salud, gran higiene. 
    </p>
    <p>
      Saca un hacha y golpea al eucalipto en el estómago, sin importársele nada. El eucalipto gime, herido de muerte, y los otros árboles oyen que dice entre suspiros:
    </p>
    <p>
      – Pensar que este imbécil no tenía más que comprarse unas pastillas Valda.
    </p>
    <footer>Historias de Cronopios y Famas de Julio Cortázar, publicada en 1962 por la Editorial Minotauro </footer>
  </blockquote>

  <!--Reading Cortazar - rewritten text -->
  <h3 class="avoid-break extra-space">2.2. Fragmento adaptado</h3>
  <!--OUTPUT SCRIPT -->
  <pre class="normal-flow">{{ new_fragment }}</pre>

  <!--Reading Cortazar - map of the woods -->
  <h3>2.3. Mapa del bosque</h3>
  <p>Las distancias entre el árbol principal que has elegido para tu fragmento y las zonas de otras especies de árboles en el bosque, según La Distancia de Levenshtein:</p>
  <!--OUTPUT SCRIPT -->
  <pre>



{{ forest_map }}</pre>

   <!--Reading Cortazar - table of intermediary species-->
  <h3>2.4. Matriz de nuevas especies intermediarias</h3>
  <p>La Distancia de Levenshtein crea una matriz con las dos especies. En esta matriz calcula para cada celda la distancia entre los elementos distintos de las dos palabras.</p> 
  <p>En realidad la matriz se llena de números que representan las operaciones necesarias para cambiar un elemento al otro. Las posibles operaciones son insertar, borrar o sustituir una letra. En vez de los números, esta matriz se llena con las distintas especies intermediarias que el algoritmo crea insertando, borrando o sustituyendo letras.</p>
  <!--OUTPUT SCRIPT -->
  <pre>


{{ table_of_intermediary_species }}</pre>

  <!--Reading Cortazar - repetitive poetry -->
  <h3>2.5. Poesía repetitiva</h3>
  <!--OUTPUT SCRIPT -->
  <div class="two-col">
    <pre>{{ repetitive_poetry }}</pre>
  </div>

  <!--General description algorithm-->
  <h2>3. Descripción general de La Distancia de Levenshtein</h2>
  <p>La Distancia de Levenshtein es un algoritmo que mide la diferencia entre dos palabras o dos grupos de letras. También se denomina la 'distancia de edición'. La Distancia de Levenshtein entre dos palabras es el número mínimo de acciones necesarias para cambiar una palabra por otra. Las diferentes acciones posibles son la inserción, la supresión o la substitución de una sola letra. Por ejemplo, la Distancia de Levenshtein entre 'más' y 'mes' es 1, ya que se sustituye 'á' por 'e'.</p>
  <p>El algoritmo recibió el nombre de su creador, Vladimir Levenshtein, un matemático y científico ruso de origen judío cuya principal área de investigación era la teoría de la información y los códigos de corrección de errores. Trabajó en el Instituto Kéldysh de Matemática Aplicada en Moscú. Falleció en el 2017 a la edad de 82 años. Lanzó el algoritmo en 1965 'para considerar el problema de construir códigos óptimos capaces de corregir supresiones, inserciones e inversiones'.</p>
  <p>La Distancia de Levenshtein opera en softwares como los correctores ortográficos y por consecuencia en programas de traducción asistida por computadora. También se puede encontrar la Distancia de Levenshtein en buscadores de información donde detecta las palabras más similares a la palabra entrada erróneamente.</p>
  <p>Su actividad se extiende a campos menos evidentes como la detección de plagiarismo, el análisis de ADN, el reconocimiento automático de voz, el reconocimiento óptico de caracteres en el análisis de textos escaneados (OCR), el reconocimiento de la escritura a mano, la detección de hoax emails o la asistencia de venta y compras en el mercado de acciones.</p>
  <p>A veces la Distancia de Levenshtein llega a descubrimientos sorprendentes. Así en 1995, Kessler aplicó el algoritmo a la comparación de dialectos irlandeses. Demostró que era un método exitoso para medir las distancias fonéticas entre los dialectos. A partir de las distancias lingüísticas entre variedades dialectales, se pueden encontrar áreas dialectales. Más innovadora era la posibilidad de dibujar mapas dialectales que reflejan el hecho de que las áreas dialectales deben considerarse como continuas y no como áreas separadas por fronteras nítidas.</p>
  <p>Fuentes:</p>
  <ul>
    <li>Vladimir Levenshtein, <a href="https://nymity.ch/sybilhunting/pdf/Levenshtein1966a.pdf">Binary codes capable of correcting deletions, insertions, and reversals</a>; Cybernetics and Control Theory, vol. 10 nr. 8, February 1966.</li>
    <li><a href = "https://en.wikipedia.org/wiki/Vladimir_Levenshtein">Vladimir Levenhstein</a> + <a href="https://en.wikipedia.org/wiki/Levenshtein_distance">Distancia de Levenshtein</a> en Wikipedia.</li>
    <li>RYBN, ADMXI, <a href = "http://www.rybn.org/ANTI/ADMXI/documentation/ALGORITHM_DOCUMENTATION/HARMONY_OF_THE_SPEARS/LEVENSHTEIN_EDIT_DISTANCE/ABOUT/Wikipedia_Levenshtein_Edit_Distance.pdf">Levenshtein Edit Distance</a>.</li>
    <li>Abhi Dattasharma, Praveen Kumar Tripathi and Sridhar G, <a href="http://www.rybn.org/ANTI/ADMXI/documentation/ALGORITHM_DOCUMENTATION/HARMONY_OF_THE_SPEARS/LEVENSHTEIN_EDIT_DISTANCE/FINANCIAL_USES/2008_Identifying_Stock_Similarity_Based_on_Multi-event_Episodes.pdf">Identifying Stock Similarity Based on Multi-event Episodes</a>, in Seventh Australasian Data Mining Conference, 2008, Glenelg, Australia.</li>
    <li>S. Dutta Chowdhury; U. Bhattacharya; S.K. Parui, Online Handwriting Recognition Using Levenshtein Distance Metric, in 12th International Conference on Document Analysis and Recognition, 2013, USA.</li>
    <li>Yoke Yie Chen, Suet-Peng Yong, and Adzlan Ishak, Email Hoax Detection System Using Levenshtein Distance Method, in Journal of Computers, vol. 9, nr 2, February 2014.</li>
    <li>Charlotte Gooskens and Wilbert Heeringa, <a href =" http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.414.9927&rep=rep1&type=pdf">Perceptive evaluation of Levenshtein dialect distancemeasurements using Norwegian dialect data</a>, in Language Variation and Change, nr.16, 2004, 189–207. Cambridge University Press.</li>
  </ul>


   <!--Technical description algorithm-->
  <h2>4. La Distancia de Levenshtein explicada de manera técnica</h2>
  <p>Los seres humanos pueden reescribir una palabra y contar fácilmente el nombre de cambios que son necesarios para transformar una palabra en otra. Le invitamos a escribir la palabra máquina en una hoja, seguida por la palabra humanx en la línea siguiente. Sabiendo que sólo se puede insertar, borrar o sustituir una letra, ¿cuántas operaciones necesitaría hacer para reescribir la palabra máquina en humanx?</p>
  <p>Para que tenga una idea del modo de acción del algoritmo Distancia de Levenshtein, le describimos aquí los diferentes pasos que realiza el algoritmo para transformar la palabra máquina en humanx.</p>
  <p>Para la palabra máquina, analiza primero los posibles elementos. Son m, má, máq, máqu, máqui, máquin y máquina para un total de siete elementos. Para la palabra humanx, los elementos son h, hu, hum, huma, human y humanx para un total de seis elementos. Esto crea una matriz con 7 filas y 6 columnas. En esta matriz de distancia calculará para cada celda la distancia entre los elementos de las dos palabras.</p>
  <p>Comienza con el primer elemento de la palabra máquina que es m, lo compara con los seis elementos de la palabra humanx. El primero será h. ¿Cuál es la distancia de Levenshtein entre m y h? Lo que tiene que hacer es sustituir el carácter m por h, entonces la distancia es 1.</p>
  <p>Pasa al siguiente elemento de la palabra humanx que es hu. ¿Cuál es la distancia de Levenshtein entre m y hu? Como el elemento contiene un solo carácter y hu contiene más de un carácter, puede estar 100% segurx de que tiene que insertar un nuevo carácter. Para transformar m en hu, primero el carácter m es reemplazado por h, y luego añade u. Para transformar m en hu, la distancia es 2.</p>
  <p>Ahora pasa al tercer elemento. ¿Cuál es la distancia entre m y hum? Hace lo mismo que arriba, pero tiene que añadir otro carácter, m, también. La distancia final entonces es 3.</p>
  <p>Continúa hasta que haya calculado la distancia entre el primer elemento de la palabra máquina, o m, y los 6 elementos de la segunda palabra humanx. Las distancias son simplemente 1, 2, 3, 4 y 5; simplemente aumentan de 1.</p>
  <p>Después de calcular las distancias entre el primer prefijo de la primera palabra y todos los prefijos de la segunda palabra, el proceso continúa calculando las distancias entre los prefijos restantes de la primera palabra y los prefijos de la segunda palabra.</p>
  <p>Sigue el proceso con má. Lo compara con los seis elementos de la palabra humanx. El primero será h. ¿Cuál es la distancia de Levenshtein entre má y h? Lo que tiene que hacer es sustituir el carácter m por h y borrar el carácter á. Entonces la distancia es 2. Pasa al siguiente elemento de la palabra humanx que es hu. ¿Cuál es la distancia de Levenshtein entre má y hu? Sustituye el carácter m por h y la letra á por u. La distancia es 2.</p>
  <p>Y así rellena la matriz.</p>
  <p>En términos de código se podría hablar de un efecto optimizador en la matriz.</p>
  <p>Se calcula el valor basado en las tres cifras más cercanas de la celda en la matriz que corresponde a los caracteres que se comparan: horizontal, vertical, diagonal.</p>
  <p>Si las letras son iguales, se elige el valor mínimo de las tres.</p>
  <p>Si las letras son distintas, se elige el valor mínimo de las tres y se añade 1.</p>
  <p>El último valor de la serie de cuentas es el que representa la distancia mínima entre las 2 palabras.</p>
  <p>En la matriz es el valor situado en la esquina inferior derecha.</p>
  <p>Finalmente es asunto de trazar el camino más breve en las transformaciones de una palabra a la otra:</p>
  <ul>
    <li>el camino diagonal tratando de caracteres diferentes y representa la substitución</li>
    <li>el camino diagonal tratando de caracteres iguales no representa ningún cambio</li>
    <li>el camino hacia la izquierda representa una inserción</li>
  </ul>
  <p>Fuente: <a href = "https://blog.paperspace.com/measuring-text-similarity-using-levenshtein-distance/">Blog Paperspace</a></p>

  <!--Code-->
  <h2>5. Código</h2>
  <!--OUTPUT SCRIPT -->
  {% for path, source in sources %}
    <h3>{{ path }}</h3>
    <pre>{{ source }}</pre>
  {% endfor %}

  <!--Credits-->
  <h2>6. Créditos</h2>
  <p>Este libro es una creación de <a href = "https://www.anaisberck.be/">Anaïs Berck</a> para <a href = "https://www.tabakalera.eus/es/agora-cemento-codigo">ÁGORA / CEMENTO / CÓDIGO</a>, un proyecto de la <a href ="https://www.tabakalera.eus/es/lekutan">Asociación Cultural LEKUTAN</a> en el <a href = "https://www.tabakalera.eus">Centro Internacional de Cultura Contemporánea Tabakalera</a>, Donostia / San Sebastián.</p>
  <p>La copia de este libro es única y el tiraje es por definición infinito.</p>

  <!--OUTPUT SCRIPT -->
  <p>Esta copia es el número {{ edition_count }} de copias descargadas.</p>
  <p>Condiciones colectivas de (re)uso (CC4r), 2021</p>
  <p>Copyleft con una diferencia: Se le invita a copiar, distribuir y modificar esta obra bajo los términos de la CC4r: <a href = "https://gitlab.constantvzw.org/unbound/cc4r">https://gitlab.constantvzw.org/unbound/cc4r</a></p>

</body>
</html>