Алгоритм коррекции раскладки клавиатуры.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Renji, 7 Dec 2010.

  1. Renji

    Renji Member

    Joined:
    5 Dec 2010
    Messages:
    24
    Likes Received:
    5
    Reputations:
    0
    Реквестирую алгоритм автоматической коррекции языковой раскладки (ru-en|en-ru).
    Из известных мне решений - проанализировать слово на предмет возможных комбинаций. Самостоятельно "собирать" все возможные комбинации букв не имеет смысла, а найти уже готовый список мне не удалось.
    Если есть какие-либо мысли по поводу реализации - буду благодарен.
    Если задача не ясна:
    Требуется написать скрипт (Tcl), который анализирует введённое слово, и если слово введено в неверной раскладке (например вместо "привет" - "ghbdtn"), то переписать слово в правильной раскладке.

    P.S. Разбирать исходники подобногол механизма отставил в конец списка. Тем не менее это один из вариантов решения задачи.
     
  2. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    917
    Likes Received:
    174
    Reputations:
    3
    как вариант отсылать текст гуглу и если он предложит другой вариант то менять его.
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Как вариант взять список самый популярных англ слов 23к гдето их.
    разбить все слаба на 2 буквы. типа
    hello - he el ll lo
    И найти самые мало используемые. Далее методом исключения получить вообще не используемые.
    Далее тоже самое с тремя буквами.
    И тогда можно узнать самые вероятные на неправильное написание.
    А вообще в \Punto Switcher\Data\ есть базы хорошие. тока тебе придется чуть допереть в их формате.
    т.е. они нормального формата, тока там надо понять что показывает буквосочетение
     
  4. WNZRS

    WNZRS Member

    Joined:
    3 Sep 2009
    Messages:
    294
    Likes Received:
    52
    Reputations:
    1
    можно попробовать без баз:
    считать K=гласные/согласные и исходя из значения K, делать вывод правильно/неправильно. Но ошибаться будет гораздо чаще чем с базами.
     
  5. Renji

    Renji Member

    Joined:
    5 Dec 2010
    Messages:
    24
    Likes Received:
    5
    Reputations:
    0
    За ужином у меня появилась такая идея. Правдо изначально я был намерен получать лишь чередования согласная-гласная. Пропустить через сей скрипт (если состояние "обучение" не потребуется в дальнейшем, то вероятно получение базы стоит реализовать на C/C++) "Война и мир", и еще пару книжек вдогонку. Далее, отталкиваясь от этой базы анализировать входящее слово и делать необходимые операции.
    Только я сомневаюсь в качестве работы этого механизма.
    За базу "~/Punto Switcher/Data/" - спасибо, не знал. Сейчас посмотрю на это дело.
    P.S. Вероятно получение 2 пар/3 символов будет эффективнее. Но в этом случае, вероятно, будет страдать всё риложение (Язык Tcl по своей природе "не очень быстрый").
    Тем не менее спасибо. =)

    __________
    "Война и мир" отменяется. Эффективнее использовать словари (en-ru|ru-en).
     
    #5 Renji, 8 Dec 2010
    Last edited: 8 Dec 2010
  6. Renji

    Renji Member

    Joined:
    5 Dec 2010
    Messages:
    24
    Likes Received:
    5
    Reputations:
    0
    В руссом языке есть очень много вариантов написания слов, и порой - довольно неожиданные. Подобный метод будет ориентироваться лишь на "простейшие" слова.
    На одно слово может приходиться как 1 гласная и 4 согласных, так и наоборот. Тем не менее спасибо за вариант.
     
  7. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    берешь введенное словно, определяешь по коду символов язык, если англ то конвертируешь буквы в русские коды (по тому на какой клавиши какая пара букв находится), если наоборот русский то переводишь в англ. Получаешь два слова состоящих из англ и русских букв (один и тот же набор нажатых пользователем клавиш, в русской и англ раскладке). Далее запускаешь два потока и делаешь поиск по каждому слову в соответствующем словаре (словарь например можно взять из оперы). Ну и по результатам поиска определяешь необходимую раскладку.
    Но это так сказать вариант в лоб.
    Не в лоб, это делать тоже самое но на лету перехватывать нажимаемые пользователем клавиши и параллельно делать описанное выше, до тех пор пока не найдется совпадение, после чего менять кодировку на нужную, и следить что последующие вводимые символы совпадает с ожидаемым найденным словом/словами. Если после очередного символы введенная последовательность символом не удовлетворяет не одному из найденных слов в данной раскладке, опять конвертировать в противоположную и запускать новый поиск по этому набору... Так и авто дополнение как раз можно реализовать.

    Интересная кстати задачка. Надо бы попробовать самому реализовать :)
     
  8. Renji

    Renji Member

    Joined:
    5 Dec 2010
    Messages:
    24
    Likes Received:
    5
    Reputations:
    0
    Отличное предложение! Кстати, по этому принципу реализованы некоторые механизмы спеллчекеров (которые воспроизводят данный механизм в добавок ко всему). Но у меня есть некоторые требованию по поводу рантайма сего алгоритма, а именно - Tcl (интерпретируемый язык). Так что поиск по словарю потребует значительные затраты (как бы не 40% от нагрузки приложения) ресурсов.
     
    1 person likes this.
  9. modestus

    modestus New Member

    Joined:
    12 Oct 2010
    Messages:
    33
    Likes Received:
    4
    Reputations:
    5
    SQLite + оператор LIKE. Получишь необходимую тебе производительность.
     
  10. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    ну если перебор делать тупо брутом по всему списку то да. А если все таки забуматся о том чтобы диапозон слов делить на группы, на пример начиная от 2 букв, и с каждым введенным символом тот диапозон в котором производиться поиск крошить по 3 символам... 4 ... А так как разница между вводом символов не велика, то при вводе каждого нового символа убивать потоки производившие поиск для меньшего числа символов и запускать поиски на большем числе символов. Таким образом после введенных 3-4 символов диапазон поиска будет совсем не велик. Правда нужно грамотно продумать процесс дробления диапазон поиска.

    ЛИБО:
    предварительно отдельным скриптом составить карту словаря:
    слова с буквы "а" начинаеться с 1 позиции, с буквы "б"
    с 5345, с буквы "в" с 7653
    слова с сочетания "аа" начинаются с 1 позиции, с сочетания "аб" с 123, ....
    слова начинающиеся на "ыва" начинается с 34656 позиции.
    И в зависимости от введенных символов находить от "сих до сих" в котором нужно проводить поиск. Опять таки после 2-3-4 символов он будет сравнительно невелик.

    PS. само собой подразумевается что весь словарь храниться в памяти, в удобной структуре в которой возможен доступ по индексу.
    PPS. так же изначально предполагалось что производить такой поиск по файлу на диске это был бы полный ахтунг )).