Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Парсинг текстовой строки / 10 сообщений из 10, страница 1 из 1
27.07.2014, 15:51:56
    #38706769
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг текстовой строки
На входе у меня строка до 1400 символов - некий произвольный текст, который вводит юзер. Работает он монопольно.
В ней около 100 слов.

На выходе я хочу получить рекордсет с:

1. позиция слова в строке.
2. Собственно слово.
3. В какой из имеющихся таблиц оно найдено, т.е. что это - существительное, прилагательное, глагол, знак препинания. и его id в
Для этого у меня заведены эти четыре таблицы, в них лежат слова. Соответственно, ставлю числовой признак: 1, 2, 3, 4 - и найденный в какой-то из таблиц id. Если нигде не найдено - null, null

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

При этом в таблицах у меня до 1000 строк, т.е пробежаться надо по 4 тысячам записей, вообще ни о чем задача, а работает секунд десять. Машина при этом 4 ядерная, i-5 3570, 16 гигов оперативки, ssd Samsung 840Pro. В момент работы mysql отьедает до гига оперативки, 12 свободно.

Понятно дело, что проблема в моем коде, а не в базе.
Как это сделать правильно, коллеги? Достаточно будет даже не кода, а просто алгоритма - парсить с использованием вот этого алгоритма, заливать распарсенное лучше не во временную, а в постоянную таблицу и т.п.
...
Рейтинг: 0 / 0
27.07.2014, 15:53:59
    #38706770
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг текстовой строки
Для расстановки позиций пользуюсь вот этим из faq.

SET @id := 0;
SELECT @id := @id + 1 AS row_number, your_table.* FROM your_table;
...
Рейтинг: 0 / 0
27.07.2014, 16:47:27
    #38706787
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг текстовой строки
UsersДля этого у меня заведены эти четыре таблицы, в них лежат слова.Я бы сделал одну с признаком части речи. Например, в четырех отдельных полях.
...
Рейтинг: 0 / 0
27.07.2014, 16:54:38
    #38706788
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг текстовой строки
miksoft,

Не пойдет, потому что хранится вся информация о части речи. Слово во всех формах и т.п. Эх, мне бы, конечно, сюда что-то бы прикрутить, чтобы оно по запросу эту инфу возвращала, типа АОТ, но не знаю, как.

Ну, а коль хранится вся инфа - то выйдет с существительным и глаголом, например, проблема.
Разные свойства - значит, будут пустые поля.
...
Рейтинг: 0 / 0
27.07.2014, 17:20:49
    #38706796
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг текстовой строки
Users,

ну тогда показывайте ваш код
...
Рейтинг: 0 / 0
27.07.2014, 18:21:23
    #38706818
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг текстовой строки
miksoft,

стыдно Заранее знаю, что написано криво.
...
Рейтинг: 0 / 0
27.07.2014, 20:17:50
    #38706844
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг текстовой строки
Users,

Хм, ну хоть какие-то исходные данные можете дать?

на слова можно бить с помощью SUBSTRING_INDEX, для поиска по таблицам - JOIN
...
Рейтинг: 0 / 0
27.07.2014, 22:33:29
    #38706877
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг текстовой строки
miksoft,

я бью на слова вот так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SET iCount = (SELECT f_substring_count(iTextValue, ' ')) + 1; -- посчитал количество пробелов + 1 - это будет число слов

SELECT @r + 1                                                                   AS row_num
        ,SUBSTRING_INDEX(SUBSTRING_INDEX(iTextValue, ' ', @r := @r + 1), ' ', -1) cWord в столбец
  FROM (SELECT @r := 0) x
  , (SELECT 'z' xx
  UNION
  SELECT 'z0' xx
  UNION
  SELECT 'z1' xx
 LIMIT iCount) z;



при этом union таких у меня 150 - по максимальному количеству слов в предложении. Уже очень некрасивый код :(
...
Рейтинг: 0 / 0
27.07.2014, 23:27:07
    #38706893
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг текстовой строки
Users,

Используйте вместо кучи UNION-ов любую таблицу, где есть достаточно записей.

В будущем старайтесь использовать UNION ALL, а UNION - только там где это целенаправленно нужно, ибо требует заметно больше накладных расходов.
...
Рейтинг: 0 / 0
29.07.2014, 22:47:00
    #38708599
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг текстовой строки
miksoft,

спасибо, коллега. Натолкнули на очевидную, в общем-то, вещь.

Ну и со временными таблицами я нагородил - в ms sql их использование свободно, а в mysql то джойнить нельзя, то обновлять, то еще что-то... Заменил на постоянную таблицу - и сразу полегчало, убрал весь мусор.

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


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