blob: b075993b87dd175797b4732a96599ca8ab8dc1db (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
(import-macros {: map : filter} :lib.macro)
(local array (require :lib.array))
(local libstr (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))
(libstr.split string " "))
" "))
(if (~= result string)
result
nil))
{: guess}
|