За последние 24 часа нас посетили 21088 программистов и 1627 роботов. Сейчас ищут 873 программиста ...

Сравнить 2 страницы товаров

Тема в разделе "PHP для новичков", создана пользователем den1a, 7 окт 2016.

  1. den1a

    den1a Новичок

    С нами с:
    7 окт 2016
    Сообщения:
    7
    Симпатии:
    1
    Здравствуйте.

    Цель: хочу спарсить чужой и свой сайт.
    Получить цены на товары и вывести в виде таблицы.

    Проблема: товары одинаковые, но названия товаров немного разносные (кто как уже подписал)

    Вопрос: как соотнести по названию или url или фото товаров в таблицу соответствия. Что бы спарсили пару сайтов прогнали по таблице и вывели на экран в табличку с ценами.

    Пример:
    Ударная дрель Bosch GSB 19-2 RE Professional
    Дрель ударная Bosch GSB 19-2 RE Professional
    Дрель ударная электрическая Bosch, GSB 19-2 RE Professional БЗП

    Понятно, что товар один и тот же, но называются по разному.

    Заранее благодарен!
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Обсуждать парсинг сайтов запрещено правилами форума, использую API
     
  3. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Abyss нравится это.
  4. den1a

    den1a Новичок

    С нами с:
    7 окт 2016
    Сообщения:
    7
    Симпатии:
    1
    Парсинг обсуждать не будем. Интересует функция на сравнение строк.
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Сложно понять что это.
    Ручная Модерация и создание базы для разных названий одного и того товара
     
  6. den1a

    den1a Новичок

    С нами с:
    7 окт 2016
    Сообщения:
    7
    Симпатии:
    1
    1. Пример можно посмотреть здесь https://www.nulled.cc/threads/41225/page-2
    2. Ручной режим точно не вариант из-за объемов данных.
    --- Добавлено ---
    Код (Text):
    1. <?
    2.  
    3. class StringComparer {
    4.     public $commonWords = array(' ', ',', '.', 'mb', 'kb'); // add more
    5.     public $treshold = 0.5; // don't show anything with similarity less than 50%
    6.  
    7.     /**
    8.      * Convert to words array excluding common words
    9.      *
    10.      * @param string $word
    11.      * @return array
    12.      */
    13.     protected function excludeCommonWords($word) {
    14.         static $cache = array();
    15.         if (isset($cache[$word])) return $cache[$word];
    16.  
    17.         $word = trim(strtolower($word));
    18.         return $cache[$word] = array_diff(array_unique(explode(' ', $word)), $this->commonWords); // exclude common words
    19.     }
    20.  
    21.     /**
    22.      * Compare words of two strings
    23.      *
    24.      * @param string $s1
    25.      * @param string $s2
    26.      * @return float 0.8 means 80% of same words
    27.      */
    28.     protected function compareStringsOne($s1, $s2) {
    29.         $a1 = $this->excludeCommonWords($s1);
    30.         $a2 = $this->excludeCommonWords($s2);
    31.         $wordCount = (count($a1)+count($a2))/2;
    32.  
    33.         $intersect = array_intersect($a1, $a2); // found same words
    34.  
    35.         return count($intersect) / $wordCount;
    36.     }
    37.  
    38.     /**
    39.      * Compare words of string and string/array
    40.      *
    41.      * @param string $s1
    42.      * @param string/array $s2
    43.      * @return array
    44.      *         Result is like
    45.      *             string2 => 0.9
    46.      *             string string => 0.5
    47.      */
    48.     public function compareStrings($s1, $s2) {
    49.         if (!is_array($s2)) return $this->compareStringsOne($s1, $s2);
    50.  
    51.         $result = array();
    52.         foreach ($s2 as $s) {
    53.             $probability = $this->compareStringsOne($s1, $s);
    54.             if ($probability>=$this->treshold) {
    55.                 $result[$s] = $probability;
    56.             }
    57.         }
    58.         arsort($result);
    59.  
    60.         return $result;
    61.     }
    62.  
    63. }
    64.  
    65. $comparer = new StringComparer();
    66.  
    67. // one string
    68. $s1 = 'Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out OEM';
    69. $s2 = 'PCI-E DDR-2 Gigabyte GV-NX85T256H DVI SLI GeForce 8500GT';
    70. echo('<p>Вероятность: '.  ($comparer->compareStrings($s1,$s2)*100) .'%');
    71.  
    72. $s1 = 'Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out OEM';
    73. $a = array(
    74.     'PCI-E DDR-2 Gigabyte GV-NX85T256H DVI SLI GeForce 8500GT',
    75.     'Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out OEM',
    76.     'Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out',
    77.     'DDR-2 Gigabyte GV-NX85T256H DVI SLI GeForce',
    78. );
    79. echo('<p>Вероятности: <pre>');
    80. print_r($comparer->compareStrings($s1,$a));
    81. echo('</pre>');
    82.  
    83. ?>
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Хороший наверное пример, используй
     
  8. den1a

    den1a Новичок

    С нами с:
    7 окт 2016
    Сообщения:
    7
    Симпатии:
    1
    Спасибо, что не оставили тему не отвеченной!
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ставь лайки и задавай вопросы если есть, кто-то поможет
     
    den1a нравится это.
  10. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    @den1a Я вам дал ответ, что нужно использовать
    Можешь пояснить чем-же по твоему приведенный код лучше расстояния Левенштейна.
     
  11. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @Poznakomlus нет, если автор попробует два варианта и сравнит их, тогда думаю узнаем какой был лучше для его ситуации.
    Пусть Левенштейна тоже использует.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.119
    Симпатии:
    1.245
    Адрес:
    там-сям
    я считаю что задача в принципе не решается путем сравнения описаний. для уверенной идентификации товара надо иметь что-то надёжное: артикул производителя.
    в коде примера это может быть GV-NX85T256H но брать его надо не из строки описания а из более надёжного испочника.

    p.s. парсинг это фу!
     
  13. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    denis01 нравится это.