[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск неполных дублей текста
FatCat
Таблица слов и словосочетаний.
Нужно исключить внесение в таблицу неполных дублей.
Например, если в таблице уже есть "желтый чемоданчик", просто "чемоданчик" или "желтый" вносить не требуется. Дубли легко ловятся проверкой:
SQL
SELECT gid FROM glossary WHERE qtextr LIKE '%".strtolower($glossary_ru)."%'


Но представим обратную ситуацию: в таблице уже есть "чемоданчик", и мы хотим внести "желтый чемоданчик"...

Забрать всю таблицу в цикл и проверять в цикле? Таблица может быть о-о-о-очень большой...
Никак не соображу, можно ли как-то проверить средствами sql...



Спустя 21 минута, 24 секунды (20.09.2009 - 12:06) waldicom написал(а):
Написать хранимую процедуру, которая будет сама разбивать слова и искать по ним?

Спустя 14 минут, 31 секунда (20.09.2009 - 12:21) FatCat написал(а):
Цитата (waldicom @ 20.09.2009 - 13:06)
хранимую процедуру

Спасибо! Погуглил, интересно.

Спустя 18 часов, 51 минута, 25 секунд (21.09.2009 - 07:12) kirik написал(а):
FatCat
Как реализуешь, отпишись пожалуйста о результатах (скорость, тонкости в реализации).
Спасибо! smile.gif

Спустя 3 часа, 38 минут, 26 секунд (21.09.2009 - 10:50) FatCat написал(а):
Цитата (kirik @ 21.09.2009 - 08:12)
Как реализуешь

Задача переместилась из рубрики "нужно для работы" в рубрику "любопытно".
Для работы не потребовались нечеткие вхождения, потребовалось исключить только полные совпадения слов не считая количества пробелов, знаков препинания и прочего. Одновременно понадобилась копия строки в транслите.
Сделал транслитератор с отбросом всего лишнего
PHP
function ru2en($txt){
    while 
stristr($txtPHP_EOL)$txt str_replace(PHP_EOL" "trim($txt));
    while 
stristr($txt"  ")$txt str_replace(" "" "$txt);
    
$ru explode(" ","е ё ж ч ш ю я а б в г д з и й к л м н о п р с т у ф х ц щ ы э");
    
$en explode(" ","je jo zh ch sh ju ja a b v g d z i j k l m n o p r s t u f h c w y e");
    for(
$i=0;$i<count($en);$i++)$txt str_replace($ru[$i],$en[$i],$txt);
    
$txt str_replace(" / ","_i_",$txt);
    
$txt str_replace(" ","-",$txt);
    
$txt preg_replace"/[^a-zA-Z0-9-_]/"""$txt );
    
    return 
$txt;
}
Теперь отбрасываю лишь точные совпадения транслитерированных строк.

Результат можно посмотреть здесь. unsure.gif Русские строки заливаются ботом из мода дарлингов, мне остается лишь в режиме премодерации разрешить к показу нащелканные ботом страницы.

Спустя 18 часов, 4 минуты, 7 секунд (22.09.2009 - 04:55) kirik написал(а):
FatCat
Понятно, спасибо за ответ!) По неточным совпадениям было бы интереснее, на этой основе можно написать антиспам систему, чтобы одинаковые (или просто похожие) сообщения не постили.


_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.