powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / FAQ: обработка строк и парсинг текстов средствами MySQL
25 сообщений из 33, страница 1 из 2
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817663
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот ... прошло 2 года с тех пор как занялся прсингом текстов силами Мускуля ... предлагаю организовать ФАК по работе с текстами и особенностях применения Locate(), Replace(), Find_in_set(), Substring_index() и прочих прелестей...

Для начала:

Запрос "разбивка текстового поля на слова по пробелу" (первые 10 слов):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  SELECT
    tmp.`id` AS `num`
    , SUBSTRING_INDEX(SUBSTRING_INDEX(src.`text_field`, ' ', tmp.`id`), ' ', -1) AS `word`
    , src.`text_field` AS source
  FROM (
    SELECT 1 AS num UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL
    SELECT 7 UNION ALL
    SELECT 8 UNION ALL
    SELECT 9 UNION ALL
    SELECT 10 UNION ALL
  ) AS tmp
  JOIN `text_table` AS src
  HAVING `word` <> ''



При необходимости можно заменить пробел чем-то другим - просто заменив вхождения его в обе функции как строки-разделителя.
При необходимости можно создать отдельную табличку с чиселками и джойниться к ней и находить и большее количество слов или джойнить две таких группы для поиска до сотни слов или три для поиска до тысячи слов или ... :)

Недостаток запроса - он выдает всегда то количество слов, скока цифирек сджойнено, и, если слов меньше - тупо повторяет последнее слово... как "поправить" - предлагаю дополнить после выделения темы.

... продолжение "типовых" запросов по текстовой обработке для начинающих - привествуется.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817673
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

да, хороший вариант. Он уже представлен
по ссылке прямо в предыдушем посте 13640230 ,
там показан полный пример со джоинтом и
сравнение с другими способами решения.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817674
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109ну вот ... прошло 2 года с тех пор как занялся прсингом текстов силами Мускуля ... предлагаю организовать ФАК по работе с текстами и особенностях применения Locate(), Replace(), Find_in_set(), Substring_index() и прочих прелестей...В целом я только за!
Возьметесь написать стартовый пост?

P.S. Хотя сам парсинг силами MySQL мне кажется весьма неэффективным по скорости и ресурсам.

Arhat109Недостаток запроса - он выдает всегда то количество слов, скока цифирек сджойнено, и, если слов меньше - тупо повторяет последнее слово... как "поправить" - предлагаю дополнить после выделения темы.А если в конец строки добить 9 пробелов?

Arhat109... продолжение "типовых" запросов по текстовой обработке для начинающих - привествуется. 15921841 годится? буквально вчера было...
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817693
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc,

ну ... ваш запрос оригинален (снимаю шляпу :) ) и кажется вполне рабочим, но как понимаю применим к конкретной задаче хранения листьев в деревьях всеж-таки (как не надо делать).

Я имел ввиду общую обработку текстов силами Мускуля.

Например, часто требуется найти "похожие" строки, по алгоритму, отличному от full text search ... и народ часто решает вопрос путем выкачки данных в приложение и ваяет циклы на ЯП (С, PHP, кто на чем горазд).

На самом деле, часто обработка внутри Мускуля может оказаться даже быстрее. Недостаток один - это как правило запросы типа "выверни моск наизнанку"... вот поэтому и предлагаю вынести и прикрепить в отдельной теме. Задолбало за 2 года разыскивать в своем коде эти чудесатые подходы, типа как запрос, что привел выше.

Озадачился что тут нет такого фака, поскольку потерял свой запрос по разбивке товарной строки на слова, по заданному набору разделителей ("по или", а не одному!) из вспомогательной таблички с поиском полученных слов в словаре Зализняка и получением результата в виде:

порядок, слово, часть_речи (если найдена).

:)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817699
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Предлагаю вынести мой пост в отдельный ФАК "для начала", а потом усложнять запрос постепенно до вменяемого результата. :)

Вряд ли сподоблюсь написать целую статью ... ни умею. :)

Я делал ограничение через переменные: как только "предыдущее" слово равно "новому" - значит "кончились". :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817702
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109словарь ЗализнякаИз одного этого только словосочетания нужно сделать, как минимум, отдельный пост. А то и топик! :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817703
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109Я делал ограничение через переменные: как только "предыдущее" слово равно "новому" - значит "кончились". :)А если по факту будут одинаковые слова? Да еще в середине строки?
(У меня реально встречается, что одно слово в наименовании товара встречается даже трижды).
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817713
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109Предлагаю вынести мой пост в отдельный ФАК "для начала", а потом усложнять запрос постепенно до вменяемого результата. :)Выделил.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817740
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft, Упс. Не было такого... да, тогда это работать будет некорректно:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT
    tmp.`id` AS `num`
    , IF( @old <> (@new:=SUBSTRING_INDEX(SUBSTRING_INDEX(src.`text_field`, ' ', tmp.`id`), ' ', -1))
      , @old:=@new
      , ''
    ) AS `word`
    , src.`text_field` AS source
  FROM
  (SELECT @old:=@new:='') AS dummy
  ,(SELECT 1 AS num UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL
    SELECT 7 UNION ALL
    SELECT 8 UNION ALL
    SELECT 9 UNION ALL
    SELECT 10 UNION ALL
  ) AS tmp
  , `text_table` AS src
  HAVING `word` <> ''



точнее он отдаст все одинаковые слова ровно по одному разу... :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817747
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

уточнение: "все одинаковые слова, стоящие подряд". Если они перемежаются другими словами, то выдаст "как надо". :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817753
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109точнее он отдаст все одинаковые слова ровно по одному разу... :)Еще точнее - сократит одинаковые слова, идущие подряд в порядке чисел в результате подзапроса tmp, который внезапно может измениться, особенно если использовать настоящую таблицу.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817755
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109Arhat109,

уточнение: "все одинаковые слова, стоящие подряд". Если они перемежаются другими словами, то выдаст "как надо". :)я опоздал с уточнением :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817772
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой вариант неожиданно, но работает верно (MySql 5.1.67? не помню какой стоит...)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT
    tmp.`id` AS `num`
    , SUBSTRING_INDEX(@new:=SUBSTRING_INDEX(src.`text_field`, ' ', tmp.`id`), ' ', -1) AS `word`
    , src.`text_field` AS source
  FROM
  (SELECT @new:='') AS dummy
  ,(SELECT 1 AS num UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL
    SELECT 7 UNION ALL
    SELECT 8 UNION ALL
    SELECT 9 UNION ALL
    SELECT 10 UNION ALL
  ) AS tmp
  , `text_table` AS src
  WHERE CHAR_LENGTH(@new) < CHAR_LENGTH(src.`text_field`)



, хотя "по идее" должен глотать последнее слово...
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817967
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался. Работает верно, потому что блок проверки WHERE обрабатывается ранее блока выборки SELECT в силу оптимизации выполнения запроса. Логично, но не уверен что можно рекомендовать в ФАК.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38817972
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109Разобрался. Работает верно, потому что блок проверки WHERE обрабатывается ранее блока выборки SELECT в силу оптимизации выполнения запроса. Логично, но не уверен что можно рекомендовать в ФАК.


...это извесное правило: применение переменных в WHERE
категорически запрешено всем кроме Бочкова.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818006
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc, использовать можно. Изменять нельзя. :)

Продолжаем. Наткнулся на вот это обсуждение: 16690327 по вопросу построения "сочинителя сказок" силами Мускуля, как понял задачу. Думаю дать ссылку тут - будет полезно.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818020
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача2: обрезать последнее слово в строке:

TRIM(TRAILING SUBSTRING_INDEX(#string#, #pattern#, -1) FROM #string#)

обсуждение тут: 15548673
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818083
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftArhat109словарь ЗализнякаИз одного этого только словосочетания нужно сделать, как минимум, отдельный пост. А то и топик! :)

нашел. Начало было тут: 13369064
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818113
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжаем сбор "полезностей" по работе с текстами. Нашел вот это:

Есть таблица с полем `name`. В поле хранятся записи вида А. Пупкин, А. В. Бубликов и т.д. Проблема в том, что сортировать их нужно по фамилии, а потом по инициалам. Хранить имя, отчество и фамилию в разных полях или в другом порядке - не вариант, нужно работать с полем такого вида. В результате непродолжительных раздумий, родил запрос вида

Код: sql
1.
SELECT ... ORDER BY SUBSTR(`name`, - (LOCATE('.', REVERSE(`name`)) - 2)), `name`;



Взято тут 12800557
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818670
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109javajdbc, использовать можно. Изменять нельзя. :)


В обшем виде -- НЕЛЬЗЯ.

Попробуем классифицировать контекстЫ
для переменных. Нужна стабильность и предсказуемость.

1-1. Стабильно. Порядок вычисления внутри функций:
Например, LEAST(A, B, C) всегда вычисляется слева направо.

1-2. Стабильно. Порядок вычисления строчек в SELECT блоке
при наличии ORDER BY и отсутствии GROUP BY. Если есть ГРОУП БУ
то надо вынести ORDER BY в окружной селект.

2. Недокументировано, но стабильно. Порядок вычисления полей
в SELECT блоке. Т.е. SELECT A, B, C FROM... вычисляет
A, B, C в указаном порядке. Стандарты СКЛ и MYSQL документация
никак не прописывают порядок. Однако я не видел ни одного
отрицательного примера.

Параноикам советуется использование способа (1-1) вместо (2).

3-1. Нестабильно. порядок выполнения вычислений в WHERE и JOIN ON блоке.
В литературе в ЯВНОМ виде показано как ломаются вычисления с переменными.
Из-за того что порядок зависит от плана.
Из-за того что план зависит от статистики, индексов и фазы луны.

3-2. Нестабильно. Использовать переменные в SELЕCT и WHERE блоках
одновремено. Во-первых (3), во вторых даже если в WHERE
только читать переменную, все равно не доказан строгий ход
вычислений между двумя блоками.

В целом -- мускл переменные -- полезная но капризная штука.
Попытки использования переменных в "нестабильном" контексте
приводит к "нестабильным" результатам.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818765
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc, согласен. В целом, переменные в запросе - это не совсем скуль где-то даже... но, многое что можно сделать в части парсинга текстов - без них, увы силами "чистого sql", возможно и не решаемо совсем.

В частности, разбивка строки на слова не по пробелу или другому одиночному символу, а по заданному набору разделителей - как?

Пример:

Альб д/рис,40л.,картон-А4,"Алые Паруса"

надо получить:
Альб -- вид товара
д/рис -- подвид товара
40л. -- параметр "количество листов"
картон -- параметр "материал обложки"
А4 -- параметр "формат"
"Алые Паруса" -- параметр "картинка на обложке"

Разделители: пробел, запятая, тире.
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818776
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

Ну с разделителями -- достаточно просто :
свести все разделители к одному путем
нескольких замен -- пробел на запятую,
точку на запятую....
а потом разбивать по запятой как мы уже знаем...
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #38818982
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc,

Можно. Предположим что список разделителей лежит в табличке. Запрос, который делает замену в строке одной таблички по набору записей образцов из другой - приведете? (потом усложню задачу) :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39194948
Фотография blogger1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,
все одинаковые слова, стоящие подряд". Если они перемежаются другими словами, то выдаст "как надо". :)
...
Рейтинг: 0 / 0
FAQ: обработка строк и парсинг текстов средствами MySQL
    #39196314
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

этот весь топик - извращение какое-то,
разбирать текст надо не на SQL, для этого полно средств от строковых функций и регулярных выражений до компиляторов и их генераторов.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / FAQ: обработка строк и парсинг текстов средствами MySQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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