2

我需要使用 PHP 组合不同结构的 XML 文件。我正在做的是;

  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 这意味着大约。每次我保存一个新的更新文件时,都会将 7MB 的文件加载到内存中,至少进行 15.000 次迭代。

我考虑将所有条目插入数据库表并使用 Sphinx Search 来匹配条目;但我不确定它是否真的有足够的帮助。

4

1 回答 1

1

我能看到的最好的方法是使用带有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()以从原始数组中删除类似的条目。

SimpleXMLElement()6- 最后,根据您的意愿,使用类将所有三个数组组合成一个新的 XML 结构。

注1:我使用similar_text()和 SmithWatermanGotoh 来计算相似度,我可以说它们一起工作得很好。但是当涉及到非常接近的产品名称时,它们之间可能只有几个字符不同,它们最终会“相同”。除了从字符串中提取有区别的单词之外,您无能为力。就我而言,就像“型号名称”一样。

注意 2:此方法按预期工作,但我认为 PHP 的交集函数有一个错误,这使得这些函数如此缓慢。我为此创建了一个错误报告。Intersection 不只横向比较两个数组的元素;但它也比较数组自己的元素。这实际上是不合逻辑的,因为只能通过比较至少两方来计算交集。因此,从内部比较一个数组实际上并不是“交集”。这就是为什么如果你有大文件,如果你直接运行它,你的脚本就会死掉。也许你可以一块一块地做。

于 2016-11-01T17:04:09.183 回答