根据条目相似性组合XML文件

时间:2016-10-25 15:25:17

标签: php xml sentence-similarity

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

  1. 使用text
  2. 读取第一个XML文件
  3. 使用simplexml_load_file() class
  4. 使用新结构重新格式化元素
  5. 对另一个文件执行相同操作,递增第一个SimpleXMLElement()实例
  6. 保存新合并的XML文件。
  7. 到目前为止一切顺利。棘手的部分是,第一个文件有约。 3000个条目和第二个文件有5000个。这些条目中有近2000个实际上是相同的;只是可能有几个字母不同。比如说; “联想G50-70 CoreI5”和其他可能是“联想G5070 I5”。

    问题是,如何将第一个文件的条目与第二个文件的相等条目进行匹配;所以在新的组合文件中实际上它恰好只有一个条目?

    我正在使用PHP的SimpleXMLElement()函数和SmithWatermanGotoh来计算相似度,它的得分为86%;这对我来说已经足够了。但是,迭代另一个文件的所有条目以仅匹配一个条目对我来说是非常不明智和资源消耗。 Beucase意味着约。每次我保存新的更新文件时,7MB的文件加载到内存中,至少执行15.000次迭代。

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

1 个答案:

答案 0 :(得分:1)

我能看到的最佳方法是使用array_uintersect()函数的自定义回调。这种方式可以像以下一样工作;

1-编写一个计算相似度的比较函数。检查来自php.net的array_uintersect()手册,了解如何编写此回调函数。说它的名字是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-最后,使用SimpleXMLElement()类,根据您的意愿将所有三个数组合并为一个新的XML结构。

注1:我使用similar_text()和SmithWatermanGotoh来计算相似度,它们可以很好地协同工作。但是当谈到非常接近的产品名称时,它们之间可能只有几个字符不同,它们最终会相同的#34;。除了从字符串中提取区别词之外,你无能为力。喜欢"型号名称"就我而言。

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