Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / FAQ: обработка строк и парсинг текстов средствами MySQL / 25 сообщений из 33, страница 1 из 2
26.11.2014, 18:01
    #38817663
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
ну вот ... прошло 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
26.11.2014, 18:12
    #38817673
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
Arhat109,

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

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

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

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

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

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

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

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

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

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

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

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

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

Я делал ограничение через переменные: как только "предыдущее" слово равно "новому" - значит "кончились". :)
...
Рейтинг: 0 / 0
26.11.2014, 18:59
    #38817702
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
Arhat109словарь ЗализнякаИз одного этого только словосочетания нужно сделать, как минимум, отдельный пост. А то и топик! :)
...
Рейтинг: 0 / 0
26.11.2014, 19:02
    #38817703
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
Arhat109Я делал ограничение через переменные: как только "предыдущее" слово равно "новому" - значит "кончились". :)А если по факту будут одинаковые слова? Да еще в середине строки?
(У меня реально встречается, что одно слово в наименовании товара встречается даже трижды).
...
Рейтинг: 0 / 0
26.11.2014, 19:12
    #38817713
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
Arhat109Предлагаю вынести мой пост в отдельный ФАК "для начала", а потом усложнять запрос постепенно до вменяемого результата. :)Выделил.
...
Рейтинг: 0 / 0
26.11.2014, 19:32
    #38817740
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
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
26.11.2014, 19:36
    #38817747
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
Arhat109,

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

уточнение: "все одинаковые слова, стоящие подряд". Если они перемежаются другими словами, то выдаст "как надо". :)я опоздал с уточнением :)
...
Рейтинг: 0 / 0
26.11.2014, 20:23
    #38817772
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
Вот такой вариант неожиданно, но работает верно (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
27.11.2014, 06:50
    #38817967
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
Разобрался. Работает верно, потому что блок проверки WHERE обрабатывается ранее блока выборки SELECT в силу оптимизации выполнения запроса. Логично, но не уверен что можно рекомендовать в ФАК.
...
Рейтинг: 0 / 0
27.11.2014, 07:10
    #38817972
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
Arhat109Разобрался. Работает верно, потому что блок проверки WHERE обрабатывается ранее блока выборки SELECT в силу оптимизации выполнения запроса. Логично, но не уверен что можно рекомендовать в ФАК.


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

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

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

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

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

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

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



Взято тут 12800557
...
Рейтинг: 0 / 0
27.11.2014, 17:44
    #38818670
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
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
27.11.2014, 19:27
    #38818765
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ: обработка строк и парсинг текстов средствами MySQL
javajdbc, согласен. В целом, переменные в запросе - это не совсем скуль где-то даже... но, многое что можно сделать в части парсинга текстов - без них, увы силами "чистого sql", возможно и не решаемо совсем.

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

Пример:

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

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

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

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

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

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


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