Re: кодировка

From
Ivan Storogev ()
To
dmitry chernokozov
Date
2002-06-10T09:04:14Z
Area
RU.ALGORITHMS
From: Ivan Storogev <rezeda@dol.ru>

Привет dmitry,

Sunday, June 9, 2002, 11:13:14 PM, вы писали:

dc> Как можно определить кодировку текста ? Если есть чистый текст (для простоты
dc> строка слов) из русских символов, которые могут быть в 866/1251/koi8/iso.
Строка слов как раз усложняет, а не упрощает задачу. Куда проще, если не
строка, а килобайт несколько.

dc> Интересуют методы подобного определения. Насколько я понимаю можно банально
dc> перебирать слова по словарю (но это долго), а можно воспользоваться
dc> лингвистикой (в ней я не силен). Может есть у кого примеры (желательно на c)?
Проще всего воспользовать статистикой встречаемости в реальных текстах букв.
Для  набора  статистики  воспользоваться  любой  подборкой осмысленных текстов.
Для коротких текстов этот метод будет давать ошибки. Для тестов из 10-15 букв
(2-4 слова) вовсе работать не будет. По скорости самый быстрый.

Более  эффективный  метод  --  это  статистика  не  одиночных букв, а их
коротких (2-4) последовательностей (диграфы, триграфы), при этом нужно учитывать
как букву и начало/конец слова.
Тут  важно,  что  многие  сочетания  букв в русском (и любом другом) языке не
встречаются,  поэтому  можно  принимать  решение методом исключения. Это дает
возможность засечь многократно перекодированный и испорченный текст.
Для  двойных  неправильных  перекодировок  (KOI8, перекодированный как 1251 и
т.п.) нужно заранее составить статистические таблицы.

Наконец, можно применить вариант словарного метода, но не для слов целиком,
а  только  для  их  начал. То есть сначала просматриваем первые 3 буквы, если
достоверного решения не принято -- 4 буквы, и т.д.
Тут  нужно  учесть  приставки.  Можно,  например, просматривать по словарю не
только начала слов, а с отступом на 1..4 буквы.
Это промежуточный, между n-графами и словарем, метод.

Кстати,  словарный  метод  вовсе  не  обязательно  медленный. Присмотритесь к
программам проверки орфографии, работающим словарным методом (ispell, aspell).
Программы GNU, с исходниками.
Там же можно найти и русские словари в компактной форме. Указанные программы
для поиска используют хеширование. Хеш (hash) составляется заранее.

Для  экспериментов  и  набора  статистик советую воспользоваться Perl'ом или
Python'ом  (или  чем-то  ещё,  в  то  же  роде).  Это резко увеличит скорость
разработки.

Все  указанные  методы,  работают только на осмысленных текстах.
Длина текста: хотя  бы  1  слово  для  словарных и десятки букв для
статистических методов.

-- 
Всех благ, Иван.



Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
 * Origin: KKK (2:5020/400)