На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > задача на ЛИСПе , необходимо определить кодировку
      необходимо определить кодировку текста из файла (при условии, что текст м.б. только на win1251, koi8-r, dos, + м.б.ШЫЩ(непринципиально).
      помгоите кто может! хоть чем-нибудь! плз!
      можно сюда mail.ru]мыло
        точнее IIPuTBOPIIIuK@mail.ru
          Для больших текстов можно найти самые часто встречающиеся буквы и по ним подобрать кодировку. Сейчас попробовал для нескольких текстов - получился порядок [о]-[ае]-[инт].
            Alexey Dejneka,
            да я тоже думаю надо для каждой кодировки создать массив символов, а затем в ходе анализа текста суммировать число встречающихся символов изт какой-либо кодировки, а затем провирить каких символов больше...
            основная проблема, что я почти ни в зуб ногой в ЛИСПе
            так что, если есть какой-либо пример - очень прошу прислать/выложить
              не умею делать преобрахование типов в лиспе... :( а без этого ничего не выйдет
              известна ли длина текста? известно ли хоть одно слово в тексте? (скорее всего нет)
              кстати "ШЫШ" - значит "или" в KOI-8
              если текст большой, можно обойтись частотным анализом
                нет, не известно ничего, текст в файле, файл - любой, но с русской кодировкой
                указанный выше частотный анализ - самое то, больше/лучше уже не надо..
                просто надо запрогить этот подсчет символов... (т.е. сравнивать с заданной кодировкой сивмолы из текста)
                смысл вроде понятен- прогить на ЛИСПе не умею :(
                  хмммммммм
                  ExpandedWrap disabled
                    (defun addone (e l) (cond
                      ((eq l nil (cons (list e '1) nil))
                      ((atom (car l)) (cons (car l) (addone e (cdr l))))
                      ((eq (caar l) (coerce e 'integer)) (cons (list (caar l) (+ 1 (cadar l))) (cdr l)))
                    )) эта ф-я учитывает один чертов список-массив байтов-символов, составляющих текст файла
                    (defun create-list (l) (cond
                      ((listen) (create_list (cons (read-char) l)))
                      (T l)
                    )) эта ф-я создает список из символов файла, перевернутый, но нам пофигу
                    (defun decipher (x) (cond
                      ((eq x 140) 'WIN_1251)
                      .....
                      (T 'HREN_EE_ZNAET)
                    )) сюда нужно по образцу воткнуть значения символов "О" и "о", а еще лучше "А", "И", "Н" и меньших
                    тоже, а результат должен быть именем соответствующей кодировки
                    140 написано от балды
                    (defun max (l) (max_in l 0 0))
                    (defun max_in (l n e) (cond
                      ((eq l nil) e)
                      ((> (cadar l) n) (max_in (cdr l) (cadar l) (caar l)))
                      (T (max_in (cdr l) n e))
                    )) эта ф-я ищет в списке, построенном ф-ей addone, вида ((symbol number) (symbol number) ...) максимум
                    и возвращает сам символ (точнее соответствующее ему число)
                    max (l) - просто оболочка для вызова ф-и max_in
                    (defun buildl (l) (bl_in l NIL))
                    (defun bl_in (l e) (cond
                      ((eq l nil) e)
                      (T (bl_in (cdr l) (addone (car l) e)))
                    )) эта ф-я вызывает addone для каждого символа в списке, созданном create-list
                    (defun main () (decipher (max (buildl (create_list NIL)))))
                    а эта главная ф-я, файл надо подавать на стандартный ввод, в этом минус
                    для переделки нужно добавить параметр функции create-list, в котором будет файл
                    спасибо большое, щас попробую разобраться
                      Цитата Vesper @ 20.10.04, 13:58
                      (read-char) ... (coerce e 'integer)

                      Это неправильно. Для того, чтобы прочитать знаки из файла, нужно знать
                      кодировку. Причем в реализациях, поддерживающих Unicode, (CHAR-CODE
                      E), скорее всего, выдаст не то число, которое записано в файле. Нужно
                      открыть файл в двоичном режиме и работать с самими кодами.

                      ExpandedWrap disabled
                         
                        (defun file-octet-frequencies (filename)
                          (with-open-file (s filename
                                             :element-type '(unsigned-byte 8))
                            (loop with table = (make-array 256 :initial-element 0)
                                  for octet = (read-byte s nil nil)
                                  while octet
                                  do (incf (aref table octet))
                                  finally (return table))))
                         
                        (defun vector-max-index (vector &optional (start 0))
                          (loop with imax = start
                                and  max  = (aref vector start)
                                for i from (1+ start) below (length vector)
                                for x = (aref vector i)
                                do (when (> x max)
                                     (setq imax i
                                           max  x))
                                finally (return imax)))
                         
                        (defun guess-file-encoding (filename)
                          (let ((o-code (vector-max-index (file-octet-frequencies filename) 128)))
                            (case o-code
                              (#xee :windows-1251)
                              (#xcf :koi8-r)
                              (#xae :cp866)
                              (#xde :iso-8859-5)
                              (t (error "An assumed letter O has an unknown code ~S." o-code)))))
                        Alexey Dejneka, эххххх :( когда дело касается обработки файлов, стандартный Лисп уже не работает... а он должен быть переносимым языком...
                        а разве это нельзя сделать не выходя за рамки стандартного Лиспа с добавлением работы с файлом?
                        а еще можно проверять букву А на максимум, АсобеннА в мАсковских текстах :D
                          Цитата Vesper @ 21.10.04, 08:20
                          когда дело касается обработки файлов, стандартный Лисп уже не работает

                          ?!?!?! Тот "стандартный" Лисп, который я знаю (ANSI Common Lisp), имеет функции для работы с файлами (см. мое предыдущее сообщение).
                            Alexey Dejneka, я архаист :) для меня стандартный Лисп - это его база, в которой нет даже понятия "символ", а есть только "атом", "список" и "функция"... и в нем нет setq, loop with, for итп.
                              Помогите,плз,написать на лиспе сортировку списка вставкой в бинарное дерево.есть отдельные ф-и,но они не работают. :'(
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0304 ]   [ 15 queries used ]   [ Generated: 9.05.25, 11:07 GMT ]