【问题标题】:Comparing data from two differently formatted xml feeds比较来自两个不同格式的 xml 提要的数据
【发布时间】:2013-04-17 14:23:23
【问题描述】:

我有这两个提要(在生产中会有更多)关于一个事件的票价 - 这两个提要的格式不同,但基本上显示相同的信息。

我想做的是比较价格属性并找到最低价格,我知道如何比较实际价格

if(floatval($feed1['price']) > floatval($feed2['price']]){
    return $feed1['price'];
}
else {
    return $feed2['price'];
}

但我难以理解的是如何确保我比较相同的事件价格,因为它们来自不同格式的提要。

即。我如何从两个提要中比较伦敦 HMV 音乐会的常设价格?

Feed 1

<type id="4558" name="Rolling Stones Concert" url="http://example1.com">
    <event id="52115351" name="HMV forum - London">
        <ticket name="Stalls" id="1354855" price="120"/>
        <ticket name="Standing" id="4654845" price="85"/>
    </event>

    <event id="52115351" name="Webley Arena - London">
        <ticket name="Stalls" id="4556147" price="110"/>
        <ticket name="Standing" id="9743466" price="95"/>
    </event>
</type>

Feed 2

<type id="5786" name="Rolling Stones Concert - World Tour" url="http://example2.com">
    <market id="45645634" name="London - HMV">
        <unit name="Seating" id="212770047" price="125"/>
        <unit name="Standing" id="212770046" price="80"/>
    </market>

    <market id="45645914" name="London - Wembley">
        <unit name="Seating" id="212770047" price="109"/>
        <unit name="Standing" id="212770046" price="99"/>
    </market>
</type>

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    您正在寻找名为Information extraction (IE) 的东西。这通常使用Natural language processing (NLP) 完成,例如你需要一些能够分析的程序

    <type id="4558" name="Rolling Stones Concert" url="http://example1.com">
    

    在第一个提要中表示与相同

    <type id="5786" name="Rolling Stones Concert - World Tour" url="http://example2.com">
    

    尽管存在差异,但在第二个提要中:

    id="4558"                     =/=  id="5786"
    name="Rolling Stones Concert" =/=  name="Rolling Stones Concert - World Tour"
    <event>                       =/=  <market>
    id="45645634"                 =/=  id="45645914"
    name="HMV forum - London"     =/=  name="London - HMV"
    <ticket>                      =/=  <unit>
    name="Stalls"                 =/=  name="Stalls"
    

    您可以想象,每次获得的新提要都会有所不同。如果您预先分析数据结构(例如 并且哪些属性属于彼此,那么您可以对值和做相似性分析。

    此外,如果有常见的同义词,例如 StallsSeating(反之亦然),您可以预先降低复杂性。

    [feed 1] -- streamline --> [sfeed 1]\                   / [combined feed]
                         ...             X compare / align X
    [feed N] -- streamline --> [sfeed N]/                   \ [unknown data]
    

    【讨论】:

    • 感谢@harke,当你说“你需要一些程序”时,是否有一些东西可以做到这一点,作为一个库或插件。或者你能指出我进一步阅读的方向吗?抱歉,如果这似乎是一个显而易见的问题,这是我学习 php 以来第一个真正的项目。
    • @sam:这有多个级别。我不擅长 NLP,所以我不能在这里提出任何建议(我知道有一个很棒的基于 python 的库)。对于提要中的 XML,您可以使用 DOMDocument 和 DOMXpath。此外,XSL 也会想到一些预先运行的转换(例如,重命名元素和属性名称以匹配您的首选命名)。但是做完之后,剩下的要么是手工制作,要么是借助一些对结构有所了解的 NLP。或许你找到IE领域的人可以提供更多建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多