Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Частичное совпадение во вложенном массиве

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
LML
Отправлено: 10 Июня, 2021 - 16:36:48
Post Id



Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2021  


Помог: 1 раз(а)




Здравствуйте!

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

Я решил эту задачу таким образом:

PHP:
скопировать код в буфер обмена
  1. $story = array('anekdot' => array('анекдо','анегдо','юмор','смеш','весели'),
  2.                'aforszm' => array('афори','изречен','умняк'),
  3.                'citata'  => array('цитата','цитиру','скажи'));
  4.  
  5. foreach ($story as $key => $val) {
  6.       foreach ($val as $v) {
  7.          if(mb_stripos($umsg, $v) !== false) {
  8.              
  9.         echo $key;
  10.         break;
  11.         }
  12.     }
  13. }


В таком виде всё работает. Но только, если в тексте есть одно совпадение с ключевым словом.

Если фраза будет такой:
PHP:
скопировать код в буфер обмена
  1. $umsg = 'Процитируй мне смешное знаменитое изречение';

Получаю сразу все ключи: anekdotaforszmcitata

Подскажите, как мне сделать, чтобы срабатывало только на одно ключевое слово?

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

(Отредактировано автором: 10 Июня, 2021 - 17:06:21)

 
 Top
don.bidon
Отправлено: 10 Июня, 2021 - 19:23:49
Post Id


Гость


Покинул форум
Сообщений всего: 78
Дата рег-ции: Март 2019  


Помог: 2 раз(а)




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $umsg = "Процитируй мне смешное знаменитое изречение";
  4.  
  5. $story = [
  6.     'anekdot' => ['анекдо', 'анегдо', 'юмор', 'смеш', 'весели'],
  7.     'aforszm' => ['афори', 'изречен', 'умняк'],
  8.     'citata'  => ['цитата', 'цитиру', 'скажи'], // в многострочных элементах массива принято оставлять необязательную запятую в конце
  9. ];
  10.  
  11. foreach ($story as $key => $val) {
  12.     foreach ($val as $v) {
  13.         if (mb_stripos($umsg, $v) !== false) {
  14.             echo $key;
  15.             break 2; // тут выход из двух циклов сразу
  16.         }
  17.     }
  18. }
  19.  

(Отредактировано автором: 10 Июня, 2021 - 19:25:23)

 
 Top
Vladimir Kheifets
Отправлено: 10 Июня, 2021 - 21:22:57
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




LML пишет:
Здравствуйте!
Нужно по частичному совпадению слова из фразы выдать то ли анекдот, то ли афоризм, то ли цитату.
Я решил эту задачу ...

Добрый день!
Вы решили замахнуть на искусственный интеллект и если более конкретно на смысловой анализ текста.
Вы думаете, что решили эту задачи с помощью массива с ключевыми словами, но на самом деле всё намного сложнее.
Если у Вас есть желание действительно серьёзно заняться этой задачей, то советую
Вам начать с теории и определениия критериев для распознавания этих текстов.
Вспомнил старый анекдот.
Цитата:
Африканец умирает от жажды в пустыне.
Находит сосуд.
Из него вылетает джин.
Джин предлагает ему исполнить три желания.
И получает в ответ:
1.хочу быть белым
2.хочу всегда иметь много воды
3.хочу иметь много женщин
Джин исполнил его желания и превратил в фаянсовый
унитаз в женском туалете.

Попробуйте проверить с помощью массива с ключевыми словами чем является этот текст.
На мой взляд, это наглядный пример некорректно поставленной задачи,
в которой всего одно пропущенное слово привело к получению абсурдного результата.
Удачи!
 
 Top
LML
Отправлено: 11 Июня, 2021 - 07:13:38
Post Id



Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2021  


Помог: 1 раз(а)




2 don.bidon Спасибо за помощь!
Пока я пытался решить проблему "в лоб", в голову пришло решение "в обход" - если мы получаем пару, или тройку массивов одновременно, просто переспрашиваем: "Из твоего вопроса я никак не могу понять, что ты хочешь прочитать - анекдот, афоризм, или цитату?"

2 Vladimir Kheifets Да. Вы угадали. Я пишу чат-бота. Даже не пишу, а модернизирую готовый плагин. На ИИ эта работа явно не тянет. И тех функций, что ему вкладываю - вполне достаточно, чтобы развлекать посетителей моего чата. То, что я пишу, даже в таком виде круче того, что было изначально, когда ответы на каждую реплику выбирались через if-else-strpos А?!
Если интересно, все мои доработки бота описаны тут: https://netsearch[dot]club/threads/j[dot][dot][dot]page-2#post-9229

Да. Моих знаний php явно не достаточно, чтобы писать что-то сложнее массивов с ключевыми словами. Я ведь не программист, а вот так и изучаю php, модернизируя свой чат.

Кстати, что вы можете сказать по поводу решения ботом задач по арифметике?
PHP:
скопировать код в буфер обмена
  1. $str = 'fdhdhf222-95=ппрлплрд';
  2. $s = preg_replace('/[^\d\+\-]+/', '', $str);
  3. echo "Ответ: ",$s;
  4.  
  5. $n = sscanf($s, "%d %d", $first, $last);
  6. $f = (float)$first+$last;
  7.  
  8. echo "= ",$f;

Сложнее сложения/вычитания мне получить не удалось.
Никак не могу вытащить из строки знаки математических действий и загнать их в переменную.

И по поводу, если кто захочет более сложное выражение.
Типа
PHP:
скопировать код в буфер обмена
  1. $umsg = 'fdhdhf222+95-7=ппрлплрд';


Я решил это, изменив часть
PHP:
скопировать код в буфер обмена
  1. $n = sscanf($s, "%d %d %d", $first, $last, $end);
  2. $f = $first+$last+$end;


А, если кто больше слагаемых подставит? Как поступить тут?
Или, хотя-бы ответить, что "Я такие длинные примеры не умею решать".

(Отредактировано автором: 11 Июня, 2021 - 07:38:48)

 
 Top
Мелкий Супермодератор
Отправлено: 11 Июня, 2021 - 11:11:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




LML пишет:
Кстати, что вы можете сказать по поводу решения ботом задач по арифметике?

То могу сказать, что это хорошая классическая учебная задача по программированию. Правильное направление - обратная польская запись, "Reverse Polish notation".


-----
PostgreSQL DBA
 
 Top
Vladimir Kheifets
Отправлено: 11 Июня, 2021 - 11:45:43
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




LML пишет:
А, если кто больше слагаемых подставит? Как поступить тут?Или, хотя-бы ответить, что "Я такие длинные примеры не умею решать".

Здесь любое количество чисел и знаки +-*/
Спойлер (Отобразить)

(Отредактировано автором: 11 Июня, 2021 - 11:51:11)

 
 Top
LML
Отправлено: 11 Июня, 2021 - 12:12:26
Post Id



Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2021  


Помог: 1 раз(а)




2 Мелкий Первый раз слышу об этом. Почитал. Интересно.
Даже нашёл алгоритм реализации обратной польской нотации https://github[dot]com/vasilenko-s/A[dot][dot][dot]lishNotation.php
Буду разбираться...

2 Vladimir KheifetsВстречал я подобные способы реализации. Но везде пишут - использовать только в обучающих программах! eval(), штука жутко нехорошая... А у меня кто угодно боту написать может.
 
 Top
Vladimir Kheifets
Отправлено: 11 Июня, 2021 - 13:39:13
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




LML пишет:
Встречал я подобные способы реализации. Но везде пишут - использовать только в обучающих программах! eval(), штука жутко нехорошая... А у меня кто угодно боту написать может.

с eval или без него необходимо убирать мусор из строки и оставлять только числа и знаки
Спойлер (Отобразить)

(дополнение)

LML пишет:
eval(), штука жутко нехорошая...

Как Вы думаете, почему эта "жутко нехорошая штука" не исключена из PHP и из JS?
Просто нужно не допускать, чтобы туда подал вредоностный код и за тем, что бы там было
действительно арифметическое выражение, т.е. строка кода, которая не выдаст фотальную ошибку.
Для этого нужно ставить обработчик ошибок и определиться, как на них реагировать.
В Вашем случае, можно реализовать польскую запись самостоятельно или
использовать eval и PHP интерпетатор сделает это лучше и быстрее чем Вы.

(Отредактировано автором: 12 Июня, 2021 - 06:46:55)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB