Объедините файлы XML на основе сходства записей

Мне нужно объединить по-разному структурированные файлы XML с помощью PHP. То, что я делаю, это;

  1. Прочитайте первый XML-файл, используя simplexml_load_file()
  2. Переформатируйте элементы, используя новую структуру, используя SimpleXMLElement() учебный класс
  3. Сделайте то же самое для другого файла, увеличивая первый SimpleXMLElement() пример
  4. Сохраните новый объединенный файл XML.

Все идет нормально. Сложная часть, первый файл имеет ок. 3000 записей и второй файл имеет 5000. Почти 2000 из этих записей на самом деле одинаковы; просто, может быть, пара букв отличается. Как например; «Lenovo G50-70 CoreI5», а другой может быть «Lenovo G5070 I5».

Вопрос в том, как сопоставить запись первого файла с равной записью второго файла; так что на самом деле это всего лишь одна запись в новом объединенном файле?

Я использую оба similar_text() функция PHP и SmithWatermanGotoh для расчета сходства и совпадения с результатом 86%; этого мне достаточно. Но итерирование всех записей другого файла для сопоставления только одной записи оказывается довольно неразумным и потребляет много ресурсов. Beucase это значит ок. 7 МБ файла загружаются в память, выполняя минимум 15.000 итераций каждый раз, когда я сохраняю новый обновленный файл.

Я рекомендую вставить все записи в таблицу базы данных и использовать поиск Sphinx для сопоставления записей; но я не уверен, если это действительно достаточно помогает.

2

Решение

Лучший подход, который я видел, — это использование пользовательского обратного вызова с array_uintersect() функция. Этот способ работает в таких шагах, как;

1- Напишите функцию сравнения, которая будет вычислять сходство. Проверьте array_uintersect() Руководство от php.net, чтобы иметь представление о том, как вам нужно написать эту функцию обратного вызова. Скажи, что это имя будет find_similar_entries()

2. Соберите обе записи из разных XML-файлов в два массива соответственно. (Для быстрого способа сделать json_encode()сначала, а потом json_decode()назад.)

3- Имейте функцию пересечения найти похожие записи, как; $similar_products = array_uintersect($xml_array1, $xml_array2, 'find_similar_entries');

4- Теперь у вас есть похожие записи, собранные в один массив.

5- Позвонить array_diff() удалить похожие записи из исходных массивов.

6. Наконец, объедините все три массива в новую структуру XML по вашему желанию, используя SimpleXMLElement() учебный класс.

Примечание 1: я использовал similar_text() и SmithWatermanGotoh, чтобы вычислить сходство, и они хорошо работают вместе, я могу сказать. Но когда дело доходит до очень близких названий продуктов, которые могут отличаться только на несколько символов друг от друга, они оказываются «идентичными». Вы ничего не можете с этим поделать, кроме извлечения отличительных слов из строк. Как «название модели» в моем случае.

Примечание 2: Этот метод работает, как и ожидалось, но функции пересечения в PHP содержат ошибку, которая делает эти функции такими медленными. я создал отчет об ошибке для этого. Пересечение не сравнивает элементы двух массивов только перекрестно; но он также сравнивает собственные элементы массива. Это на самом деле нелогично, поскольку пересечение можно рассчитать только путем сравнения как минимум двух сторон. Таким образом, сравнение одного массива изнутри не является «пересечением». Вот почему, если у вас большие файлы, ваш скрипт умрет, если вы просто запустите это прямо. Может быть, вы можете сделать это куском за кусок.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]