データマイニングとその重要性
一般的な略語
API: アプリケーション プログラミング インターフェイス CDATA: 文字データ DOM: ドキュメント オブジェクト モード FTP: ファイル転送プロトコル HTML: ハイパーテキスト マークアップ言語 HTTP: ハイパーテキスト転送プロトコル REST: 表現状態転送 URL: ユニフォームリソース ロケーター W3C: World Wide Web Consortium XML: Extensible Markup Language
Wikipedia では、「データ マイニング」を次のように定義しています。データセットからのパターン。」これは非常に詳細な定義であり、おそらくほとんどの人の典型的な使用例を超えています。人工知能が使用されることはほとんどありません。通常、データ マイニングは、有用な情報を見つけるために大規模なデータ セットを検索して組み立てるだけです。
インターネットは急速に成長しており、膨大な量の情報を提供しているため、大量のデータを収集し、それを理解できることが重要です。 1 人で読むには大きすぎる大規模なデータ セットを収集し、それらを有用なデータに抽出することが重要な目標です。この記事ではこのタイプのデータ マイニングに焦点を当て、このデータを収集および解析する方法を具体的に説明します。
トップに戻る
データマイニングの実践的な応用例
データマイニングには多くの実践的な応用例があります。 Web サイトで提供される情報 (映画やコンサートの出席記録など) を検索するシナリオを想像するかもしれません。有権者記録などのより重要な情報を取得し、有用なデータを取得する必要がある場合があります。または、より一般的には、ソーシャル ネットワーク データを調べて、自社が言及される頻度や、その言及が肯定的なものであるか否定的なものであるかなど、ある種の傾向についてそのデータを解析したい場合があります。
トップに戻る
Web サイトをマイニングする前に注意すべきこと
先に進む前に、注意すべき点が 1 つあります。別の Web サイトからデータを抽出することを想定しています。処理したいデータがすでにある場合は、まったく別の話になります。 Web サイトからデータを抽出するときは、Web スクラブ (詳細は後ほど) を実行する場合でも、API を使用する場合でも、必ず利用規約を遵守する必要があります。スクラブを行う場合は、サイトのスクリプトのどの部分へのアクセスが許可されているかを説明するサイトの robots.txt ファイルに準拠するように注意することも必要です。最後に、サイトの帯域幅を妨げないことを確認してください。作成したスクリプトは、スクリプトが実行できる速度でサイトのデータに自由にアクセスすることはできません。そうしないと、ホスティングの問題が発生するだけでなく、スクリプトが「侵入的」すぎるという理由で禁止またはブロックされる危険性もあります。
トップに戻る
XML データ構造を理解する
データを抽出するためにどの方法を使用しても、データは XML (または HTML) 形式で受信される可能性があります。 XML によってデータの共有が可能になったとき、XML はインターネットの標準言語になりました。データを抽出する方法を検討する前に、まず XML の構造と XML データの処理方法を学ぶことが重要です。
XML ドキュメントの基本構造は、特に HTML を使用したことがある場合には非常に直感的です。 XML ドキュメント内のすべてのデータは、2 つの方法のいずれかを使用して保存されます。データを保存する主な方法は、ネストされたタグにデータを保存することです。以下は最も単純な例です。アドレスがあると仮定すると、データは次のようにドキュメントに保存できます:
<address>1234 Main Street, Baltimore, MD</address> ログイン後にコピー |
これらの XML データ ポイントをネストして、複数のアドレスのリストを作成できます。これらすべてのアドレスを別のタグ、この場合は location に入れることができます (リスト 1 を参照)。
リスト 1. XML 内の複数の住所
ログイン後にコピー |
このアプローチをさらに拡張するには、これらの住所を道路、市区町村、州のコンポーネント部分に分割することで、データ処理が簡素化されます。 。こうすることで、リスト 2 に示すように、より一般的な XML ファイルが作成されます。
リスト 2. XML で完全に分解されたアドレス
<locations> <address> <street>1234 Main Street</street> <city>Baltimore</city> <state>MD</state> </address> <address> <street>567 1st Street</street> <city>San Jose</city> <state>CA</state> </address> <address> <street>901 Washington Ave</street> <city>Chicago</city> <state>IL</state> </address></locations> ログイン後にコピー |
前述したように、XML データを格納するには 2 つの方法があり、そのうちの 1 つを今説明しました。もう 1 つの方法は、プロパティを通じてデータを保存することです。各タグには複数のプロパティを割り当てることができます。この方法はあまり一般的ではありませんが、非常に便利なツールです。場合によっては、一意の ID やイベント日付などの追加情報が提供されることがあります。より一般的なケースは、メタデータを追加することです。リスト 3 に示すように、住所の例では、type 属性を使用して住所が自宅の住所であるか職場の住所であるかを示すことができます。
リスト 3. XML に追加されたタグ
<locations> <address type="home"> <street>1234 Main Street</street> <city>Baltimore</city> <state>MD</state> </address> <address type="work"> <street>567 1st Street</street> <city>San Jose</city> <state>CA</state> </address> <address type="work"> <street>901 Washington Ave</street> <city>Chicago</city> <state>IL</state> </address></locations> ログイン後にコピー |
注意,XML 文档总是拥有一个父级根标记/节点,所有其他标记/节点都是该根标记/节点的子级标记/节点。XML 文档的开头部分还可以包含其他声明和定义,以及其他复杂内容(比如 CDATA 块)。强烈建议您参阅 参考资料 部分,以便进一步了解 XML。
回页首
解析 PHP 中的 XML 数据
您已经了解了 XML 的外观和结构,现在我们看看如何解析并以编程方式访问 PHP 中的 XML 数据。有几个针对 PHP 创建的库允许进行 XML 解析,每个库都有其优缺点。这些库包括 DOM、XMLReader/Writer、XML Parser、SimpleXML 等。对于本文的目的,我们主要关注的是 SimpleXML,这是因为它是一个最常用的库,同时也是我的最爱的库之一。
SimpleXML,顾名思义,旨在提供一个非常简单的接口来访问 XML。它可以将 XML 文档转换为内部 PHP 对象格式。访问数据点变得和访问对象变量一样简单。要使用 SimpleXML 解析一个 XML 文档,只需使用 simplexml_load_file() 函数(请参见 清单 4)。
清单 4. 使用 SimpleXML 解析文档
<?php$xml = simplexml_load_file('listing4.xml');?> ログイン後にコピー |
就这么简单!但是请注意,多亏了 PHP 的文件流集成,才可以在这里插入一个文件名或 URL,文件流集成会自动取回它。如果 XML 已经载入内存,还可以使用 simplexml_load_string()。如果您在 清单 3 中的 XML 上运行这个代码并使用 print_r() 来查看查看数据的大致结构,您将得到如 清单 5 所示的输出。
清单 5. 已解析的 XML 的输出
SimpleXMLElement Object ( [address] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [type] => home ) [street] => 1234 Main Street [city] => Baltimore [state] => MD ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [type] => work ) [street] => 567 1st Street [city] => San Jose [state] => CA ) [2] => SimpleXMLElement Object ( [@attributes] => Array ( [type] => work ) [street] => 901 Washington Ave [city] => Chicago [state] => IL ) )) ログイン後にコピー |
然后,您就可以使用标准的 PHP 对象访问和方法访问数据。例如,要回显某人居住过的每个州,可以通过迭代地址来实现(请参见清单 6)。
清单 6. 迭代地址
<?php$xml = simplexml_load_file('listing4.xml');foreach ($xml->address as $address) { echo $address->state, "<br \>\n";}?> ログイン後にコピー |
访问属性略有不同。与引用对象属性不同的是,您可以将属性作为数组值访问。您可以更改上面的代码样例来显示 type 属性,可以使用 清单 7 中所示代码实现上述操作。
清单 7. 添加属性
<?php$xml = simplexml_load_file('listing4.xml');foreach ($xml->address as $address) { echo $address->state, ': ', $address['type'], "<br \>\n";}?> ログイン後にコピー |
尽管上述所有示例都涉及迭代,但您也可以直接访问数据并使用您需要的特定信息片段,比如通过下面的代码提取第二个地址的街道地址:$xml->address[1]->street。
现在,您应该有一些基本工具来开始处理 XML 数据。有关的详细信息,强烈建议您参阅 参考资料 中列出的 SimpleXML 文档和其他链接。
回页首
PHP 中的数据挖掘:可能的方法
如前所述,可以用多种方法访问数据,其中两种主要方法是 Web 擦除和 API 使用。
Web 擦除
Web 擦除(scraping)是以编程方式下载所有 Web 页面并从中提取数据的操作。有很多图书专门讨论了这个主题(请参阅 参考资料)。我只简单列举进行 Web 擦除所需的一些工具。首先,PHP 使得将一个 Web 页读入为一个字符串变得非常简单。有许多方法可以完成这个任务,包括通过某个 URL 使用 file_get_contents(),但在这里,您希望能以一种有意义的方式来解析 HTML。
因为 HTML 实质上是一种基于 XML 的语言,所以将 HTML 转换为一种 SimpleXML 结构很有用。但是不能只使用simplexml_load_file() 加载 HTML 页面,因为即使是有效的 HTML,它仍然不是 XML。一种好办法是使用 DOM 扩展,将 HTML 页面作为 DOM 文档载入,然后将其转换为 SimpleXML,如 清单 8 所示。
清单 8. 使用 DOM 方法来获取 Web 页面的 SimpleXML 版本
<?php$dom = new DOMDocument();$dom->loadHTMLFile('http://example.com/');$xml = simplexml_import_dom($dom);?> ログイン後にコピー |
现在,您可以像对其他 XML 文档一样遍历 HTML 页面。因此,您现在可以使用 $xml->head->title 来访问页面标题,或者使用 $xml->body->div[0]->div[0]->div[0]->h4[0] 这样的引用来深入页面。
但是,正如您从上一个示例中可以预料到的那样,试图从一个 HTML 页面中查找数据有时可能非常不便,这是因为 HTML 页面通常不像 XML 文件那样有良好的结构。上面那行代码查找三个嵌套的 div 中的第一个 h4;在每种情况下,它都会查找每个父 div 中的第一个 div。
幸运的是,如果您只想查找页面上的第一个 h4,或者其他 “直接数据”,那么 XPath 是一种更简单的实现方法。XPath 是一个非常强大的工具,可以将它作为整个文章系列的主题(请参阅 参考资料 中列示的部分文章)。简言之,可以使用 '/' 来描述层级关系;因此,可以将前面的引用重写为下面的 XPath 搜索(请参见 清单 9)。
清单 9. 直接使用 XPath
<?php$h4 = $xml->xpath('/html/body/div/div/div/h4');?> ログイン後にコピー |
或者,您可以只使用 '//' 选项和 XPath,这将搜索所有文档,查找您要查找的标记。因此,您可以找到所有 h4,生成一个数组,然后使用下面的 XPath 访问第一个 h4:
'//h4'
遍历 HTML 分层结构
讨论上述转换和 XPath 的主要原因是,进行 Web 擦除的常见必要任务之一就是自动查找 Web 页面上的其他链接并追索它们,这允许您 “遍历” 网站,找到尽量多的信息。
如果使用 XPath,这个任务将非常麻烦。清单 10 提供了一个由所有带有 “href” 属性的 链接组成的数组,并允许您处理它们。
清单 10. 结合使用多种技术查找页面上的所有链接
<?php$dom = new DOMDocument();$dom->loadHTMLFile('http://example.com/');$xml = simplexml_import_dom($dom);$links = $xml->xpath('//a[@href]');foreach ($links as $l) { echo $l['href'], "<br />\n";}?> ログイン後にコピー |
现在,上面的代码找到了所有 链接,但如果您打开您发现的每个可能链接,您就开始快速 “爬行” 整个 Web。因此,最好增强您的代码,确保只访问两类链接:一类是有效的 HTML 链接(不是 FTP 或 JavaScript);一类是只返回(通过完整或相对域链接)同一个网站的链接。
一种更简单的方法是使用 PHP 的内置 parse_url() 函数在这些链接上进行迭代,该函数为您处理大量资格审查,如 清单 11 所示。
清单 11. 一个更健壮的站点遍历程序
<?php$dom = new DOMDocument();$host = 'example.com';$dom->loadHTMLFile("http://{$host}/");$xml = simplexml_import_dom($dom);$links = $xml->xpath('//a[@href]');foreach ($links as $l) { $p = parse_url($l['href']); if (empty($p['scheme']) || in_array($p['scheme'], array('http', 'https'))) { if (empty($p['host']) || ($host == $p['host'])) { echo $l['href'], "<br />\n"; // Handle URL iteration here } }}?> ログイン後にコピー |
关于 HTML 解析的最后一点说明是,对于所有 XML 类语言的一个统一接口,您复习了如何只使用 DOM 扩展将 HTML 转换回 SimpleXML。注意,DOM 库本身非常强大,可以直接使用。如果您非常熟悉 JavaScript 和使用 getElementsByTagName 之类的工具来遍历 DOM 文档树,那么您完全可以只使用 DOM 库,不使用 SimpleXML。
您目前应该已经拥有了从 Web 页面上擦除数据所需的工具。一旦您熟悉了本文前面详细介绍的技术,就可以从 Web 页面上读取任何信息,而不仅限于可以关注的链接。我们希望您不必执行这个任务,因为已经存在 API 或其他数据源。
使用 XML API 和数据
此时,您已经掌握了一些基本技能,能够访问和使用 Internet 上的主要 XML 数据 API。它们通常基于 REST,因此只需一个简单的 HTTP 访问就可以检索数据,并使用前面介绍的结束来解析数据。
每个 API 在这方面的表现都是不同的。我们无法一一介绍如何访问每个 API,因此,我们只简要介绍一些基本的 XML API 示例。一个最常见且已经采用 XML 格式的数据源就是 RSS feed。RSS 代表 Really Simple Syndication,通常是一种标准化的格式,用于共享频繁更新的数据,比如博客帖子、新闻标题或播客。要详细了解 RSS 格式,请参见 参考资料。注意,RSS 是一个 XML 文件,有一个名为
下面举例说明。假设我们使用 SimpleXML 来读取纽约时报标题的 RSS feed(参见 参考资料 获取到该 RSS feed 的链接)并格式化一列标题,那些标题都将链接到相应的正文(请参见 清单 12)。
清单 12. 读取纽约时报的 RSS feed
<ul><?php$xml = simplexml_load_file('http://www.washingtonpost.com/rss/homepage');foreach ($xml->channel->item as $item) { echo "<li><a href=\"{$item->link}\">{$item->title}</a></li>";}?></ul> ログイン後にコピー |
图 1 显示了来自纽约时报摘要的输出。
来自纽约时报摘要的输出
现在,我们来探索一个功能更全的基于 REST 的 API。Flickr API 是一个好的起点,因为它提供大量数据,但不需要身份验证。许多 API 都需要身份验证(使用 Oauth 或其他机制),以代表一个 Web 用户进行操作。这个步骤可应用于整个 API,或者只应用于部分 API。参阅每个 API 文档,了解如何进行身份验证。
要了解如何对一个未经身份验证的请求使用 Flickr API,您可以使用它的搜索 API。作为一个示例,我们搜索 Flickr 的所有公共十字弓照片。尽管不必进行身份验证,但与许多 API 一样,仍然需要生成一个 API 密匙,以便在访问数据时使用。请直接参阅 Flickr 的 API 文档,了解如何完成这个任务。拥有一个 API 密匙后,就可以使用 Flickr API 的搜索功能进行探索,如 清单 13 所示。
清单 13. 使用 Flickr API 搜索 “crossbow”
<?php// Store some basic information that you need to reference$apiurl = 'http://api.flickr.com/services/rest/?';$key = '9f275087e222ee395c92662437bf84a2'; // Replace with your own key// Build an array of parameters that you want to request:$params = array( 'method' => 'flickr.photos.search', 'api_key' => $key, 'text' => 'crossbow', // Our search term 'media' => 'photos', 'per_page' => 20 // We only want 20 results);// Now make the request to Flickr:$xml = simplexml_load_file($apiurl . http_build_query($params));// From this, iterate over the list of photos & request more info:foreach ($xml->photos->photo as $photo) { // Build a new request with this photo's ID $params = array( 'method' => 'flickr.photos.getInfo', 'api_key' => $key, 'photo_id' => (string)$photo['id'] ); $info = simplexml_load_file($apiurl . http_build_query($params)); // Now $info holds a vast amount of data about the image including // owner, GPS, dates, description, tags, etc ... all to be used. // Let's also request "sizes" to get all of the image URLs: $params = array( 'method' => 'flickr.photos.getSizes', 'api_key' => $key, 'photo_id' => (string)$photo['id'] ); $sizes = simplexml_load_file($apiurl . http_build_query($params)); $small = $sizes->xpath("//size[@label='Small']"); // For now, just going to create a simple display of the image, // linked back to Flickr, with title, GPS info, and more shown: echo <<<EOHTML<div> <a href="{$info->photo->urls->url[0]}"> <img src="{$small[0]['source']}" width="{$small[0]['width']}" height="{$small[0]['height']}" /> </a> <ul> <li>Title: {$info->photo->title}</li> <li>User: {$info->photo->owner['realname']}</li> <li>Date Taken: {$info->photo->dates['taken']}</li> <li>Location: {$info->photo->location->locality}, {$info->photo->location->county}, {$info->photo->location->region}, {$info->photo->location->country} </li> </ul></div>EOHTML;}?> ログイン後にコピー |
图 2 显示了这个 Flickr 程序的输出。您的十字弓搜索结果包括一些照片和每张照片的相关信息(标题、用户、位置和摄影日期)。
图 2. 来自清单 13 的 Flickr 程序的示例输出
您已经看到,这样的 API 是多么强大,以及如何在同一个 API 中结合各种调用来获取所需的数据。通过这些基本技术,您可以挖掘任何网站和信息源的数据。
考虑一下,如何通过一个 API 或 Web 擦除获取对数据的编程访问。然后使用所展示的方法来访问并迭代所有目标数据。
回页首
存储和报告提取的数据
最后,存储和报告数据在很多方面都是最容易的部分,可能也是最有意思的部分。当您决定如何根据您的实际情况处理这个方面时,您可以任意发挥您的想象力。
通常,获得您收集的所有数据并将它们存储到某个数据库中。然后,设计您的数据结构,使其与您计划将来访问数据的方式相符。此时,尽量多存储一些信息,将来有可能会用到它们。尽管总是可以删除数据,但一旦数据太多,检索额外的信息可能是一个痛苦的过程。但最好还是在刚开始就多存储一些数据,毕竟,您永远也不会知道哪些数据可能会派上用场。
将数据存储到数据库或类似的数据存储器中之后,就可以创建报告了。创建报告可能很简单,只需针对数据库运行几个基本的 SQL 查询,查看某个数据出现的次数即可;或者,报告创建也可能是非常复杂的 Web 用户接口,旨在允许用户深入数据并发现数据之间的关系。
当您辛辛苦苦将所有数据分门别类后,便可以想象一些显示数据的创新方法。
回页首
结束语
通过本文,您了解了 XML 文档的基本结构,以及使用 SimpleXML 来解析 PHP 中的 XML 数据的一种简单方法。您还增加了以类似方式处理 HTML 的能力,并初步了解了如何遍历一个网站,获取没有以 XML 格式提供的数据。通过这些工具,结合本文提供的一些示例,现在您已经拥有了良好的知识基础,可以开始对某个网站进行数据挖掘了。关于这个主题还有许多知识需要学习,无法在一篇文章中对它们进行一一介绍。关于增加您的数据挖掘知识的其他方法,请参阅 参考资料。
回页首
下载
源代码 | datamining_source.zip | 10KB | HTTP |
关于下载方法的信息