Хабрахабр

ANYKS Spell-checker

train.json

, "locale": "en_US.UTF-8", "smoothing": "wittenbell", "pilots": ["а","у","в","о","с","к","б","и","я","э","a","i","o","e","g"], "w-bin": "./dictionary/3-single.asc", "r-abbr": "./output/alm.abbr", "r-vocab": "./output/alm.vocab", "r-arpa": "./output/alm.arpa", "abbrs": "./texts/abbrs/abbrs.txt", "goodwords": "./texts/whitelist/words.txt", "badwords": "./texts/blacklist/garbage.txt", "alters": "./texts/alters/yoficator.txt", "upwords": "./texts/words/upp", "mix-restwords": "./texts/similars/letters.txt", "alphabet": "абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz", "bin-code": "ru", "bin-name": "Russian", "bin-author": "You name", "bin-copyright": "You company LLC", "bin-contacts": "site: https://example.com, e-mail: info@example.com", "bin-lictype": "MIT", "bin-lictext": "... License text ...", "embedding-size": 28, "embedding": { "а": 0, "б": 1, "в": 2, "г": 3, "д": 4, "е": 5, "ё": 5, "ж": 6, "з": 7, "и": 8, "й": 8, "к": 9, "л": 10, "м": 11, "н": 12, "о": 0, "п": 13, "р": 14, "с": 15, "т": 16, "у": 17, "ф": 18, "х": 19, "ц": 20, "ч": 21, "ш": 21, "щ": 21, "ъ": 22, "ы": 23, "ь": 22, "э": 5, "ю": 24, "я": 25, "<": 26, ">": 26, "~": 26, "-": 26, "+": 26, "=": 26, "*": 26, "/": 26, ":": 26, "%": 26, "|": 26, "^": 26, "&": 26, "#": 26, "'": 26, "\\": 26, "0": 27, "1": 27, "2": 27, "3": 27, "4": 27, "5": 27, "6": 27, "7": 27, "8": 27, "9": 27, "a": 0, "b": 2, "c": 15, "d": 4, "e": 5, "f": 18, "g": 3, "h": 12, "i": 8, "j": 6, "k": 9, "l": 10, "m": 11, "n": 12, "o": 0, "p": 14, "q": 13, "r": 14, "s": 15, "t": 16, "u": 24, "v": 21, "w": 22, "x": 19, "y": 17, "z": 7 }}

$ ./asc -r-json ./train.json

  • size — Мы используем N-граммы длиной 3
  • debug — Выводим индикатор обучения опечаточника
  • threads — Для сборки используем все доступные ядра
  • confidence — Разрешаем загружать данные из ARPA так-как они есть, без перетокенизации
  • mixed-dicts — Разрешаем исправлять слова с замещёнными буквами из других языков
  • alter — Альтернативные буквы (буквы которые замещают другие буквы в словаре, в нашем случае, это — буква «Ё»)
  • locale — Устанавливаем локаль окружения (можно не указывать)
  • smoothing — Используем алгоритм сглаживания wittenbell (на данном этапе он не применяется, но какой-то алгоритм сглаживания указать нужно)
  • pilots — Устанавливаем список пилотных слов (слова состоящие из одной буквы)
  • w-bin — Устанавливаем адрес для сохранения бинарного контейнера
  • r-abbr — Указываем каталог с файлами, собранных суффиксов цифровых аббревиатур на предыдущих этапах
  • r-vocab — Указываем файл словаря, собранного на предыдущих этапах
  • r-arpa — Указываем файл ARPA, собранный на предыдущем этапе
  • abbrs — Используем в обучении, общеупотребимые аббревиатуры, такие как (США, ФСБ, КГБ ...)
  • goodwords — Используем заранее подготовленный белый список слов
  • badwords — Используем заранее подготовленный чёрный список слов
  • alters — Используем файл со словами содержащими альтернативные буквы, которые используются всегда однозначно (синтаксис файла аналогичен списку похожих букв в разных алфавитах)
  • upwords — Используем файл со списком слов, которые всегда употребляются с заглавной буквы (названия, имена, фамилии...)
  • mix-restwords — Используем файл с похожими символами разных языков
  • alphabet — Указываем алфавит используемый при обучении (алфавит всегда должен быть указан один и тот же)
  • bin-code — Устанавливаем код языка в словаре
  • bin-name — Устанавливаем название словаря
  • bin-author — Устанавливаем имя автора словаря
  • bin-copyright — Устанавливаем копирайт словаря
  • bin-contacts — Устанавливаем контактные данные автора словаря
  • bin-lictype — Устанавливаем тип лицензии словаря
  • bin-lictext — Устанавливаем текст лицензии словаря
  • embedding-size — Устанавливаем размер блока внутреннего эмбеддинга
  • embedding — Устанавливаем параметры блока внутреннего эмбеддинга (не обязательно, влияет на точность подбора кандидатов)

Версия на Python

import asc # Мы собираем N-граммы длиной 3asc.setSize(3)# Для сборки используем все доступные ядраasc.setThreads(0)# Устанавливаем локаль окружения (можно не указывать)asc.setLocale("en_US.UTF-8") # Разрешаем исправлять регистр у слов в начале предложенийasc.setOption(asc.options_t.uppers)# Разрешаем хранить токен <unk> в языковой моделиasc.setOption(asc.options_t.allowUnk)# Выполняем сброс значения частоты токена <unk> в языковой моделиasc.setOption(asc.options_t.resetUnk)# Разрешаем исправлять слова с замещенными буквами из других языковasc.setOption(asc.options_t.mixDicts)# Разрешаем загружать данные из ARPA так-как они есть, без перетокенизацииasc.setOption(asc.options_t.confidence) # Указываем алфавит используемый при обучении (алфавит всегда должен быть указан один и тот же)asc.setAlphabet("абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz")# Указываем список пилотных слов (слова которые состоят из одной буквы)asc.setPilots(["а","у","в","о","с","к","б","и","я","э","a","i","o","e","g"])# Устанавливаем похожие символы разных языковasc.setSubstitutes({'p':'р','c':'с','o':'о','t':'т','k':'к','e':'е','a':'а','h':'н','x':'х','b':'в','m':'м'}) # Загружаем файл заранее подготовленный белый список словf = open('./texts/whitelist/words.txt')for word in f.readlines(): word = word.replace("\n", "") asc.addGoodword(word)f.close() # Загружаем файл заранее подготовленный чёрный список словf = open('./texts/blacklist/garbage.txt')for word in f.readlines(): word = word.replace("\n", "") asc.addBadword(word)f.close() # Загружаем файл суффиксов цифровых аббревиатурf = open('./output/alm.abbr')for word in f.readlines(): word = word.replace("\n", "") asc.addSuffix(word)f.close() # Загружаем файл общеупотребимые аббревиатуры, такие как (США, ФСБ, КГБ ...)f = open('./texts/abbrs/abbrs.txt')for abbr in f.readlines(): abbr = abbr.replace("\n", "") asc.addAbbr(abbr)f.close() # Загружаем файл со списком слов, которые всегда употребляются с заглавной буквы (названия, имена, фамилии...)f = open('./texts/words/upp/words.txt')for word in f.readlines(): word = word.replace("\n", "") asc.addUWord(word)f.close() # Устанавливаем альтернативную буквуasc.addAlt("е", "ё") # Загружаем файл со словами содержащими альтернативные буквы, которые используются всегда однозначно (синтаксис файла аналогичен списку похожих букв в разных алфавитах)f = open('./texts/alters/yoficator.txt')for words in f.readlines(): words = words.replace("\n", "") words = words.split('\t') asc.addAlt(words[0], words[1])f.close() def statusIndex(text, status): print(text, status) def statusBuildIndex(status): print("Build index", status) def statusArpa(status): print("Read arpa", status) def statusVocab(status): print("Read vocab", status) # Выполняем загрузку данные языковой модели из файла ARPAasc.readArpa("./output/alm.arpa", statusArpa)# Выполняем загрузку словаряasc.readVocab("./output/alm.vocab", statusVocab) # Устанавливаем код языка в словареasc.setCode("RU")# Устанавливаем тип лицензии словаряasc.setLictype("MIT")# Устанавливаем название словаряasc.setName("Russian")# Устанавливаем имя автора словаряasc.setAuthor("You name")# Устанавливаем копирайт словаряasc.setCopyright("You company LLC")# Устанавливаем текст лицензии словаряasc.setLictext("... License text ...")# Устанавливаем контактные данные автора словаряasc.setContacts("site: https://example.com, e-mail: info@example.com") # Устанавливаем параметры блока внутреннего эмбеддинга (не обязательно, влияет на точность подбора кандидатов)asc.setEmbedding({ "а": 0, "б": 1, "в": 2, "г": 3, "д": 4, "е": 5, "ё": 5, "ж": 6, "з": 7, "и": 8, "й": 8, "к": 9, "л": 10, "м": 11, "н": 12, "о": 0, "п": 13, "р": 14, "с": 15, "т": 16, "у": 17, "ф": 18, "х": 19, "ц": 20, "ч": 21, "ш": 21, "щ": 21, "ъ": 22, "ы": 23, "ь": 22, "э": 5, "ю": 24, "я": 25, "<": 26, ">": 26, "~": 26, "-": 26, "+": 26, "=": 26, "*": 26, "/": 26, ":": 26, "%": 26, "|": 26, "^": 26, "&": 26, "#": 26, "'": 26, "\\": 26, "0": 27, "1": 27, "2": 27, "3": 27, "4": 27, "5": 27, "6": 27, "7": 27, "8": 27, "9": 27, "a": 0, "b": 2, "c": 15, "d": 4, "e": 5, "f": 18, "g": 3, "h": 12, "i": 8, "j": 6, "k": 9, "l": 10, "m": 11, "n": 12, "o": 0, "p": 14, "q": 13, "r": 14, "s": 15, "t": 16, "u": 24, "v": 21, "w": 22, "x": 19, "y": 17, "z": 7}, 28) # Выполняем сборку индекса бинарного словаряasc.buildIndex(statusBuildIndex) # Выполняем сохранение индекса бинарного словаряasc.saveIndex("./dictionary/3-middle.asc", "", 128, statusIndex)

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»