Skip to content

Instantly share code, notes, and snippets.

@Newlifer
Created January 18, 2015 19:47
Show Gist options
  • Save Newlifer/46c76cd5a0b5ccc00eca to your computer and use it in GitHub Desktop.
Save Newlifer/46c76cd5a0b5ccc00eca to your computer and use it in GitHub Desktop.
{-# LANGUAGE OverloadedStrings #-}
import Text.Printf
import Control.Monad
import Data.Char
import Data.List
import System.IO
import Codec.Binary.UTF8.String (utf8Encode)
import qualified Data.Text.Encoding as T
levenshtein s1 s2 = last $ foldl (transform s1) [0..length s1] s2 where
transform str xs@(x:xs') c = res where
res = x + 1 : zipWith4 compute str xs xs' res
compute c' x y z = minimum [y + 1, z + 1, x + if c' == c then 0 else 1]
getLines = liftM lines . readFile
textRepresentation row = foldl (\acc y -> acc ++ (show y) ++ " ") "" row
removeNonLetters = filter isLetter
filterString :: [Char] -> [Char]
filterString a = unwords ( map removeNonLetters ( words a ) )
{-
types = [
"производство, хранение и поставки произведенного этилового спирта, в том числе денатурата"
,"производство, хранение и поставки произведенной алкогольной и спиртосодержащей пищевой продукции"
,"хранение этилового спирта, алкогольной и спиртосодержащей пищевой продукции"
,"закупка, хранение и поставки алкогольной и спиртосодержащей продукции"
,"производство, хранение и поставки спиртосодержащей непищевой продукции"
,"розничная продажа алкогольной продукции"
,"перевозки этилового спирта (в том числе денатурата) и нефасованной спиртосодержащей продукции с содержанием этилового спирта более 25 процентов объема готовой продукции"
]
-}
types = [
"производство, хранение и поставки произведенного этилового спирта, в том числе денатурата"
,"производство, хранение и поставки произведенной алкогольной и спиртосодержащей пищевой продукции"
,"хранение этилового спирта, алкогольной и спиртосодержащей пищевой продукции"
,"закупка хранение и поставки"
,"спиртосодержащей непищевой"
,"розничная"
,"перевозки этилового спирта"
]
printTuple x = printf "%s %s\n" ( textRepresentation $ fst x ) ( snd x )
singlePass :: [String] -> String -> [Int]
singlePass x y = map ( levenshtein y ) x
main = do
list <- getLines "H:\\development\\haskell\\rec\\source.txt"
let filtred_list = map filterString list
let filtred_types = map filterString types
let result = map ( singlePass filtred_types ) filtred_list
mapM_ printTuple ( sortBy ( \a b -> compare ( snd a ) ( snd b ) ) ( zip result filtred_list ) )
putStrLn "end"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment