From be3a36131c32a06cf619f382f704eae4b5eb4b5d Mon Sep 17 00:00:00 2001 From: slava Date: Sat, 17 Jun 2006 20:00:03 +0000 Subject: [PATCH] Edit distance example --- examples/levenshtein.factor | 51 +++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 examples/levenshtein.factor diff --git a/examples/levenshtein.factor b/examples/levenshtein.factor new file mode 100644 index 0000000000..60e8f1c928 --- /dev/null +++ b/examples/levenshtein.factor @@ -0,0 +1,51 @@ +! Copyright (C) 2006 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: arrays kernel math namespaces sequences test ; +IN: levenshtein + +: ( m n -- matrix ) + [ drop 0 ] map-with ; inline + +: matrix-> nth nth ; inline +: ->matrix nth set-nth ; inline + +SYMBOL: d + +: ->d ( n i j -- ) d get ->matrix ; inline +: d-> ( i j -- n ) d get matrix-> ; inline + +SYMBOL: costs + +: init-d ( str1 str2 -- ) + [ length 1+ ] 2apply 2dup d set + [ 0 over ->d ] each + [ dup 0 ->d ] each ; inline + +: compute-costs ( str1 str2 -- ) + >array [ + swap >array [ = 0 1 ? ] map-with + ] map-with costs set ; inline + +: levenshtein-step ( i j -- ) + [ 1+ d-> 1+ ] 2keep + [ >r 1+ r> d-> 1+ ] 2keep + [ d-> ] 2keep + [ costs get matrix-> + min min ] 2keep + >r 1+ r> 1+ ->d ; inline + +: levenshtein-result ( -- n ) d get peek peek ; inline + +: levenshtein ( str1 str2 -- n ) + [ + 2dup init-d + 2dup compute-costs + [ length ] 2apply [ + swap [ swap levenshtein-step ] each-with + ] each-with + levenshtein-result + ] with-scope ; + +[ 3 ] [ "sitting" "kitten" levenshtein ] unit-test +[ 3 ] [ "kitten" "sitting" levenshtein ] unit-test +[ 1 ] [ "freshpak" "freshpack" levenshtein ] unit-test +[ 1 ] [ "freshpack" "freshpak" levenshtein ] unit-test