Отвечу на вопросы по php/mysql/html/css/js

izbushka
На сайте с 08.06.2007
Offline
110
#21
systemiv:
Я Вас понял. Примерная логика должна быть такой:
1. Берем массив словосочетаний, и перебираем его в цикле.
2. В цикле отдельное словосочетание разбиваем регуляркой на отдельные слова, и пробуем найти вхождения разных вариантов расположения этих слов в тексте через функцию substr_count(). При положительном результате, делаем str_replace() этого словосочетания в тексте на <b>словосочетание</b>

У меня вопрос больше не по php наверное, а по комбинаторике: как реализовать выбор всех возможных последовательностей слов из массива (т.е. как составить все возможные словосочетания из слов массива)? Алгоритм можете предложить? Массив может быть любого размера.

DV
На сайте с 01.05.2010
Offline
644
#22

Так же по алгоритму БД вопрос. На ум пошлый пример приходит, извините:

Список мужчин, список женщин. Противоположный пол может иметь контакты друг с другом.

Завожу две таблицы: М, Ж.

Как реализовать учёт контактов? Отдельная таблица, в которой добавляются как строки, так и столбцы, или… не делал такие вещи ещё.

VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
systemiv
На сайте с 05.07.2012
Offline
60
#23
izbushka:
У меня вопрос больше не по php наверное, а по комбинаторике: как реализовать выбор всех возможных последовательностей слов из массива (т.е. как составить все возможные словосочетания из слов массива)? Алгоритм можете предложить? Массив может быть любого размера.

Посмотрите приложение, думаю это то что Вам нужно. То что Вы хотите, это называется код Грея.

zip BruteKey.zip
systemiv
На сайте с 05.07.2012
Offline
60
#24
DenisVS:
Так же по алгоритму БД вопрос. На ум пошлый пример приходит, извините:
Список мужчин, список женщин. Противоположный пол может иметь контакты друг с другом.
Завожу две таблицы: М, Ж.
Как реализовать учёт контактов? Отдельная таблица, в которой добавляются как строки, так и столбцы, или… не делал такие вещи ещё.

Почитайте в сторону связи MANY TO MANY.

izbushka
На сайте с 08.06.2007
Offline
110
#25
systemiv:
То что Вы хотите, это называется код Грея.

Спасибо, то что надо

Оптимизайка
На сайте с 11.03.2012
Offline
396
#26
systemiv:
Я Вас понял. Примерная логика должна быть такой:
1. Берем массив словосочетаний, и перебираем его в цикле.
2. В цикле отдельное словосочетание разбиваем регуляркой на отдельные слова, и пробуем найти вхождения разных вариантов расположения этих слов в тексте через функцию substr_count(). При положительном результате, делаем str_replace() этого словосочетания в тексте на <b>словосочетание</b>

Простите, но данный алгоритм не эффективен, т.к. при росте количества ключевых слов сложность алгоритма растёт экспоненциально. Необходимо делать наоборот, разбивать исходный текст на слова и искать наиболее длинные последовательности по словарю ключевых слов.

Вот так:


<?php

$tags = array('разные', 'ключевые', 'слова');
$source = 'Это текст содержащий ключевые слова разные а также слова ключевые и разные слова';

$found = 0;
$buf = null;
foreach(explode(' ', $source) as $token) {
if (in_array($token, $tags)) {
$found++;
$buf .= $token . ' ';
} else {
if ($buf) {
echo '<b>' . trim($buf) . '</b> ';
}
$found = 0;
$buf = null;
echo $token . ' ';
}
}
if ($buf) {
echo '<b>' . trim($buf) . '</b>';
}

?>

Результат выполнения:

Это текст содержащий <b>ключевые слова разные</b> а также <b>слова ключевые</b> и <b>разные слова</b>
⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
systemiv
На сайте с 05.07.2012
Offline
60
#27
Оптимизайка:
Простите, но данный алгоритм не эффективен, т.к. при росте количества ключевых слов сложность алгоритма растёт экспоненциально. Необходимо делать наоборот, разбивать исходный текст на слова и искать наиболее длинные последовательности по словарю ключевых слов.

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

izbushka
На сайте с 08.06.2007
Offline
110
#28
Оптимизайка:
Простите, но данный алгоритм не эффективен, т.к. при росте количества ключевых слов сложность алгоритма растёт экспоненциально. Необходимо делать наоборот, разбивать исходный текст на слова и искать наиболее длинные последовательности по словарю ключевых слов.

Спасибо за идею.

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

Тоже перебирать текст по словам и искать регекспом вхождение в массив ключей?

C
На сайте с 04.02.2005
Offline
291
#29

Оптимизайка, а не подскажете, зачем нужна переменная $found?

Оптимизайка
На сайте с 11.03.2012
Offline
396
#30

Она не нужна :) Это просто пример, который я накидал на скорую руку для демонстрации работы алгоритма.

---------- Добавлено 11.01.2013 в 16:47 ----------

izbushka:
Спасибо за идею.
А если усложнить задачу и учитывать морфологию: возьмем простой вариант - окончания (последние две буквы)
Тоже перебирать текст по словам и искать регекспом вхождение в массив ключей?
Да, также. Просто вместо сравнения слова из текста и ключевого слова будет не in_array (посимвольное сравнение), а более сложная функция сравнения, учитывающая морфологию.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий