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]   

> Описание: Алгоритм сравнения строк
SergeiAzarov
Отправлено: 19 Июня, 2008 - 16:18:45
Post Id


Новичок


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


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




Подскажите пожалуйста каким образом можно организовать сравнение 2-х строк.
Ситуация такова: у себя на сайте хочу публиковать новости взятые с различных rss источников. Случается такое что в разных источника пишут одинаковые новости (вплоть до полного совпадения) с похожими заголовками. Соответственно хочу отсеч такие дупликаты, используя анализ текста заголовка. Заголовки одинаковых новостей чаще всего состоят из примерно одних и тех же слов. Пробовал сравнивать функциями обработки строк: levenstein, similar_text (и т.п.), но результата не достиг, поскольку перестановка слов местами играет значительную роль в получаемых результатах. Сейчас работаю в таком направлении: преобразуем заголовки в массивы строк, исключаем из массива все предлоги (по длине или по списку значений), сравниваем полученные массивы. Если отличия в массивах не превышает какого-то числа делаем вывод о том что заголовки схожи и исключаем новость из обработки.
Помогите плз, может кто-то где то видел что-то подобное.
 
 Top
valenok Модератор
Отправлено: 19 Июня, 2008 - 18:01:35
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




можно попробовать проверять на совпадение слов
Тоесть превращать обе новости в массив строк
и для каждого слова проверять есть ли оно во втором массиве.
Считать совпадения причём колво слов из меньшего масива находящихся в большем.
Если разница в колве слов очень большая то публикуем большую статью без проверок.

Дальше возьмём две разных статьи и проверим процент совпадающих слов.
Повторим операцию несколько раз и выявим " среднюю схожетсь" разных статей.

Если разница между двумя статьями будет в пределах "средней схожести" то публикуем обе.


-----
Truly yours, Sasha.
 
My status
 Top
DarthPadla
Отправлено: 10 Марта, 2015 - 14:54:10
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Июнь 2012  


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




Ап темы. Столкнулся с практически той же проблемой, гугл мне ничего не сказал.
Добавлю к тому,что написал автор.конкретный пример -

top.rbc.ru:На место Сергея Капкова назначен глава Мосгорнаследия
vesti.ru:Сергей Капков покинул правительство Москвы
lenta.ru:Собянин принял отставку Капкова
interfax.ru:Капков ушел в отставку с поста главы департамента культуры Москвы

и как вот определить, что это одно и то же? ТС,решил проблему?
 
 Top
Zveryugaz
Отправлено: 14 Марта, 2015 - 14:43:39
Post Id



Гость


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


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




DarthPadla пишет:
top.rbc.ru:На место Сергея Капкова назначен глава Мосгорнаследия
vesti.ru:Сергей Капков покинул правительство Москвы
lenta.ru:Собянин принял отставку Капкова
interfax.ru:Капков ушел в отставку с поста главы департамента культуры Москвы

и как вот определить, что это одно и то же? ТС,решил проблему?


Думаю только анализом текста, то-есть самой статьи
 
 Top
GoDr
Отправлено: 14 Марта, 2015 - 16:02:18
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


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




Это очень сложная математическая система. Но можно применить несколько интересных решений.... но это чисто для человека, который просто ворует новости и делается свой сайт популярным (якобы) Радость

во-первых:
valenok пишет:
можно попробовать проверять на совпадение слов
Тоесть превращать обе новости в массив строк
и для каждого слова проверять есть ли оно во втором массиве.
без обид, но нужно знать не слова, а их значимость. Например, совпали 1000 слов "убить", но не совпало только одно слова "путин" и "обама" Подмигивание
В данной ситуации нужно делать приоритет слов. А это уже большие затраты и большая работа.

И далее...

Форматирование на сайтах разное, а значит if $str1 == $str2 не прокати.
Для этого нам нужно:

1. мы считаем что слова имеющие менее 3-х букв (не считая слова из цифр) не актуальны. Это скорее всего союза и что-то такое подобное.

2. Нам не нужны пробелы, точки, запятые, тире, кавычки и т.п. и т.д.

Тут мы уже получаем первое правило:
- нужно из текста вытащить все слова по правилам: если слово состоит из только цифр, только букв, цифр и "примеси".
- нужно вытащить слова не менее 3-х знаков. Это не распространяется на слова "только цифры" и "цифры с примесью"

Теперь мы имеем массив слов. И можем смело выставлять приоритеты

1. Допустим если совпали все слова из букв - ставим 10
2. Если совпали все слова с цифрами - ставим 5
3. если совпали все слова с цифрами с "примесью" - ставим 2

Результат
- 17 - полное совпадение
- 15 - возможное совпадение
- 10 - общее совпадение

Чуть поясню...
[1] буквы - тут всё понятно.. Слово есть слова.. его трудно поменять как то. Но есть варианты: Иванов, Иванова, Иванову...
Тогда мы можем добавить ещё одно правило к словам из "букв". Удаляем гласные из слов и получаем дополнительное правило
- если совпали все слова из букв без окончаний - ставим 8
- если совпали все слова из букв - ставим 2
Как видно мы 10 разделили на две части. Т.е. результат можно ещё более сделать "интеллектуальным"

[2] только цифры... очень кратко..
- 100 = сто
- 1000 = 1 тысяча
- и т.п.
Если это предусмотреть то можно "Результат" ещё более сделать "интеллектуальным"

[3] цифры с примесью.. Всё просто
30-х годов = 30 годов
2-летие = 2-х летие = 2 летие
И опять же .... как в [2]

Т.е. мы получили общее правило, а потом начали его дробить... т.е. создавать "интеллект" Улыбка ну это при условии что всё будет делать скрипт...


В общем где-то так. Надеюсь информация будет полезной

(Отредактировано автором: 14 Марта, 2015 - 16:04:07)



-----
Система управления веб-содержимым Lotos CMS
 
 Top
Ts.Saltan
Отправлено: 14 Марта, 2015 - 19:42:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 384
Дата рег-ции: Дек. 2013  
Откуда: Belarus


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




DarthPadla пишет:
Ап темы. Столкнулся с практически той же проблемой, гугл мне ничего не сказал.
Добавлю к тому,что написал автор.конкретный пример -

top.rbc.ru:На место Сергея Капкова назначен глава Мосгорнаследия
vesti.ru:Сергей Капков покинул правительство Москвы
lenta.ru:Собянин принял отставку Капкова
interfax.ru:Капков ушел в отставку с поста главы департамента культуры Москвы

и как вот определить, что это одно и то же? ТС,решил проблему?


Я бы решил это так:
1. Строки делятся на массив слов
2. Массивы прогоняются в цикле, удаляются предлоги (слова меньше 3-4 символов)
3. Stemmer (http://vk.cc/3zqAdC) небольшая библиотека, позволяющая обрезать морфемы слова, оставив только корень (т.е. от слов деревья и дерево останется дерев)
4. В цикле прогоняем элементы массивов стеммером, слова переводим в нижний регистр
5. Сортируем массивы по алфавиту
6. Сравниваем массивы array_diff

Для сравнения нужно ввести коэффициент, например, 50%
PHP:
скопировать код в буфер обмена
  1. if(
  2.    sizeof(array_diff($arr1,$arr2))/sizeof($arr2)<0.5
  3. ) //Тексты разные - похожих слов меньше 50%
  4. else //Тексты похожи
  5.  


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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB