powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / найти паттерны в тексте
9 сообщений из 9, страница 1 из 1
найти паттерны в тексте
    #39351950
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день,

имеется 60 M фрагментов текста общим объёмом 720 GB, они хранятся в неком хранилище данных.
постоянно добавлются новые.

задача: необходимо уменьшить занимаемое место любым способом, без потери информации.
я пробовал различные варианты компрессии, удается уменьшить в 3-4 раза, что не достаточно.

найден такой путь:
многие фрагменты текста похожи, например:
строка 1: "Повышение артериального давления 145/93. Врожденное сужение или атеросклероз аорты."
строка 2: "Повышение артериального давления 146/94. Врожденное сужение или атеросклероз аорты."
можно в хранить только изменяющееся значение
{145/93} ,
а основной текст записать отдельно:
pattern: "Повышение артериального давления {0}/{1}. Врожденное сужение или атеросклероз аорты."
этот подход уменьшает объём данных в 50-60 раз, то что надо.
НО:
как найти все паттерны? в ручную нереально, их несколько тысяч разновидностей.
были бы это xml, я бы получил xsd всех строк и их бы сравнивал. или JSON, можно получить схему и их сравнить. но к сожалению формат не определён.

какие варианты, в какую сторону копать?
спасибо.
извиняюсь за кросс
...
Рейтинг: 0 / 0
найти паттерны в тексте
    #39351965
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покопай в сторону устройства архиваторов, они за счет построения словаря сжимают.

Получится примерно так
Слово 50: "Повышение артериального давления"
Слово 51: "Врожденное сужение или атеросклероз аорты."
строка 1: "{50} 145/93. {51}"
строка 1: "{50} 145/94. {51}"
...
Рейтинг: 0 / 0
найти паттерны в тексте
    #39352084
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv,

Физически это что? Много мелких файлов? Один гигантский файл?
Дальше что должно с этим происходить? Просто лежать-храниться?

Если много мелких файлов и нужно просто хранить, то есть архиваторы, которые умеют составлять общий словарь для пачки файлов, например, WinRAR (у него это называется solid-архив). Если файлы однообразные, то разница по сравнению с обычными архивами очень заметная.
...
Рейтинг: 0 / 0
найти паттерны в тексте
    #39352157
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftvalv,

Физически это что? Много мелких файлов? Один гигантский файл?
Дальше что должно с этим происходить? Просто лежать-храниться?

Если много мелких файлов и нужно просто хранить, то есть архиваторы, которые умеют составлять общий словарь для пачки файлов, например, WinRAR (у него это называется solid-архив). Если файлы однообразные, то разница по сравнению с обычными архивами очень заметная.
это типа массив string[].
из него переодически читают отдельные строки.
если хранить в массиве фрагменты текста "как есть", они занимают 720, GB что неприемлимо.
а если хранить только изменяемые значения + указатель на паттерн, то примерно 10-20 GB, это можно.
вопрос в том, как найти все паттерны.
...
Рейтинг: 0 / 0
найти паттерны в тексте
    #39352192
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv,
Тебе стоит рассмотреть все дополнительные свединя о данных о которых ты умолчал. Возможно там найдёшь более простое решение. Почему более простое:
если рассматривать задачу в таком виде как ты описал, то решение очень не простое и требует определённый уровень подготовки. Если ты студент (я не хочу тебя обидеть, просто реально оцени свои возможности) то тебе это не по зубам. Если ты готов провозится с задачей несколько месяцев, предлагаю сделать вместе. Мне тоже пригодится но не сильно нужно.

Вопервых это задача кластеризации. Оптимальное решение только полный перебор.
Во вторых эвристическое решение требует уже огромных вычислительных ресурсов.

Решение:
По каждой строке нужно построить суффиксное дерево.
Рабочий набор кластеров/паттернов это набор суффиксных деревев.
Итеративный эвристический вариан построения кластера:
Сравниваем два дерева и вычисляем коэффициент схожести. (Удаление о ценра кластера)
При необходимости меняем паттерн кластера.

Построить деревья уже сложная вычислительная задача. Линейный поиск по списку елементов кластера тоже не быстрый. Наверняка придётся соединять деревья - плюс к сложности. Иои строить индекс по деревьям - двойной плюс к сложности.
...
Рейтинг: 0 / 0
найти паттерны в тексте
    #39353040
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mikron,

спасибо большое, сдвинулся с мёртвой точки.
прочитал про суффиксное дерево, похоже, то что надо.
на данный момент реализовал такой примерно алгоритм:
строю суффикные массивы для для 3 фрагментов.
сравниваю 3 массива: если (совпадающие строки одинаковы во всех трёх массивах) & (количество совпадающих строк) > (количество разных)*K),
нахожу самую длинную несовпадающую строку и на основании этого строю regular expression.
типа такого:
Код: sql
1.
'Повышение артериального давления([0-9]|\/| |.)+Врожденное сужение или атеросклероз аорты'

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

нашлось несколько реализаций сравнения, вот такой алгоритм например: comparison of two suffix tree-based document clustering algorithms . но это не то.
ты пишешь:
mikronвычисляем коэффициент схожести. (Удаление о ценра кластера)
При необходимости меняем паттерн кластера вот это вот кажется важно для алгоритма. но не могу найти информацию. по каким ключевым словам искать? "cluster pattern"? "suffix tree"?
ссылку бы на книгу или статью, объясняющую...
...
Рейтинг: 0 / 0
найти паттерны в тексте
    #39353103
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv,

как мера схожести текстов часто используют кол-во операций редактирования что бы получить из текста1 текст2.
Для твоего случая может выглядеть так: перестановка фрагментов текста 1, удаление частей текста 0, добавление текста log2(длина вставки). Функция схожести строится из задачи кластеризации. Единого стандарта нет и быть не может.
Читай про методы кластеризации. У тебя текста много.
Bottomup подход потребует для начала построит все суффиксы деревья. Самое экономичное представление (надо проверить) х8. 5ТБ данных. потом сравнение. каждого с каждым. можно ускорить если сначала соеденить деревья. (minimum O(N x log(N)) ) При удачном выборе метрики можно быстро найти наименьшую дистанцию. Но на следующем шаге придётся заново соединят деревья.
TopDown выглядит реалистичней.
...
Рейтинг: 0 / 0
найти паттерны в тексте
    #39355036
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valvдобрый день,

имеется 60 M фрагментов текста общим объёмом 720 GB, они хранятся в неком хранилище данных.
постоянно добавлются новые.

задача: необходимо уменьшить занимаемое место любым способом, без потери информации.
я пробовал различные варианты компрессии, удается уменьшить в 3-4 раза, что не достаточно.

найден такой путь:
многие фрагменты текста похожи, например:
строка 1: "Повышение артериального давления 145/93. Врожденное сужение или атеросклероз аорты."
строка 2: "Повышение артериального давления 146/94. Врожденное сужение или атеросклероз аорты."
можно в хранить только изменяющееся значение
{145/93} ,
а основной текст записать отдельно:
pattern: "Повышение артериального давления {0}/{1}. Врожденное сужение или атеросклероз аорты."
этот подход уменьшает объём данных в 50-60 раз, то что надо.
НО:
как найти все паттерны? в ручную нереально, их несколько тысяч разновидностей.
были бы это xml, я бы получил xsd всех строк и их бы сравнивал. или JSON, можно получить схему и их сравнить. но к сожалению формат не определён.

какие варианты, в какую сторону копать?
спасибо.
извиняюсь за кросс


а ты думаешь стандартные алгоритмы сжатия это не делают?
...
Рейтинг: 0 / 0
найти паттерны в тексте
    #39355224
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv, определённо тебе нужен архиватор. Сильно сомневаюсь что мы кустарными методами
сможем выровнять твой "медицинский поток сознания" хотя-бы до тех объемов которые
выдал архиватор.

Кстати какой ты юзал? В большинстве из них захардкоден лимит на размер и разрядность
справочника. Скорее всего rar и zip с дефолтными настройками тебе не подойдут.

Левенштейн для поиска подобий тебе вобщем-то подходит но он работает долго
и тебе надо сравнивать все со всеми. Тоесть - возведи в квадрат объем обработки
+ сам дядька Левин кушает матрицу сравнений для двух строк с точки зрения
количества внутренних операций.

+Если у тебя уж совсем уйма времени и хоца ковырять текст - то почитай
про N-граммный анализ. Я думаю он поможет искать похожие фразочки.
https://habrahabr.ru/post/114997/

По сути тебе нужен эффективный нечеткий индекс по этим 720 Gb.

Хотя я ума ни приложу что ты с ними будешь дальше делать? Создавать свой дезархиватор?
А будет-ли он эффективен? Врачи и больные не будут ждать пока ты колбасишь кило-тонны
Strings и делаешь replacements. А нагрузка на heap? Текстовые замены - это одни из самых коварных
операций. При кажущейся простоте - под капотом колоссальная работа.

Ну и самый главный вопрос. А почему-бы не положить это всё в БД?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / найти паттерны в тексте
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]