Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.07.24;
Скачать: CL | DM;

Вниз

сжатие строк   Найти похожие ветки 

 
картман ©   (2015-10-29 23:30) [0]

Всем привет!
Есть много строк:

мана
мама
машина

нужно сделать что-то вроде:
Array[] a = ("ма","на","ши");
тогда строки будут представлены в виде:
мана = [0,1];
мама = [0,0];
машина = [0,2,1];

чтобы найденные "кусочки" способствовали максимальному(или близко к нему) сжатию?


 
Pavia ©   (2015-10-29 23:37) [1]

Суффиксное дерево.


 
Sha ©   (2015-10-29 23:48) [2]

LZW


 
картман ©   (2015-10-29 23:48) [3]


> Pavia ©   (29.10.15 23:37) [1]
>
> Суффиксное дерево.

искать умучаюсь


 
Sha ©   (2015-10-29 23:58) [4]

так тебе сжать или искать?


 
картман ©   (2015-10-30 00:12) [5]

в смысле, искать оптимальные кусочки для сжатия. А потом да, потом искать.
 Не понял LZW((

  1. Инициализация словаря всеми возможными односимвольными фразами. Инициализация входной фразы W первым символом сообщения.
   2.Найти в словаре строку W наибольшей длины, которая совпадает с последними принятыми символами.
   3.Считать очередной символ K из кодируемого сообщения.
   4.Если КОНЕЦ_СООБЩЕНИЯ, то выдать код для W, иначе.
   5.Если фраза WK уже есть в словаре, присвоить входной фразе W значение WK и перейти к Шагу 3, иначе выдать код W, добавить WK в словарь, присвоить входной фразе W значение K и перейти к Шагу 3.
   6.Конец.


 
картман ©   (2015-10-30 00:20) [6]

лучше так описать задачу:
нужно сделать поиск по словарю, каждое слово состоит из приставки, корня, суфикса и окончания. Любая из частей может быть опущена. Ну и в моем случае все эти части слов могут быть одним и тем же, т.е. храниться в одном списке. Как получить эти приставки-окончания для минимизации словаря в памяти?


 
Sha ©   (2015-10-30 01:01) [7]

В [5] описано нечто, похожее на алгоритм сжатия данных LZW.
Для [6] проще всего хешировать.
Для хранения в памяти слов естественного языка со всеми словоформами довольно эффективно и проще всего реализуется дельта-кодирование расстояний между словами. Например, древовидная 3-х уровневая структура блоков, в которых хранится начальное слово и расстояния до каждого следующего слова в блоке. Как правило, на слово достаточно 1-2 байта.


 
картман ©   (2015-10-30 01:45) [8]


> Sha ©   (30.10.15 01:01) [7]
>
> В [5] описано нечто, похожее на алгоритм сжатия данных LZW.
>

да, разобрался по другому описанию.


> Для хранения в памяти слов естественного языка со всеми
> словоформами

имена собственные, много, со словоформами


> Например, древовидная 3-х уровневая структура блоков

эээ... можно подробнее?


 
Pavia ©   (2015-10-30 06:32) [9]


> нужно сделать поиск по словарю, каждое слово состоит из
> приставки, корня, суфикса и окончания. Любая из частей может
> быть опущена. Ну и в моем случае все эти части слов могут
> быть одним и тем же, т.е. храниться в одном списке. Как
> получить эти приставки-окончания для минимизации словаря
> в памяти?

Это трудная задача. Читай словарь Зализняка там описано.
Гораздо проще использовать псевдо суффиксы.

Таки не понял чем суффиксное дерево не устроило?


> Например, древовидная 3-х уровневая структура блоков, в
> которых хранится начальное слово и расстояния до каждого
> следующего слова в блоке. Как правило, на слово достаточно
> 1-2 байта.

хотелось бы подробнее.


 
Sha ©   (2015-10-30 09:41) [10]

> имена собственные, много, со словоформами

Это мало )

> хотелось бы подробнее

Идея в том, что в естественном языке с большим количеством словоформ они (формы) лежат достаточно плотно. Т.е. если ввести некую нумерацию форм, рассматривая буквы как цифры в N-ричной системе счисления, то для упорядоченных по алфавиту форм разница в весе между соседними формами обычно будет небольшой. Конечно, иногда будут скачки в районе длинных слов типа "машиностроительный", но их относительная доля невелика. Таким образом, вместо хранения слов можно хранить эти самые дельты - числа переменной длины. Все они собираются в блоки. Каждый блок имеет имя, совпадающее с первым словом в блоке. Если блоков слишком много, добавляем еще один уровень иерархии. Для оценки: примерно 400..500k памяти - и уже становится очень трудно найти слово, которого нет в словаре.


 
картман ©   (2015-10-30 10:29) [11]


> Таки не понял чем суффиксное дерево не устроило?

ну вот получил я суффиксы. Нашел наибольшие. А как узнать, что их использование даст наибольшую или близкую к ней экономию памяти? Берем "часть1", вырезаем ее из всех слов, - строим другое дерево, и еще, и еще?.. как-то коряво получается.


>  Sha ©   (30.10.15 09:41) [10]

ясно, спасибо.


 
brother ©   (2015-11-02 11:00) [12]

> А как узнать, что их использование даст наибольшую или близкую
> к ней экономию памяти

2х проходность. на первом проходе оценку весов, на втором непосредственное сжатие или как там нужно?)



Страницы: 1 вся ветка

Текущий архив: 2016.07.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
15-1442179801
Юрий
2015-09-14 00:30
2016.07.24
С днем рождения ! 14 сентября 2015 понедельник


15-1441852590
MonoLife
2015-09-10 05:36
2016.07.24
И почту Yahoo заблокировали


2-1415425555
Signal
2014-11-08 08:45
2016.07.24
Чтение почты через протокол с TLS порт 995


15-1445624809
wl
2015-10-23 21:26
2016.07.24
ноут


15-1441281618
Landon
2015-09-03 15:00
2016.07.24
Крах приложения внутри FinalizeUnits