(import-macros {: map : filter} :lib.macro) (local array (require :lib.array)) (local str (require :lib.string)) (local {: must} (require :lib.utils)) (local vocabulary ["агар" "агарвуд" "агат" "али" "антиквариат" "ань" "аравана" "арован" "аромат" "архат" "бабочка" "бабочки" "базальт" "бай" "бакелит" "бамбук" "бамбуковая" "бан" "банка" "бао" "беззаботный" "бекас" "белая" "белый" "бин" "бирюза" "блин" "блюдо" "бодхи" "боковая" "большая" "большое" "большой" "борец" "браслет" "бронза" "будда" "будды" "булан" "бусин" "бусина" "бутылка" "бык" "быки" "бэй" "ваза" "ван" "вань" "великий" "венге" "весна" "ветке" "винил" "воды" "выдвижным" "высокотемпературный" "высший" "габа" "гайвань" "ган" "гао" "гармония" "гималайский" "гинкго" "глаз" "глазурь" "глина" "глины" "год" "гои" "голубая" "гор" "гора" "горах" "горный" "горшок" "горы" "грамм" "гранат" "гриб" "гуа" "гуан" "гуанси" "гуань" "гуй" "гун" "гунтин" "дан" "дань" "дао" "даос" "дары" "два" "денежная" "дерева" "деревня" "дерево" "деревьев" "деревянная" "деревянным" "дети" "дикий" "дин" "диск" "для" "дном" "долголетие" "долголетия" "доска" "драгоценная" "дракон" "дракона" "дровяной" "дуань" "дуаньни" "дун" "дух" "дэхуа" "дянь" "жаба" "жезл" "желтая" "жемчужиной" "жен" "жень" "жоу" "журавли" "журавль" "заваривания" "заварочная" "завертка" "затерянные" "заяц" "зеленая" "зеленый" "земли" "знакомство" "золота" "золотая" "золотистая" "золото" "золотой" "золотом" "золотые" "золотым" "иглы" "игра" "иероглиф" "иероглифы" "изящество" "или" "император" "инкрустацией" "инструмент" "инструментов" "инструменты" "инь" "исинская" "исинский" "исинской" "йоу" "камень" "камфорный" "капля" "карпы" "каштановая" "квадрат" "квадратная" "кварц" "кедр" "керамика" "керамики" "киноварная" "киноварь" "кипячения" "кирпич" "кисет" "кисть" "китайский" "классика" "коала" "кобальт" "кобальтовый" "колба" "колбы" "коленце" "комплект" "консоль" "корень" "корзина" "коричневая" "коробка" "коробочка" "кость" "кот" "котик" "краб" "красавица" "красная" "красного" "красное" "красные" "красный" "креветка" "кролик" "круг" "круглым" "кружка" "крышкой" "крышку" "куан" "кувшин" "куй" "кун" "купаж" "курильница" "лак" "лаконичная" "лан" "лань" "лао" "латунь" "лев" "лед" "лес" "леса" "лесной" "летучая" "летучие" "лин" "линчжи" "линь" "линьцан" "лист" "листе" "листья" "лопаточка" "лоск" "лотос" "лотоса" "лотосе" "лотосом" "лотосы" "лошадей" "лошадь" "лун" "лунная" "лунный" "лягушка" "лян" "магнолия" "май" "малая" "малый" "мальчик" "мандарине" "мао" "маофэн" "мастер" "матча" "медная" "медь" "мей" "меняющая" "металл" "мешочек" "мин" "мини" "мистер" "монах" "монетами" "моша" "муравей" "мыши" "мышь" "мэй" "мэн" "мэнку" "мэнхай" "набор" "нака" "нан" "нань" "наньно" "наработанный" "нарцисс" "нефрит" "нож" "ножках" "ночь" "нун" "обезьян" "обезьяны" "обжиг" "облака" "облако" "овал" "огнеупорная" "огнеупорного" "орех" "орнамент" "орхидеи" "орхидея" "пакет" "палисандр" "палисандра" "панда" "пао" "пара" "пейзаж" "первый" "перламутром" "персик" "персики" "петух" "печать" "пиал" "пиала" "пин" "пион" "пионы" "плант" "пластиковым" "плато" "под" "подарочная" "поддоном" "поднос" "подносом" "подсвечник" "подставка" "подставкой" "познания" "полный" "полотенце" "посуды" "поталь" "походный" "предмет" "предметов" "премиум" "пресс" "пруд" "прямоугольная" "птица" "птицы" "пурпур" "путь" "пуэр" "пяо" "пятнистый" "работы" "размер" "рассыпной" "растительный" "резьба" "рецепт" "рог" "розовый" "роспись" "россия" "руб" "рубин" "ручка" "ручкой" "ручная" "рыба" "рыбка" "рыжая" "сад" "сандал" "сбор" "свет" "светлая" "светлый" "свинка" "семена" "серая" "серебро" "серый" "сиборидаси" "сила" "син" "синий" "сито" "ситом" "скульптура" "слив" "слива" "сливник" "сливы" "слитком" "слон" "снежная" "собака" "сорт" "сосна" "сосны" "сосуд" "спирали" "стакан" "сталь" "старая" "старый" "старых" "статуэтка" "стекла" "стекло" "стеклянная" "стикер" "стикерпак" "стиль" "сто" "стол" "столик" "сумка" "сумо" "сун" "сухого" "счастливая" "счастье" "сюэ" "сян" "сяо" "тай" "тайвань" "тан" "танская" "тань" "темная" "термос" "тигр" "тин" "ткань" "точа" "трав" "трапеция" "треножник" "три" "трон" "тун" "тушечница" "тыква" "тьен" "тюльпан" "тяоша" "узор" "улун" "фан" "фаньгу" "фарфор" "фарфоровая" "феникс" "фигурка" "фиолетовый" "форма" "фудин" "футболка" "фуцзянь" "фэй" "фэйчжоу" "фэн" "хай" "хао" "хотей" "хотэй" "хранения" "хризантема" "хрусталь" "хуа" "хуан" "хун" "хунни" "хурма" "хэй" "хэйтан" "хэтян" "цвет" "цветов" "цветок" "цветочный" "цветы" "цельная" "церемонии" "цзи" "цзин" "цзингу" "цзиндэчжень" "цзиндэчжэнь" "цзинмай" "цзинь" "цзиньдэчжэнь" "цзу" "цзун" "цзы" "цзытан" "цзю" "цзюнь" "цзя" "цзянь" "цзяньшуй" "цзяньшуйская" "цикада" "цин" "цинхуа" "циньчжоу" "цун" "цяо" "чабань" "чаем" "чай" "чайная" "чайник" "чайника" "чайница" "чайное" "чайной" "чайные" "чайный" "чайных" "чаньчжи" "чаочжоу" "чато" "чахай" "чахэ" "чаша" "чашка" "чашки" "чая" "черепаха" "черный" "черпак" "четки" "чжан" "чжен" "чжень" "чжи" "чжу" "чжун" "чжэн" "чжэнь" "чин" "чун" "чунь" "чхин" "чхэн" "чэн" "чэнь" "шай" "шайхун" "шан" "шань" "шар" "шен" "шило" "шипяо" "шкаф" "шнурок" "шоу" "шуй" "шуэй" "шу" "шэн" "щипцы" "электрический" "юндэ" "юнь" "юньнань" "янтарь" "янь"]) (fn levenshtein [str1 str2] (local len1 (must (luna.utf8.len str1))) (local len2 (must (luna.utf8.len str2))) (local matrix []) (var cost 0) (if (= len1 0) len2 (= len2 0) len1 (= str1 str2) 0 (< 2 (math.abs (- len2 len1))) (math.max len2 len1) ;; else (do (for [i 0 len1] (tset matrix i {}) (tset (. matrix i) 0 i)) (for [j 0 len2] (tset (. matrix 0) j j)) (for [i 1 len1] (for [j 1 len2] (if (= (must (luna.utf8.sub str1 i 1)) (must (luna.utf8.sub str2 j 1))) (set cost 0) (set cost 1)) (tset (. matrix i) j (math.min (+ (. matrix (- i 1) j) 1) (+ (. matrix i (- j 1)) 1) (+ (. matrix (- i 1) (- j 1)) cost))))) (. matrix len1 len2)))) (fn guess [string] (local result (array.join (map (fn [_ token] (local index (map (fn [_ v] {:word v :distance (levenshtein token v)}) vocabulary)) (local sorted-index (array.sort index #(< $1.distance $2.distance))) (local most-similar (. sorted-index 1)) (if (< most-similar.distance 3) most-similar.word token)) (str.split string " ")) " ")) (if (~= result string) result nil)) {: guess}