Все задачи

Классификация по Википедии

19 Dec 2013

Программисту понадобилась классификация слов и понятий, и он решил использовать Википедию как источник категорий. Разбирать ответ API Википедии предполагалось вот такой функцией:

use XML::LibXML::XPathContext;
use XML::LibXML;

=head2 parse_wikipedia_categories_xml

Получает на вход скаляр -- xml, полученный из API Википедии

Пример: 
http://en.wikipedia.org/w/api.php?action=query&prop=categories&titles=XML&format=xml&cllimit=100

<?xml version="1.0"?>
<api>
  <query>
    <pages>
      <page pageid="34138" ns="0" title="XML">
        <categories>
          <cl ns="14" title="Category:All articles containing potentially dated statements" />
          <cl ns="14" title="Category:Application layer protocols" />
          <cl ns="14" title="Category:Articles containing potentially dated statements from 2009" />
          ...
        </categories>
      </page>
    </pages>
  </query>
</api>

Результат был бы 
[
'Category:All articles containing potentially dated statements',
'Category:Application layer protocols',
'Category:Articles containing potentially dated statements from 2009',
...
]

=cut
sub parse_wikipedia_categories_xml
{
    my $xml = shift;

    my $xml_doc = XML::LibXML->new()->parse_string($doc);
    my $xc = XML::LibXML::XPathContext->new($xml_doc);
    return [ map {$_->to_literal} @{$xc->find("/api/query/pages/page/categories/cl/@title")}];
}

Но что-то здесь не так… Что?