#lang scribble/doc
@; THIS FILE IS GENERATED
@(require scribble/manual)
@(require (for-label (planet neil/levenshtein:1:3)))
@title[#:version "0.6"]{@bold{levenshtein}: Levenshtein Distance Metric in Scheme}
@author{Neil Van Dyke}


License: @seclink["Legal" #:underline? #f]{LGPL 3} @(hspace 1) Web: @link["http://www.neilvandyke.org/levenshtein-scheme/" #:underline? #f]{http://www.neilvandyke.org/levenshtein-scheme/}

@defmodule[(planet neil/levenshtein:1:3)]

      

@section{Introduction}


      

This is a Scheme implementation of the @italic{Levenshtein Distance} algorithm, which is an @italic{edit distance} metric of string similarity, due to Vladimir Levenshtein.  The Levenshtein Distance is a function of two strings that represents a count of single-character insertions, deletions, and substitions that will change the first string to the second.  More information is available in @link["http://www.nist.gov/dads/HTML/Levenshtein.html"]{NIST DADS} and the Michael Gilleland article, ``@link["http://www.merriampark.com/ld.htm"]{Levenshtein Distance in Three Flavors}.''


      

This implementation is modeled after a @link["http://www.mgilleland.com/ld/ldperl2.htm"]{space-efficient Perl implementation} by Jorge Mas Trullenque.  It has been written in R5RS Scheme, and extended to support heterogeneous combinations of Scheme types (strings, lists, vectors), user-supplied predicate functions, and optionally reusable scratch vectors.


    
      

@section{Basic Comparisons}


      

In the current implementation, all comparisons are done internally via vectors.


      

@defproc[(vector-levenshtein/predicate/get-scratch (a any/c) (b any/c) (pred any/c) (get-scratch any/c)) any/c]{
          

Few, if any, programs will use this procedure directly.  This is like @tt{vector-levenshtein/predicate}, but allows @schemevarfont{get-scratch} to be specified.  @schemevarfont{get-scratch} is a procedure of one term, @emph{n}, that yields a vector of length @emph{n} or greater, which is used for record-keeping during execution of the Levenshtein algorithm. @tt{make-vector} can be used for @schemevarfont{get-scratch}, although some programs comparing a large size or quantity of vectors may wish to reuse a record-keeping vector, rather than each time allocating a new one that will need to be garbage-collected.


        }

      

@defproc[(vector-levenshtein/predicate (a any/c) (b any/c) (pred any/c)) any/c]{}


@defproc[(vector-levenshtein/eq (a any/c) (b any/c)) any/c]{}


@defproc[(vector-levenshtein/eqv (a any/c) (b any/c)) any/c]{}


@defproc[(vector-levenshtein/equal (a any/c) (b any/c)) any/c]{}


@defproc[(vector-levenshtein (a any/c) (b any/c)) any/c]{
          

Calculate the Levenshtein Distance of vectors @schemevarfont{a} and @schemevarfont{b}. @schemevarfont{pred} is the predicate procedure for determining if two elements are equal.  The @tt{/eq}, @tt{/eqv}, and @tt{/equal} variants correspond to the standard equivalence predicates, @tt{eq?}, @tt{eqv?}, and @tt{equal?}.  @tt{vector-levenshtein} is an alias for @tt{vector-levenshtein/equal}.


          

@SCHEMEBLOCK[
(vector-levenshtein '#(6 6 6) '#(6 35 6 24 6 32)) ==> 3
]


        }

      

@defproc[(list-levenshtein/predicate (a any/c) (b any/c) (pred any/c)) any/c]{}


@defproc[(list-levenshtein/eq (a any/c) (b any/c)) any/c]{}


@defproc[(list-levenshtein/eqv (a any/c) (b any/c)) any/c]{}


@defproc[(list-levenshtein/equal (a any/c) (b any/c)) any/c]{}


@defproc[(list-levenshtein (a any/c) (b any/c)) any/c]{
          

Calculate the Levenshtein Distance of lists @schemevarfont{a} and @schemevarfont{b}. @schemevarfont{pred} is the predicate procedure for determining if two elements are equal.  The @tt{/eq}, @tt{/eqv}, and @tt{/equal} variants correspond to the standard equivalence predicates, @tt{eq?}, @tt{eqv?}, and @tt{equal?}.  @tt{list-levenshtein} is an alias for @tt{list-levenshtein/equal}.  Note that comparison of lists is less efficient than comparison of vectors.


          

@SCHEMEBLOCK[
(list-levenshtein/eq '(b c e x f y) '(a b c d e f)) ==> 4
]


        }

      

@defproc[(string-levenshtein (a any/c) (b any/c)) any/c]{
          

Calculate the Levenshtein Distance of strings @schemevarfont{a} and @schemevarfont{b}.


          

@SCHEMEBLOCK[
(string-levenshtein "adresse" "address") ==> 2
]


        }

    
      

@section{Type-Coercing Comparisons}


      

Procedures @tt{levenshtein} and @tt{levenshtein/predicate} provide a convenient interface for comparing a combination of vectors, lists, and strings, the types of which might not be known until runtime.


      

@defproc[(levenshtein/predicate (a any/c) (b any/c) (pred any/c)) any/c]{
          

Calculates the Levenshtein Distance of two objects @schemevarfont{a} and @schemevarfont{b}, which are vectors, lists, or strings.  @schemevarfont{a} and @schemevarfont{b} need not be of the same type.  @schemevarfont{pred} is the element equivalence predicate used.


          

@SCHEMEBLOCK[
(levenshtein/predicate '#(#\A #\B #\C #\D)
                       "aBXcD"
                       char-ci=?)
==> 1
]


        }

      

@defproc[(levenshtein (a any/c) (b any/c)) any/c]{
          

Calculate the levenshtein distance of @schemevarfont{a} and @schemevarfont{b}, in a similar manner as using @tt{levenshtein/predicate} with @tt{equal?} as the predicate.


          

@SCHEMEBLOCK[
(define g '#(#\g #\u #\m #\b #\o))

(levenshtein g "gambol")  ==> 2
(levenshtein g "dumbo")   ==> 1
(levenshtein g "umbrage") ==> 5
]


        }

    
      

@section{History}


      

@itemize[

@item{Version 0.6 --- 2009-03-14 -- PLaneT @tt{(1 3)}
            

Documentation fixes.


          }


@item{Version 0.5 --- 2009-02-24 -- PLaneT @tt{(1 2)}
            

License is now LGPL 3.  Tests moved out of main file.  Converted to author's new Scheme administration system.


          }


@item{Version 0.4 --- 2005-07-10 -- PLaneT @tt{(1 1)}
            

Added Testeez tests.


          }


@item{Version 0.3 --- 2005-07-09 -- PLaneT @tt{(1 0)}
            

PLaneT release, and minor documentation changes.


          }


@item{Version 0.2 --- 2004-07-06
            

Documentation changes.


          }


@item{Version 0.1 --- 2004-05-13
            

First release.  Tested only lightly, and today @emph{is} the 13th, so @emph{caveat emptor}.


          }



]


    

@section[#:tag "Legal"]{Legal}



Copyright (c) 2004--2009 Neil Van Dyke.  This program is Free Software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License (LGPL 3), or (at your option) any later version.  This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose.  See http://www.gnu.org/licenses/ for details.  For other licenses and consulting, please contact the author.

