Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
8 / 8 / 3
Регистрация: 25.03.2015
Сообщений: 145

Ускорение работы скрипта-синонимайзера

24.07.2017, 21:33. Показов 1140. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть база синонимов в .txt виде
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function syn($row){
    $znak= array(" ",".",",",":",";"," - ","!","?");
    $fileSin = "syn.txt";
    $masSin=file($fileSin);
    $countSin=count($masSin);
 
    $len2=strlen($row);
    for ($t=0; $t<$countSin; $t++)
    {
        $sin=explode("|",$masSin[$t]);
        $pos=strpos($row, $sin[0]);
        $len=strlen($sin[0]);
        if ($pos > 1)
        {
            if ( ($pos + $len) < $len2 )
                if ( (in_array($row[$pos + $len], $znak)) AND (in_array($row[$pos - 1], $znak)) )
                {
                    $r=rand(2, count($sin));
                    $OldStr=$row[$pos-1].$sin[0].$row[$pos+$len];
                    $NewStr=$row[$pos-1].$sin[$r-1].$row[$pos+$len];
                    $row=str_replace($OldStr, $NewStr, $row);
                }
        }
    }
    return $row;
}
Вид базы:

практически сразу|оперативно
практические|утилитарные|практичные|фактические
практические основы|азы
практический|положительный|практичный|деловитый|полезный|дельный|реальный|реалистический|реалистичный|приземленный|фактический|эмпирический|прагматичный|прагматический|неакадемичный|утилитарный|прикладной|применимый|неакадемический
Практический|практичный| прикладной| применимый| дельный| полезный|прикладной|применимый|дельный|полезный

В файле 1,2 миллиона строк, соответственно, очень долго, может как-то оптимизировать? Какие варианты есть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.07.2017, 21:33
Ответы с готовыми решениями:

Ускорение работы php скрипта
Вот такой вопрос имеется пользователи которые будут отправлять запросы и нужно сделать чтобы это было и быстро, и занимало минимум места....

Ускорение работы PHP
Добрый день. Я начал проект, который пингует сервера при помощи следующего скрипта: function ping($host) { ...

Скрипт синонимайзера
Нужно помочь написать скрипт замены слов на синонимы. Уже неделю мучаюсь, не получается. Слова находятся в файле txt.txt Пример: ...

26
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
24.07.2017, 21:51
Цитата Сообщение от justtroodi Посмотреть сообщение
В файле 1,2 миллиона строк, соответственно, очень долго, может как-то оптимизировать?
Перенести из файла в БД, использовать индексы.
0
8 / 8 / 3
Регистрация: 25.03.2015
Сообщений: 145
24.07.2017, 22:15  [ТС]
Да я думал об этом, но как быть с такими строками:
практические|утилитарные|практичные|факт ические
Как делать поиск? Вообще слабо понимаю.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
24.07.2017, 22:28
Цитата Сообщение от justtroodi Посмотреть сообщение
как быть с такими строками:
практические|утилитарные|практичные|факт ические
Каждое слово хранить отдельно с идентификатором одинаковым для всех синонимов.
idkeyword
11практически сразу
21оперативно
32практические
42утилитарные
Индекс нужен по word и по key
1
8 / 8 / 3
Регистрация: 25.03.2015
Сообщений: 145
24.07.2017, 22:35  [ТС]
Да, спасибо, вот это то что мне нужно было. Гениальное - просто!
0
8 / 8 / 3
Регистрация: 25.03.2015
Сообщений: 145
30.07.2017, 11:25  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Каждое слово хранить отдельно с идентификатором одинаковым для всех синонимов.
Но тогда глупо бегать через всю базу. Сейчас в моей функции мы ищем вхождение слова из файла, можно сделать наоборот, но тогда синонимизация будет по одному слову, без фраз - это не решение. В бежать через всю базу и искать соответствия ресурсозатратно, как это можно сделать правильно?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
30.07.2017, 11:45
Что значит
Цитата Сообщение от justtroodi Посмотреть сообщение
бегать через всю базу.
?
Поиск по индексному столбцу - быстрая операция
Цитата Сообщение от justtroodi Посмотреть сообщение
без фраз - это не решение
Что мешает хранить фразу в бд?

Еще возможно стоит обратить внимание на такие технологии, как sphinx и elasticsearch. Возможно они могут поиск по синонимам, но точно не скажу.
0
8 / 8 / 3
Регистрация: 25.03.2015
Сообщений: 145
30.07.2017, 14:56  [ТС]
Да в том то и дело что фраза в бд есть, вот покажу пример: " а роза упала на лапу Азора" и дальше текст, вот как же мне вытащить именно фразу, а не первое слово, я же разбиваю функцией explode по пробелам и знакам пунктуации, но таким образом фразы не найти.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
30.07.2017, 16:00
Цитата Сообщение от justtroodi Посмотреть сообщение
как же мне вытащить именно фразу, а не первое слово
А чем тогда принципиально будет отличаться где хранить: в бд ил файле. В бд можно ведь не обязательно искать по полной фразе, а можно и по началу.
0
8 / 8 / 3
Регистрация: 25.03.2015
Сообщений: 145
30.07.2017, 20:20  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
А чем тогда принципиально будет отличаться где хранить: в бд ил файле. В бд можно ведь не обязательно искать по полной фразе, а можно и по началу.
Ну хорошо, допустим сделаю как говоришь:
"Владимир Путин подписал закон о запрете анонимайзеров
Теперь в России нельзя будет использовать технологии, позволяющие получить доступ к сайтам, заблокированным Роскомнадзором"
По какому началу искать? Вот было бы так просто. По словам то всё предельно ясно, просто раздели на слова. А тут же что будет фразой? "Владимир Путин" или "Владимир Путин подписал закон", или вообще не весь текст, если бы Вы могли привести пример хотя бы на тексте, был бы благодарен.

P.S. Новость поразила.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
30.07.2017, 20:39
Цитата Сообщение от justtroodi Посмотреть сообщение
По какому началу искать?
А если бы был файл, то как выделять фразы, как способ хранения влияет на поиск фраз в предложении?
Можно искать все фразы начинающиеся с первого слова, если найдена 1 фраза - значит она и есть. Если несколько то добавлять к поиску второе слово и т.д.
0
12 / 11 / 8
Регистрация: 30.11.2015
Сообщений: 422
30.07.2017, 21:02
justtroodi, LIKE через БД, ответ прост, не благодарите через цикл гнать и LIKE составить запрос в БД
0
8 / 8 / 3
Регистрация: 25.03.2015
Сообщений: 145
30.07.2017, 21:04  [ТС]
Ну блин, дело в оптимизации же, я там читаю 1,200,000 строк и каждую фразу или слово проверяю на вхождение в тексте. А в таблице 4,000,000 записей, значит если делать также, то в цикле их прогнать, оптимальности нет же. Все же 4 млн записей нехило так пройти-то и индексы не спасут.
0
12 / 11 / 8
Регистрация: 30.11.2015
Сообщений: 422
30.07.2017, 21:10
Индексы не спасут, условие на совпадение, а если совпадение есть, тогда строим запрос в БД

Добавлено через 2 минуты
ну и базу проиндексировать разумеется, только так, и все через цикл гнать foreach и LIKE строить запросы, отдавать что нужно, быстрее не получится на PHP, на питоне можно быстрее или перле, тогда Вам в другой раздел

Добавлено через 1 минуту
Поднимаем сначала файл, потом берем по строчке, потом в цикле через LIKE и если есть совпадение отдаем.
0
8 / 8 / 3
Регистрация: 25.03.2015
Сообщений: 145
30.07.2017, 21:17  [ТС]
Ну я думаю, что проще будет сделать так: что я знаю что фразы максимум из 3х слов в базе, поэтому просто разбиваем текст по 3 слова, 2, 1, если не находится.
0
12 / 11 / 8
Регистрация: 30.11.2015
Сообщений: 422
30.07.2017, 21:31
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
     $stroka = file(1);
    foreach ($stroka as $strochka) {
      $res = mysqli_query($line, "SELECT
                                                `id`,
                                                `key`,
                                                `word`
                                                FROM
                                                `base`
                                                WHERE 
                                                `word`
                                                 LIKE  '%".$strochka."%'");
                                                 if(mysqli_num_rows($res)==1){
                                                                    echo 'good';                                 
                                                 }
 
    }
?>
Как-то так гнать

Добавлено через 4 минуты
нее, Вы не ошибаетесь, попробуйте как я показал, по сути с таким принципом даже БД не нужна и индексация, все равно все будет виснуть если отдавать результат в миллион строчек, у меня код по такому принципу обрабатывает на доли секунды 1000 строк, ну код сам себя пишет, чуть логика другая, но суть одна, попробуйте. Будет находить любое вхождение в поле.

Добавлено через 41 секунду
Не, я чуть не так выразился, не отдавать, а перебирать, так точнее)

Добавлено через 3 минуты
но используя explode Вы будете еще нагружать систему разбирая массив, тут explode не надо

Добавлено через 2 минуты
если надо по каждому полю пройтись допишите and `key` LIKE ну и код тогда чуть переписать надо explode тогда будет разбирать $stroka, там же все через цикл, ну и сравнение

Добавлено через 1 минуту
даже еще точнее, а простая проверка на результат с базы
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
30.07.2017, 21:35
Цитата Сообщение от Salvat Посмотреть сообщение
LIKE *'%".$strochka."%'"
Вот это убивает весь смысл использования индексов. А если еще и в цикле такой запрос то тормозить будет сказочно. Я не просто так писал, что искать нужно по началу фразы, а не середине
0
12 / 11 / 8
Регистрация: 30.11.2015
Сообщений: 422
30.07.2017, 21:50
Верно, два тем более цикла будет использоваться, надо как-то упростить

Добавлено через 3 минуты
Нагрузка на БД, тут тогда надо мощное железо, ну или иксы минимум, попробуйте на Debian'e запустить или арче, центосе, но это будет мощно если запустите на арче)) еще вариант nginx тоже ускорит работу, проще дебиан в связке и nginx и MariaDB

Добавлено через 1 минуту
Мускуль просто слаб по сравнению с Марией и разрабы постоянно косячат(

Добавлено через 5 минут
А индексация базы ускоряет работу, надо перебирать все что в БД от ида до результата нужного. Коду проще работать с цифрами, чем с буквами.

Добавлено через 1 минуту
Он будет идти по цифрам, то есть по иду, найдя нужный результат вернет что имеется, вот и вся задачка))

Добавлено через 1 минуту
И человек спросил, как найти определенную фразу, а значит LIKE, а не начало
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
30.07.2017, 21:59
Цитата Сообщение от Salvat Посмотреть сообщение
Нагрузка на БД, тут тогда надо мощное железо
Тут надо правильные запросы, 1.2кк строк не так уж и много.
Цитата Сообщение от Salvat Посмотреть сообщение
но это будет мощно если запустите на арче))
что сложного то? pacman -S mysql-server
Цитата Сообщение от Salvat Посмотреть сообщение
еще вариант nginx тоже ускорит работу
При чем тут nginx, если пока узкое место - бд?
Цитата Сообщение от Salvat Посмотреть сообщение
Мускуль просто слаб по сравнению с Марией и разрабы постоянно косячат(
Да? А люди использует mysql в хайлоад проектах и не знают.

Еще раз повторю свое решения изходя из моего понимания проблемы
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Можно искать все фразы начинающиеся с первого слова, если найдена 1 фраза - значит она и есть. Если несколько то добавлять к поиску второе слово и т.д.
0
12 / 11 / 8
Регистрация: 30.11.2015
Сообщений: 422
30.07.2017, 22:07
Цитата Сообщение от Jewbacabra Посмотреть сообщение
При чем тут nginx, если пока узкое место - бд?
Апач потому что
Цитата Сообщение от Jewbacabra Посмотреть сообщение
что сложного то? pacman -S mysql-server
переконфигурировать, это не для тех кто винду юзает
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Можно искать все фразы начинающиеся с первого слова, если найдена 1 фраза - значит она и есть. Если несколько то добавлять к поиску второе слово и т.д.
порубить через пробел explode взяв первый ключик, вставить в LIKE

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Да? А люди использует mysql в хайлоад проектах и не знают.
Да, мне лично мало мускуля, я на все вопросы ответил и решил эту задачку на ходу. Ибо я работаю с нереальным объемом данных даже сейчас, Вы даже не представляете и знаю как код себя ведет. Уважаемый, я Вам доказывать ничего не собираюсь плюясь кодом, но что я сказал это факт. Мускуль г, nginx сменить апач, nginx сильнее апача.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.07.2017, 22:07
Помогаю со студенческими работами здесь

Human Emulator: ускорение работы действий
Использую Human Emulator, как сделать так что бы когда появилась кнопка на странице, сразу нажать на нее, при этом не ждать полностью ее...

Оптимизация и ускорение работы скрипта jquery
Приветствую! Нужна помощь знающих: 1. на сайте есть ротатор(карусель) 2. так же есть возможность свернуть и развернуть ротатор ...

Ускорение скрипта
Добрый день. Возникла проблема: надо проверить более 1000 прокси на доступ к сайту, а код который я написал делает это слишком медленно. ...

Ускорение работы компьютера, а так же работы Интернета (u22)
Когда допустим, включаю компьютер, у меня очень долго стоит заставка &quot;Добро пожаловать&quot; а так же компьютер мой, очень долго приходит в...

Ускорение работы компьютера, а так же работы Интернета
Как ускорить работы компьютера, и чтобы ПРИСУТСТВОВАЛА БЕЗОПАСНОСТЬ моего компьютера? моих данных. Отключил службы: Центр...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru