Реквестирую алгоритм автоматической коррекции языковой раскладки (ru-en|en-ru). Из известных мне решений - проанализировать слово на предмет возможных комбинаций. Самостоятельно "собирать" все возможные комбинации букв не имеет смысла, а найти уже готовый список мне не удалось. Если есть какие-либо мысли по поводу реализации - буду благодарен. Если задача не ясна: Требуется написать скрипт (Tcl), который анализирует введённое слово, и если слово введено в неверной раскладке (например вместо "привет" - "ghbdtn"), то переписать слово в правильной раскладке. P.S. Разбирать исходники подобногол механизма отставил в конец списка. Тем не менее это один из вариантов решения задачи.
Как вариант взять список самый популярных англ слов 23к гдето их. разбить все слаба на 2 буквы. типа hello - he el ll lo И найти самые мало используемые. Далее методом исключения получить вообще не используемые. Далее тоже самое с тремя буквами. И тогда можно узнать самые вероятные на неправильное написание. А вообще в \Punto Switcher\Data\ есть базы хорошие. тока тебе придется чуть допереть в их формате. т.е. они нормального формата, тока там надо понять что показывает буквосочетение
можно попробовать без баз: считать K=гласные/согласные и исходя из значения K, делать вывод правильно/неправильно. Но ошибаться будет гораздо чаще чем с базами.
За ужином у меня появилась такая идея. Правдо изначально я был намерен получать лишь чередования согласная-гласная. Пропустить через сей скрипт (если состояние "обучение" не потребуется в дальнейшем, то вероятно получение базы стоит реализовать на C/C++) "Война и мир", и еще пару книжек вдогонку. Далее, отталкиваясь от этой базы анализировать входящее слово и делать необходимые операции. Только я сомневаюсь в качестве работы этого механизма. За базу "~/Punto Switcher/Data/" - спасибо, не знал. Сейчас посмотрю на это дело. P.S. Вероятно получение 2 пар/3 символов будет эффективнее. Но в этом случае, вероятно, будет страдать всё риложение (Язык Tcl по своей природе "не очень быстрый"). Тем не менее спасибо. =) __________ "Война и мир" отменяется. Эффективнее использовать словари (en-ru|ru-en).
В руссом языке есть очень много вариантов написания слов, и порой - довольно неожиданные. Подобный метод будет ориентироваться лишь на "простейшие" слова. На одно слово может приходиться как 1 гласная и 4 согласных, так и наоборот. Тем не менее спасибо за вариант.
берешь введенное словно, определяешь по коду символов язык, если англ то конвертируешь буквы в русские коды (по тому на какой клавиши какая пара букв находится), если наоборот русский то переводишь в англ. Получаешь два слова состоящих из англ и русских букв (один и тот же набор нажатых пользователем клавиш, в русской и англ раскладке). Далее запускаешь два потока и делаешь поиск по каждому слову в соответствующем словаре (словарь например можно взять из оперы). Ну и по результатам поиска определяешь необходимую раскладку. Но это так сказать вариант в лоб. Не в лоб, это делать тоже самое но на лету перехватывать нажимаемые пользователем клавиши и параллельно делать описанное выше, до тех пор пока не найдется совпадение, после чего менять кодировку на нужную, и следить что последующие вводимые символы совпадает с ожидаемым найденным словом/словами. Если после очередного символы введенная последовательность символом не удовлетворяет не одному из найденных слов в данной раскладке, опять конвертировать в противоположную и запускать новый поиск по этому набору... Так и авто дополнение как раз можно реализовать. Интересная кстати задачка. Надо бы попробовать самому реализовать
Отличное предложение! Кстати, по этому принципу реализованы некоторые механизмы спеллчекеров (которые воспроизводят данный механизм в добавок ко всему). Но у меня есть некоторые требованию по поводу рантайма сего алгоритма, а именно - Tcl (интерпретируемый язык). Так что поиск по словарю потребует значительные затраты (как бы не 40% от нагрузки приложения) ресурсов.
ну если перебор делать тупо брутом по всему списку то да. А если все таки забуматся о том чтобы диапозон слов делить на группы, на пример начиная от 2 букв, и с каждым введенным символом тот диапозон в котором производиться поиск крошить по 3 символам... 4 ... А так как разница между вводом символов не велика, то при вводе каждого нового символа убивать потоки производившие поиск для меньшего числа символов и запускать поиски на большем числе символов. Таким образом после введенных 3-4 символов диапазон поиска будет совсем не велик. Правда нужно грамотно продумать процесс дробления диапазон поиска. ЛИБО: предварительно отдельным скриптом составить карту словаря: слова с буквы "а" начинаеться с 1 позиции, с буквы "б" с 5345, с буквы "в" с 7653 слова с сочетания "аа" начинаются с 1 позиции, с сочетания "аб" с 123, .... слова начинающиеся на "ыва" начинается с 34656 позиции. И в зависимости от введенных символов находить от "сих до сих" в котором нужно проводить поиск. Опять таки после 2-3-4 символов он будет сравнительно невелик. PS. само собой подразумевается что весь словарь храниться в памяти, в удобной структуре в которой возможен доступ по индексу. PPS. так же изначально предполагалось что производить такой поиск по файлу на диске это был бы полный ахтунг )).