Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Одинаковые тексты в большой базе, поиск и удаление совпадений 
:(
    Опции темы
knyshow
Дата 30.7.2010, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: нет
Всего: 2



Имеется большая база текстов (чуть больше 11000 текстов, средний размер текста 50Кб).
Часть текстов идентичны и отличаются только переносами строк, регистром символов, отступами от начала строки (может быть, а может не быть отступ в виде символа табуляции или пробела или нескольких табуляций/пробелов).
Часть текстов совпадают за исключением некоторой части (один текст идет полностью, а второй может быть без нескольких абзацев).


Вопрос: есть ли способ максимально автоматически найти совпадения? 
Есть ли алгоритм неточного сравнения строк, при котором на результат сравнения (скорее всего выраженный в %) не будут влиять знаки препинания, пробелы, табуляция?

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

Спасибо.

Это сообщение отредактировал(а) knyshow - 30.7.2010, 17:54
PM MAIL   Вверх
CruorVult
Дата 30.7.2010, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 868
Регистрация: 24.9.2008
Где: г.Киев, Украина

Репутация: нет
Всего: 28



PM MAIL Skype   Вверх
knyshow
Дата 30.7.2010, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: нет
Всего: 2



прочитал. причем тут замена?
PM MAIL   Вверх
CruorVult
Дата 30.7.2010, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 868
Регистрация: 24.9.2008
Где: г.Киев, Украина

Репутация: нет
Всего: 28



Вот к примеру, как будет работать поиск без учета пробелов и запятых:
Код

$sql = ".....where REPLACE(REPLACE(name,' ',''),',','') = '".str_replace(',','',str_replace(' ','',$name));


Ну это общая схема, можно и регулярками.

Это сообщение отредактировал(а) CruorVult - 30.7.2010, 20:17
PM MAIL Skype   Вверх
VictorTsaregorodtsev
Дата 30.7.2010, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 28.7.2006

Репутация: нет
Всего: 8



Цитата(knyshow @  30.7.2010,  17:52 Найти цитируемый пост)
Есть ли алгоритм неточного сравнения строк, при котором на результат сравнения (скорее всего выраженный в %) не будут влиять знаки препинания, пробелы, табуляция?

По частотному словарю, например.
Ну и 11000 текстов желательно будет дополнительно кластеризовать каким-нибудь алгоритмом автоматической классификации - чтобы искать тексты, ближайшие к обрабатываемому тексту, не среди всей большой кучи, а только среди кластера, к которому принадлежит этот искомый текст (ну и еще среди второго по близости к этому тексту кластера - вдруг текст окажется на "границе" и реально ближайший к нему другой текст будет в соседнем кластере)

Да - в тему не вернусь, я её случайно увидел среди новых тем, и отметился чисто ради саморекламы. 
PM MAIL WWW   Вверх
knyshow
Дата 31.7.2010, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: нет
Всего: 2



Цитата

Часть текстов совпадают за исключением некоторой части (один текст идет полностью, а второй может быть без нескольких абзацев).

CruorVult, тут есть еще и такая проблема.
PM MAIL   Вверх
CruorVult
Дата 31.7.2010, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 868
Регистрация: 24.9.2008
Где: г.Киев, Украина

Репутация: нет
Всего: 28



1 текст(фильтрованый): одинтекстидетполностьюавторойможетбытьбезнесколькихабзацев
2 текст(фильтрованый): полностьюавторойможетбытьбезнесколькихабзацев

совпадение: одинтекстидетполностьюавторойможетбытьбезнесколькихабзацев

В общем нужно разбить текст, по которому будут искатся совпадения,  на куски по абзацам или предложениям(в зависимости от нужной точности), отфильтровать и по каждому куску искать совпадения(использовав фильтрацию). 

Не знаю какие там есть алгоритмы, но я бы делал так. Я так понял нужно один раз отсеять тексты? тогда скорость выполнения не играет большой роли.
PM MAIL Skype   Вверх
knyshow
Дата 2.8.2010, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: нет
Всего: 2



Не то все :(
Пасип, буду искать дальше, о результатах доложу.

ЗЫ: время на самом деле роли не играет.
PM MAIL   Вверх
CruorVult
Дата 2.8.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 868
Регистрация: 24.9.2008
Где: г.Киев, Украина

Репутация: нет
Всего: 28



Цитата(knyshow @  2.8.2010,  10:53 Найти цитируемый пост)
Не то все :(


Что именно не то?

Цитата(knyshow @  30.7.2010,  17:52 Найти цитируемый пост)
Часть текстов идентичны и отличаются только переносами строк, регистром символов, отступами от начала строки (может быть, а может не быть отступ в виде символа табуляции или пробела или нескольких табуляций/пробелов).


1) вытягиваешь все тексты.
2) разбиваешь текст по предложениям( по "\r\n", ".", если надо то "\t" ) и сравниваешь каждое предложение данного теста с каждым предложением всех остальных.(предварительно отфильтровав ненужные знаки)
3) подситываешь количество совпавших предложений( вот тебе и процент от общего количества предложений в тексте).
4) формируешь массив данных, что-то типа:  

Код

array('text_id'=>array('coincided_text_id1'=>'90%','coincided_text_id2'=>'70%',...))


Главное немного включить мозги и не надо никуда бегать за какими-то алгоритмами  smile 
PM MAIL Skype   Вверх
skyboy
Дата 2.8.2010, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 8
Всего: 260



сам с аппаратом сравнения не знаком. просто поискал в google за тебя:
алгоритм шинглов: раз и два
алгоритм Рабина-Карпа

PM MAIL   Вверх
knyshow
Дата 12.8.2010, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 6.2.2010

Репутация: нет
Всего: 2



Сорри что пропал.
Задачу решил следующим образом:

- из базы в массив выгребаются все тексты;
- из текстов удаляются все символы, не отвечающие шаблону [A-Za-zА-Яа-я0-9];
- ну, а дальше самое смешное:

Код

        for($i = 0; $i < count($ras_base) ;$i++)
        {
            $search_for = substr($ras_base[$i]['content'], rand(0, strlen($ras_base[$i]['content']) - 255), 255);

            for($j = $i + 1; $j < count($ras_base) ;$j++)
            {
                if(strpos($ras_base[$j]['content'], $search_for))
                {
                    // совпадение
                }
            }
        }


Дальше совпадения, обнаруженные скриптом, анализировались редакторами. По их отзывам, нет ни одного ложного дубля.

CruorVult, спасибо за идею!


Цитата

google за тебя:
алгоритм шинглов: раз и два
алгоритм Рабина-Карпа

skyboy, поверь, я там был)
данные алгоритмы конфузятся при сравнении текстов, идентичных изначально, но в случае, когда один текст представляет собой мАлую часть второго.

Это сообщение отредактировал(а) knyshow - 12.8.2010, 20:00
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.