Прошу помощи в решении вот такой задачи:
Мне требуется проверять 1000 текстов на предмет дубликатов. При уровне схожести более ~90% отмечать найденную пару как дублирующуюся, сохранив процент схожести. Т.е. точно то, что делает функция:
similar_text($orig_content,$dup_content,$dup_per)
где переменной $dup_per присваивается значение процента схожести.
А дальше в цикле перебора у меня наступило "затмение": Сейчас я выбираю каждую из 1000 строк в MySQL-таблице и сравниваю её попарно с каждой из оставшихся 999.
В результате, скрипт, запущенный вчера, на данный момент еще дорабатывает.
Я пробовал уйти от использования функции similar_text, заменив её полнотекстовый поиском MySQL:
Для каждой из 1000 статей выполнял запрос вида:
SELECT `id`,MATCH (content) AGAINST ('$row[content]' IN BOOLEAN MODE) AS `per` FROM `table` WHERE MATCH (content) AGAINST ('$row[content]') >'90' ORDER BY (per)
Но мне не понятно как значения, отдаваемые функцией MATCH привести к проценту "схожести", отдаваемому функцией similar_text.
Скорее всего полнотекстовый поиск это именно то, что мне нужно, но как реализовать его подобно тому, как это делает similar_text и получать те же значения?
Спустя 2 дня, 4 часа, 13 минут, 38 секунд (30.07.2012 - 22:03) Kumena написал(а):
Может быть тема привлечет больше внимание профи в разделе MySQL?
Спустя 1 час, 4 минуты, 23 секунды (30.07.2012 - 23:08) kamanch написал(а):
Цитата |
Сейчас я выбираю каждую из 1000 строк в MySQL-таблице и сравниваю её попарно с каждой из оставшихся 999. |
Для чего?
1-ую сравниваем с 999 (2-1000)
2-ую с 998 (3-1000)
...
999-ую только с 1000-ой.
Спустя 6 часов, 51 минута, 56 секунд (31.07.2012 - 06:00) Kumena написал(а):
Kamanch, большущее спасибо! Ням-ням, какой вкусный совет
Не найдется ли еще совет знатока полнотекстовых MySQL - поисков?
В мануалах пишут, что MATCH возвращает "величину релевантности, т.е. степень сходства между строкой поиска и текстом".
Определить "на глаз" зависимость между этими значениями и процентом от функции similar_text не получилось.
Не найдется ли еще совет знатока полнотекстовых MySQL - поисков?
В мануалах пишут, что MATCH возвращает "величину релевантности, т.е. степень сходства между строкой поиска и текстом".
Определить "на глаз" зависимость между этими значениями и процентом от функции similar_text не получилось.
Спустя 6 минут, 34 секунды (31.07.2012 - 06:06) kamanch написал(а):
Как-то не было нужды в этом, поэтому ничем помочь более не могу.
Разве что ссылку подкинуть Полнотекстовый поиск в MySQL
Разве что ссылку подкинуть Полнотекстовый поиск в MySQL
Спустя 1 час, 5 минут, 14 секунд (31.07.2012 - 07:11) Kumena написал(а):
А может быть, стоит делать какой-нибудь хэш каждой статьи и сравнивать уже не сами тексты, а их контрольные суммы или что-то вроде этого?
Kamanch, еще раз спасибо!
Kamanch, еще раз спасибо!
Спустя 16 минут, 30 секунд (31.07.2012 - 07:28) kamanch написал(а):
echo md5('текст, с различем в одну запятую')."<br />";
echo md5('текст с различем в одну запятую');
На выходе:
308a67b193157a8434e48cf0b737b5fd
2bb1cc833c4ec00fb9df2d789dacce1a
Как видишь, ничего общего.
Спустя 50 минут, 24 секунды (31.07.2012 - 08:18) Nikitian написал(а):
А не пробовали soundex() для транслитерованной строки использовать? Soundex есть и в мускуле встроенный. Или расстояние левенштейна высчитывать - вам же относительность похожести нужна, а не абсолютность?
Спустя 8 часов, 40 минут, 12 секунд (31.07.2012 - 16:59) Kumena написал(а):
Расстояние Левенштайна ( levenshtein() ) пробовал, с неё начал, - замечательная штука, но при схожей с similar_text() скорости работы имеет ограничение на размер сравниваемых строк. В моем случае similar_text() - более подходящая штука.
soundex() не пробовал, т.к. не ожидаю от него кардинально лучшей скорости. Разве что вот именно встроенный MySQL-овский.
Посмотрел его описание в мануале: soundex() возвращает строку (в том виде как она звучит), т.е. сравнение пары строк проводить дальше всё равно нужно.
soundex() не пробовал, т.к. не ожидаю от него кардинально лучшей скорости. Разве что вот именно встроенный MySQL-овский.
Посмотрел его описание в мануале: soundex() возвращает строку (в том виде как она звучит), т.е. сравнение пары строк проводить дальше всё равно нужно.