kotoshu 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +18 -0
  4. data/CHANGELOG.md +182 -0
  5. data/CLAUDE.md +172 -0
  6. data/CODE_OF_CONDUCT.md +132 -0
  7. data/LICENSE +31 -0
  8. data/README.adoc +955 -0
  9. data/Rakefile +12 -0
  10. data/SECURITY.md +93 -0
  11. data/examples/01_basic_word_checking.rb +38 -0
  12. data/examples/02_text_document_checking.rb +77 -0
  13. data/examples/03_dictionary_backends.rb +137 -0
  14. data/examples/04_trie_data_structure.rb +146 -0
  15. data/examples/05_suggestion_algorithms.rb +239 -0
  16. data/examples/06_configuration_advanced.rb +287 -0
  17. data/examples/07_multi_language_dictionaries.rb +278 -0
  18. data/exe/kotoshu +6 -0
  19. data/lib/kotoshu/algorithms/capitalization.rb +276 -0
  20. data/lib/kotoshu/algorithms/lookup.rb +876 -0
  21. data/lib/kotoshu/algorithms/ngram_suggest.rb +270 -0
  22. data/lib/kotoshu/algorithms/permutations.rb +283 -0
  23. data/lib/kotoshu/algorithms/phonet_suggest.rb +167 -0
  24. data/lib/kotoshu/algorithms/suggest.rb +575 -0
  25. data/lib/kotoshu/algorithms.rb +14 -0
  26. data/lib/kotoshu/analyzers/semantic_analyzer.rb +295 -0
  27. data/lib/kotoshu/cache/base_cache.rb +596 -0
  28. data/lib/kotoshu/cache/cache.rb +91 -0
  29. data/lib/kotoshu/cache/frequency_cache.rb +224 -0
  30. data/lib/kotoshu/cache/language_cache.rb +454 -0
  31. data/lib/kotoshu/cache/lookup_cache.rb +166 -0
  32. data/lib/kotoshu/cache/model_cache.rb +513 -0
  33. data/lib/kotoshu/cache/suggestion_cache.rb +113 -0
  34. data/lib/kotoshu/cache.rb +40 -0
  35. data/lib/kotoshu/cli/auto_setup.rb +71 -0
  36. data/lib/kotoshu/cli/batch_reporter.rb +315 -0
  37. data/lib/kotoshu/cli/cache_command.rb +356 -0
  38. data/lib/kotoshu/cli/display_formatter.rb +431 -0
  39. data/lib/kotoshu/cli/errors.rb +36 -0
  40. data/lib/kotoshu/cli/interactive_reviewer.rb +319 -0
  41. data/lib/kotoshu/cli/language_resolver.rb +91 -0
  42. data/lib/kotoshu/cli/navigation_manager.rb +272 -0
  43. data/lib/kotoshu/cli/progress_reporter.rb +114 -0
  44. data/lib/kotoshu/cli/status_report.rb +130 -0
  45. data/lib/kotoshu/cli.rb +627 -0
  46. data/lib/kotoshu/commands/cache_command.rb +424 -0
  47. data/lib/kotoshu/commands/check_command.rb +312 -0
  48. data/lib/kotoshu/commands/model_command.rb +295 -0
  49. data/lib/kotoshu/components/passthrough_spell_checker.rb +72 -0
  50. data/lib/kotoshu/components/pos_tagger.rb +98 -0
  51. data/lib/kotoshu/components/spell_checker.rb +73 -0
  52. data/lib/kotoshu/components/synthesizer.rb +60 -0
  53. data/lib/kotoshu/components/tokenizer.rb +58 -0
  54. data/lib/kotoshu/components/whitespace_tokenizer.rb +96 -0
  55. data/lib/kotoshu/configuration/builder.rb +209 -0
  56. data/lib/kotoshu/configuration/resolver.rb +124 -0
  57. data/lib/kotoshu/configuration.rb +702 -0
  58. data/lib/kotoshu/core/exceptions.rb +165 -0
  59. data/lib/kotoshu/core/indexed_dictionary.rb +291 -0
  60. data/lib/kotoshu/core/models/affix_rule.rb +260 -0
  61. data/lib/kotoshu/core/models/result/document_result.rb +263 -0
  62. data/lib/kotoshu/core/models/result/word_result.rb +203 -0
  63. data/lib/kotoshu/core/models/word.rb +142 -0
  64. data/lib/kotoshu/core/trie/builder.rb +119 -0
  65. data/lib/kotoshu/core/trie/node.rb +94 -0
  66. data/lib/kotoshu/core/trie/trie.rb +249 -0
  67. data/lib/kotoshu/core.rb +28 -0
  68. data/lib/kotoshu/data/common_words/de.yml +1800 -0
  69. data/lib/kotoshu/data/common_words/en.yml +1215 -0
  70. data/lib/kotoshu/data/common_words/es.yml +750 -0
  71. data/lib/kotoshu/data/common_words/fr.yml +1015 -0
  72. data/lib/kotoshu/data/common_words/pt.yml +870 -0
  73. data/lib/kotoshu/data/common_words/ru.yml +484 -0
  74. data/lib/kotoshu/data/common_words_loader.rb +152 -0
  75. data/lib/kotoshu/data_structures/bloom_filter.rb +176 -0
  76. data/lib/kotoshu/debug_logger.rb +146 -0
  77. data/lib/kotoshu/debug_mode.rb +134 -0
  78. data/lib/kotoshu/defaults.rb +86 -0
  79. data/lib/kotoshu/dictionaries/catalog.rb +817 -0
  80. data/lib/kotoshu/dictionary/base.rb +237 -0
  81. data/lib/kotoshu/dictionary/cspell.rb +254 -0
  82. data/lib/kotoshu/dictionary/custom.rb +224 -0
  83. data/lib/kotoshu/dictionary/hunspell.rb +526 -0
  84. data/lib/kotoshu/dictionary/plain_text.rb +282 -0
  85. data/lib/kotoshu/dictionary/repository.rb +248 -0
  86. data/lib/kotoshu/dictionary/unified.rb +260 -0
  87. data/lib/kotoshu/dictionary/unix_words.rb +218 -0
  88. data/lib/kotoshu/documents/asciidoc_document.rb +441 -0
  89. data/lib/kotoshu/documents/document.rb +229 -0
  90. data/lib/kotoshu/documents/location.rb +139 -0
  91. data/lib/kotoshu/documents/markdown_document.rb +389 -0
  92. data/lib/kotoshu/documents/plain_text_document.rb +147 -0
  93. data/lib/kotoshu/embeddings/embedding_pipeline.rb +244 -0
  94. data/lib/kotoshu/embeddings/lru_cache.rb +233 -0
  95. data/lib/kotoshu/embeddings/onnx_runtime_model.rb +388 -0
  96. data/lib/kotoshu/embeddings/protocol.rb +83 -0
  97. data/lib/kotoshu/embeddings/protocols.rb +17 -0
  98. data/lib/kotoshu/embeddings/registry.rb +182 -0
  99. data/lib/kotoshu/embeddings/search.rb +192 -0
  100. data/lib/kotoshu/embeddings/similarity_engine.rb +248 -0
  101. data/lib/kotoshu/embeddings/similarity_search.rb +331 -0
  102. data/lib/kotoshu/embeddings/vocabulary.rb +257 -0
  103. data/lib/kotoshu/embeddings.rb +97 -0
  104. data/lib/kotoshu/fluent_checker.rb +91 -0
  105. data/lib/kotoshu/grammar/pattern_matchers/base_matcher.rb +48 -0
  106. data/lib/kotoshu/grammar/pattern_matchers/double_negative_matcher.rb +105 -0
  107. data/lib/kotoshu/grammar/pattern_matchers/possessive_context_matcher.rb +77 -0
  108. data/lib/kotoshu/grammar/pattern_matchers/vowel_sound_matcher.rb +83 -0
  109. data/lib/kotoshu/grammar/rule.rb +95 -0
  110. data/lib/kotoshu/grammar/rule_engine.rb +111 -0
  111. data/lib/kotoshu/grammar/rule_loader.rb +31 -0
  112. data/lib/kotoshu/grammar.rb +18 -0
  113. data/lib/kotoshu/integrity/audit_log.rb +88 -0
  114. data/lib/kotoshu/integrity/manifest.rb +117 -0
  115. data/lib/kotoshu/integrity/net_http.rb +46 -0
  116. data/lib/kotoshu/integrity.rb +25 -0
  117. data/lib/kotoshu/keyboard/layout.rb +115 -0
  118. data/lib/kotoshu/keyboard/layouts/azerty.rb +57 -0
  119. data/lib/kotoshu/keyboard/layouts/dvorak.rb +56 -0
  120. data/lib/kotoshu/keyboard/layouts/jcuken.rb +59 -0
  121. data/lib/kotoshu/keyboard/layouts/qwerty.rb +54 -0
  122. data/lib/kotoshu/keyboard/layouts/qwertz.rb +57 -0
  123. data/lib/kotoshu/keyboard/registry.rb +146 -0
  124. data/lib/kotoshu/keyboard.rb +60 -0
  125. data/lib/kotoshu/language/detector.rb +242 -0
  126. data/lib/kotoshu/language/identifier.rb +378 -0
  127. data/lib/kotoshu/language/languages/base.rb +256 -0
  128. data/lib/kotoshu/language/normalizer/base.rb +137 -0
  129. data/lib/kotoshu/language/registry.rb +147 -0
  130. data/lib/kotoshu/language/resources/ar/common_words.txt +6753 -0
  131. data/lib/kotoshu/language/resources/ar/confusion_sets.txt +11 -0
  132. data/lib/kotoshu/language/resources/de/common_words.txt +10003 -0
  133. data/lib/kotoshu/language/resources/de/confusion_sets.txt +246 -0
  134. data/lib/kotoshu/language/resources/en/common_words.txt +9979 -0
  135. data/lib/kotoshu/language/resources/en/confusion_sets.txt +871 -0
  136. data/lib/kotoshu/language/resources/es/common_words.txt +9992 -0
  137. data/lib/kotoshu/language/resources/es/confusion_sets.txt +17 -0
  138. data/lib/kotoshu/language/resources/fr/common_words.txt +9993 -0
  139. data/lib/kotoshu/language/resources/fr/confusion_sets.txt +76 -0
  140. data/lib/kotoshu/language/resources/pt/common_words.txt +9977 -0
  141. data/lib/kotoshu/language/resources/pt/confusion_sets.txt +18 -0
  142. data/lib/kotoshu/language/resources/ru/common_words.txt +9951 -0
  143. data/lib/kotoshu/language/resources/ru/confusion_sets.txt +5 -0
  144. data/lib/kotoshu/language/tokenizer/base.rb +170 -0
  145. data/lib/kotoshu/language/tokenizer/french_tokenizer.rb +170 -0
  146. data/lib/kotoshu/language/tokenizer/german_tokenizer.rb +41 -0
  147. data/lib/kotoshu/language/tokenizer/japanese_tokenizer.rb +60 -0
  148. data/lib/kotoshu/language/tokenizer/latin_tokenizer.rb +141 -0
  149. data/lib/kotoshu/language/tokenizer/portuguese_tokenizer.rb +160 -0
  150. data/lib/kotoshu/language/tokenizer/russian_tokenizer.rb +95 -0
  151. data/lib/kotoshu/language/tokenizer/spanish_tokenizer.rb +122 -0
  152. data/lib/kotoshu/language.rb +99 -0
  153. data/lib/kotoshu/languages/de/language.rb +546 -0
  154. data/lib/kotoshu/languages/en/language.rb +448 -0
  155. data/lib/kotoshu/languages/es/language.rb +459 -0
  156. data/lib/kotoshu/languages/fr/language.rb +493 -0
  157. data/lib/kotoshu/languages/ja/language.rb +477 -0
  158. data/lib/kotoshu/languages/pt/language.rb +423 -0
  159. data/lib/kotoshu/languages/ru/language.rb +404 -0
  160. data/lib/kotoshu/languages.rb +43 -0
  161. data/lib/kotoshu/metrics_collector.rb +222 -0
  162. data/lib/kotoshu/metrics_module.rb +110 -0
  163. data/lib/kotoshu/models/context.rb +119 -0
  164. data/lib/kotoshu/models/embedding_model.rb +182 -0
  165. data/lib/kotoshu/models/fasttext_model.rb +220 -0
  166. data/lib/kotoshu/models/nearest_neighbor.rb +87 -0
  167. data/lib/kotoshu/models/onnx_model.rb +333 -0
  168. data/lib/kotoshu/models/semantic_error.rb +165 -0
  169. data/lib/kotoshu/models/suggestion.rb +106 -0
  170. data/lib/kotoshu/models/word_embedding.rb +107 -0
  171. data/lib/kotoshu/paths.rb +53 -0
  172. data/lib/kotoshu/personal_dictionary.rb +94 -0
  173. data/lib/kotoshu/plugins/plugin.rb +61 -0
  174. data/lib/kotoshu/plugins/registry.rb +120 -0
  175. data/lib/kotoshu/project_config.rb +76 -0
  176. data/lib/kotoshu/readers/aff_data.rb +356 -0
  177. data/lib/kotoshu/readers/aff_reader.rb +375 -0
  178. data/lib/kotoshu/readers/condition_checker.rb +142 -0
  179. data/lib/kotoshu/readers/dic_reader.rb +118 -0
  180. data/lib/kotoshu/readers/file_reader.rb +347 -0
  181. data/lib/kotoshu/readers/lookup_builder.rb +299 -0
  182. data/lib/kotoshu/readers/readers.rb +6 -0
  183. data/lib/kotoshu/readers.rb +9 -0
  184. data/lib/kotoshu/resource_bundle.rb +30 -0
  185. data/lib/kotoshu/resource_manager.rb +295 -0
  186. data/lib/kotoshu/results/result.rb +165 -0
  187. data/lib/kotoshu/scripts/fasttext_to_onnx.py +275 -0
  188. data/lib/kotoshu/source_registry.rb +74 -0
  189. data/lib/kotoshu/spellchecker/parallel_checker.rb +90 -0
  190. data/lib/kotoshu/spellchecker.rb +298 -0
  191. data/lib/kotoshu/string_metrics.rb +153 -0
  192. data/lib/kotoshu/suggestions/context.rb +55 -0
  193. data/lib/kotoshu/suggestions/generator.rb +175 -0
  194. data/lib/kotoshu/suggestions/pipeline.rb +135 -0
  195. data/lib/kotoshu/suggestions/strategies/base_strategy.rb +296 -0
  196. data/lib/kotoshu/suggestions/strategies/composite_strategy.rb +140 -0
  197. data/lib/kotoshu/suggestions/strategies/edit_distance_strategy.rb +671 -0
  198. data/lib/kotoshu/suggestions/strategies/keyboard_proximity_strategy.rb +228 -0
  199. data/lib/kotoshu/suggestions/strategies/ngram_strategy.rb +130 -0
  200. data/lib/kotoshu/suggestions/strategies/phonetic_strategy.rb +329 -0
  201. data/lib/kotoshu/suggestions/strategies/semantic_strategy.rb +316 -0
  202. data/lib/kotoshu/suggestions/strategies/symspell_strategy.rb +275 -0
  203. data/lib/kotoshu/suggestions/suggestion.rb +174 -0
  204. data/lib/kotoshu/suggestions/suggestion_set.rb +238 -0
  205. data/lib/kotoshu/version.rb +5 -0
  206. data/lib/kotoshu.rb +493 -0
  207. data/script/validate_all_dictionaries.rb +444 -0
  208. data/sig/kotoshu.rbs +4 -0
  209. data/test_oop.rb +79 -0
  210. metadata +298 -0
@@ -0,0 +1,484 @@
1
+ # Russian common words by frequency
2
+ # Source: Russian Wikipedia Corpus, Russian National Corpus
3
+ # Last updated: 2025-01-15
4
+
5
+ metadata:
6
+ language: ru
7
+ source: Russian Wikipedia Corpus, Russian National Corpus
8
+ source_url: https://en.wiktionary.org/wiki/Wiktionary:Frequency_lists/Russian
9
+ total_words: 146269
10
+ last_updated: 2025-01-15
11
+ license: CC-BY-SA 4.0
12
+
13
+ tiers:
14
+ top_50:
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
+ top_200:
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
+ - примерно
142
+ - точно
143
+ - именно
144
+ - как раз
145
+ - именно
146
+ - прямо
147
+ - тут
148
+ - здесь
149
+ - там
150
+ - туда
151
+ - сюда
152
+ - отсюда
153
+ - оттуда
154
+ - везде
155
+ - нигде
156
+ - всюду
157
+ - негде
158
+ - где-то
159
+ - куда-то
160
+ - когда-то
161
+ - когда-нибудь
162
+ - иногда
163
+ - иногда
164
+ - иногда
165
+ - всегда
166
+ - никогда
167
+ - часто
168
+ - редко
169
+ - обычно
170
+ - вообще
171
+ - частности
172
+ - особенно
173
+ - главным образом
174
+ - прежде всего
175
+ - в основном
176
+ - по-прежнему
177
+ - по-прежнему
178
+ - до сих пор
179
+ - пока
180
+ - пока
181
+ - пока не
182
+ - в то время как
183
+ - в то время
184
+ - между тем
185
+ - тем временем
186
+ - тем не менее
187
+ - однако
188
+ - но
189
+ - зато
190
+ - же
191
+ - то есть
192
+ - а именно
193
+ - например
194
+ - скажем
195
+ - допустим
196
+ - предположим
197
+ - видимо
198
+ - по-видимому
199
+ - оказывается
200
+ - следовательно
201
+ - таким образом
202
+ - итак
203
+ - кстати
204
+ - между прочим
205
+ - во-первых
206
+ - во-вторых
207
+ - в-третьих
208
+ - с одной стороны
209
+ - с другой стороны
210
+ - кстати сказать
211
+ - разумеется
212
+ - конечно
213
+ - бесспорно
214
+ - несомненно
215
+ - безусловно
216
+ - без сомнения
217
+ - в самом деле
218
+ - в самом деле
219
+ - действительно
220
+ - на самом деле
221
+ - в действительности
222
+ - по существу
223
+ - в сущности
224
+ - по сути
225
+ - в конечном счете
226
+ - в итоге
227
+ - в результате
228
+ - вследствие
229
+ - благодаря
230
+ - из-за
231
+ - по причине
232
+ - в силу
233
+ - на основании
234
+ - согласно
235
+ - в соответствии
236
+ - вопреки
237
+ - несмотря на
238
+ - несмотря на то что
239
+ - хотя
240
+ - пусть
241
+ - даром что
242
+ - даже если
243
+ - если бы
244
+ - в случае если
245
+ - при условии что
246
+ - в том случае
247
+ - иначе
248
+ - иначе говоря
249
+ - другими словами
250
+ - лучше сказать
251
+ - точнее
252
+ - собственно
253
+ - впрочем
254
+ - наконец
255
+ - в конце концов
256
+ - в заключение
257
+ - словом
258
+ - короче говоря
259
+ - одним словом
260
+
261
+ top_1000:
262
+ - слово
263
+ - буква
264
+ - текст
265
+ - предложение
266
+ - фраза
267
+ - выражение
268
+ - термин
269
+ - понятие
270
+ - идея
271
+ - мысль
272
+ - мнение
273
+ - взгляд
274
+ - точка зрения
275
+ - позиция
276
+ - отношение
277
+ - подход
278
+ - способ
279
+ - метод
280
+ - прием
281
+ - средство
282
+ - инструмент
283
+ - оборудование
284
+ - аппарат
285
+ - механизм
286
+ - система
287
+ - структура
288
+ - организация
289
+ - учреждение
290
+ - предприятие
291
+ - компания
292
+ - фирма
293
+ - корпорация
294
+ - организация
295
+ - объединение
296
+ - союз
297
+ - ассоциация
298
+ - общество
299
+ - сообщество
300
+ - группа
301
+ - коллектив
302
+ - команда
303
+ - кружок
304
+ - секция
305
+ - отдел
306
+ - отделение
307
+ - подразделение
308
+ - филиал
309
+ - представительство
310
+ - агентство
311
+ - бюро
312
+ - комитет
313
+ - комиссия
314
+ - совет
315
+ - правление
316
+ - дирекция
317
+ - администрация
318
+ - управление
319
+ - министерство
320
+ - ведомство
321
+ - департамент
322
+ - служба
323
+ - орган
324
+ - власть
325
+ - государство
326
+ - страна
327
+ - регион
328
+ - область
329
+ - район
330
+ - город
331
+ - поселок
332
+ - деревня
333
+ - село
334
+ - место
335
+ - местность
336
+ - территория
337
+ - зона
338
+ - район
339
+ - округ
340
+ - район
341
+ - край
342
+ - пределы
343
+ - границы
344
+ - рубеж
345
+ - водораздел
346
+ - поворот
347
+ - пункт
348
+ - точка
349
+ - стадия
350
+ - этап
351
+ - фаза
352
+ - период
353
+ - эпоха
354
+ - эра
355
+ - время
356
+ - год
357
+ - сезон
358
+ - месяц
359
+ - неделя
360
+ - день
361
+ - сутки
362
+ - вечер
363
+ - утро
364
+ - ночь
365
+ - полдень
366
+ - полночь
367
+ - рассвет
368
+ - закат
369
+ - сумерки
370
+ - темнота
371
+ - свет
372
+ - тьма
373
+ - ясность
374
+ - ясность
375
+ - понятность
376
+ - понятность
377
+ - простота
378
+ - сложность
379
+ - трудность
380
+ - легкость
381
+ - возможность
382
+ - невозможность
383
+ - способность
384
+ - неспособность
385
+ - умение
386
+ - навык
387
+ - мастерство
388
+ - искусство
389
+ - ремесло
390
+ - профессия
391
+ - специальность
392
+ - квалификация
393
+ - образование
394
+ - воспитание
395
+ - обучение
396
+ - подготовка
397
+ - тренировка
398
+ - практика
399
+ - опыт
400
+ - знание
401
+ - понимание
402
+ - осознание
403
+ - осознавание
404
+ - познание
405
+ - изучение
406
+ - исследование
407
+ - анализ
408
+ - синтез
409
+ - оценка
410
+ - оценивание
411
+ - оценивание
412
+ - суждение
413
+ - мнение
414
+ - решение
415
+ - вывод
416
+ - заключение
417
+ - умозаключение
418
+ - заключение
419
+ - аргумент
420
+ - довод
421
+ - доказательство
422
+ - подтверждение
423
+ - опровержение
424
+ - утверждение
425
+ - отрицание
426
+ - признание
427
+ - отрицание
428
+ - согласие
429
+ - согласие
430
+ - отказ
431
+ - отказ
432
+ - принятие
433
+ - принятие
434
+ - принятие
435
+ - одобрение
436
+ - неодобрение
437
+ - поддержка
438
+ - противодействие
439
+ - сопротивление
440
+ - помощь
441
+ - содействие
442
+ - пособие
443
+ - поддержка
444
+ - подмога
445
+ - услуга
446
+ - одолжение
447
+ - любезность
448
+ - вежливость
449
+ - учтивость
450
+ - обходительность
451
+ - галантность
452
+ - приветливость
453
+ - радушие
454
+ - гостеприимство
455
+ - дружелюбие
456
+ - дружба
457
+ - приятельство
458
+ - товарищество
459
+ - партнёрство
460
+ - сотрудничество
461
+ - взаимодействие
462
+ - связь
463
+ - отношения
464
+ - общение
465
+ - беседа
466
+ - разговор
467
+ - диалог
468
+ - переговоры
469
+ - дискуссия
470
+ - обсуждение
471
+ - спор
472
+ - полемика
473
+ - дебаты
474
+ - прения
475
+ - дебаты
476
+ - диспут
477
+ - диспут
478
+ - прения
479
+ - дебаты
480
+ - дебаты
481
+ - дебаты
482
+ - дебаты
483
+ - дебаты
484
+ - дебаты
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require 'set'
5
+ require 'fileutils'
6
+
7
+ module Kotoshu
8
+ module Data
9
+ # Loads and provides access to common words data for all supported languages.
10
+ #
11
+ # This loader supports loading from:
12
+ # 1. Local YAML files in lib/kotoshu/data/common_words/{language}.yml
13
+ # 2. Frequency.json files downloaded from GitHub (via LanguageCache)
14
+ #
15
+ # Each language file contains:
16
+ # - metadata: Source information, word count, last updated
17
+ # - tiers: Top 50, top 200, and top 1000 most common words
18
+ #
19
+ # @example Loading English common words
20
+ # loader = CommonWordsLoader.new
21
+ # tiers = loader.load('en')
22
+ # tiers[:top_50].include?('the') # => true
23
+ #
24
+ # @example Getting available languages
25
+ # CommonWordsLoader.available_languages # => ['de', 'en', 'es', 'fr', 'pt', 'ru']
26
+ #
27
+ # @example Loading with tier specification
28
+ # loader.load('en', tier: :top_200) # Combines top_50 + top_200
29
+ class CommonWordsLoader
30
+ # Default data directory (local YAML files)
31
+ DATA_DIR = File.expand_path('../common_words', __FILE__).freeze
32
+
33
+ class << self
34
+ # Load common words for a language.
35
+ #
36
+ # @param language_code [String] ISO 639-1 language code (e.g., 'en', 'de')
37
+ # @param tier [Symbol] Tier level: :top_50, :top_200, or :top_1000
38
+ # @return [Hash{Symbol => Set}] Hash with :tiers (tier sets) and :metadata
39
+ def load(language_code, tier: :top_1000)
40
+ yaml_file = File.join(DATA_DIR, "#{language_code}.yml")
41
+
42
+ if File.exist?(yaml_file)
43
+ load_from_yaml(yaml_file, tier)
44
+ else
45
+ {
46
+ tiers: empty_tiers,
47
+ metadata: { source: 'none', language: language_code }
48
+ }
49
+ end
50
+ end
51
+
52
+ # Load from GitHub frequency.json (Phase 2 integration).
53
+ # Also handles Kelly frequency-list format from kotoshu/frequency-list-kelly
54
+ #
55
+ # @param language_code [String] ISO 639-1 language code
56
+ # @param frequency_path [String] Path to frequency.json file
57
+ # @return [Hash{Symbol => Set}] Hash with :tiers and :metadata
58
+ def load_from_frequency_file(frequency_path)
59
+ return { tiers: empty_tiers, metadata: {} } unless File.exist?(frequency_path)
60
+
61
+ data = JSON.parse(File.read(frequency_path, encoding: 'UTF-8'))
62
+
63
+ # Handle Kelly format: tiers[tier_name]['words']
64
+ # Check if format has nested 'words' key (Kelly format)
65
+ has_words_key = data.dig('tiers', 'top_50', 'words')
66
+
67
+ tiers = if has_words_key
68
+ # Kelly format: data['tiers']['top_50']['words']
69
+ {
70
+ top_50: Set.new(data.dig('tiers', 'top_50', 'words') || []),
71
+ top_200: Set.new(
72
+ (data.dig('tiers', 'top_50', 'words') || []) +
73
+ (data.dig('tiers', 'top_200', 'words') || [])
74
+ ),
75
+ top_1000: Set.new(
76
+ (data.dig('tiers', 'top_50', 'words') || []) +
77
+ (data.dig('tiers', 'top_200', 'words') || []) +
78
+ (data.dig('tiers', 'top_1000', 'words') || [])
79
+ )
80
+ }
81
+ else
82
+ # Legacy format: data['tiers']['top_50'] is array
83
+ {
84
+ top_50: Set.new(data.dig('tiers', 'top_50') || []),
85
+ top_200: Set.new((data.dig('tiers', 'top_50') || []) + (data.dig('tiers', 'top_200') || [])),
86
+ top_1000: Set.new(
87
+ (data.dig('tiers', 'top_50') || []) +
88
+ (data.dig('tiers', 'top_200') || []) +
89
+ (data.dig('tiers', 'top_1000') || [])
90
+ )
91
+ }
92
+ end
93
+
94
+ metadata = data['metadata'] || {}
95
+
96
+ { tiers: tiers, metadata: metadata }
97
+ end
98
+
99
+ # Get list of languages with local YAML files.
100
+ #
101
+ # @return [Array<String>] List of available language codes
102
+ def available_languages
103
+ Dir.glob(File.join(DATA_DIR, '*.yml')).map { |f| File.basename(f, '.yml') }
104
+ end
105
+
106
+ # Check if a language has local data.
107
+ #
108
+ # @param language_code [String] ISO 639-1 language code
109
+ # @return [Boolean] True if data file exists
110
+ def available?(language_code)
111
+ File.exist?(File.join(DATA_DIR, "#{language_code}.yml"))
112
+ end
113
+
114
+ private
115
+
116
+ def load_from_yaml(yaml_file, requested_tier)
117
+ data = YAML.unsafe_load_file(yaml_file)
118
+
119
+ # Get all tiers from the data
120
+ yaml_tiers = data['tiers'] || {}
121
+
122
+ # Build cumulative tiers based on requested level
123
+ tier_50 = Set.new(yaml_tiers['top_50'] || [])
124
+ tier_200 = Set.new((yaml_tiers['top_50'] || []) + (yaml_tiers['top_200'] || []))
125
+ tier_1000 = Set.new(
126
+ (yaml_tiers['top_50'] || []) +
127
+ (yaml_tiers['top_200'] || []) +
128
+ (yaml_tiers['top_1000'] || [])
129
+ )
130
+
131
+ tiers = {
132
+ top_50: tier_50,
133
+ top_200: tier_200,
134
+ top_1000: tier_1000
135
+ }
136
+
137
+ metadata = data['metadata'] || {}
138
+
139
+ { tiers: tiers, metadata: metadata }
140
+ end
141
+
142
+ def empty_tiers
143
+ {
144
+ top_50: Set.new,
145
+ top_200: Set.new,
146
+ top_1000: Set.new
147
+ }
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end