自然言語処理の深遠

Deep Dive Into Natural Language Processing

Python で DBpedia から情報抽出する

自然言語処理では、ナレッジベース(knowledge base)を使う場合があります。 その際、手軽に使えるナレッジベースとして DBpedia があります。 DBpedia は Web 上でクエリ(SPARQL)を実行できるのですが、利便性を考えるとプログラムからクエリを実行したくなります。

本記事では、Python から DBpedia に対してクエリを実行し、結果を取得する方法を紹介します。 f:id:Hironsan:20170928115837p:plain

インストール

Python で SPARQL を実行するのは、SPARQLWrapper を使えばできます。 SPARQLWrapper はリモートのサーバに対してクエリを実行し、取得した結果を使いやすい形に変換することができます。

SPARQLWrapper が何かわかったところで、さっそくインストールしてみましょう。 pipを使って以下のコマンドを実行することで、SPARQLWrapper をインストールできます。

$ pip install sparqlwrapper

インストールはこれで終わりです。 次に、SPARQLWrapper の使い方を見ていきましょう。

使い方

SPARQLWrapper を使う際は、以下の手順を実行します。

  1. SPARQLWrapper をインスタンス
  2. インスタンス化したオブジェクトにクエリを設定
  3. クエリを実行して結果を取得

簡単なので、先にコードを見てみましょう。 以下のようなコードを書くことで、DBpedia に対してクエリを実行することができます。 ちなみに、日本の都道府県を取得しています。

from SPARQLWrapper import SPARQLWrapper

sparql = SPARQLWrapper(endpoint='http://ja.dbpedia.org/sparql', returnFormat='json')
sparql.setQuery("""                                                                                                                                                                      
    PREFIX dbpedia-owl:  <http://dbpedia.org/ontology/>                                                                                                                                  
    SELECT ?pref WHERE {                                                                                                                                                                 
    ?pref dbpedia-owl:wikiPageWikiLink category-ja:日本の都道府県.  }                                                                                                                    
""")
results = sparql.query().convert()

まず、インポートした SPARQLWrapperインスタンス化します。 インスタンス化する際に、endpoint と返り値の形式を指定することになります。 endpoint で叩く先を指定し、返り値の形式で取得結果の形式を指定します。

インスタンス化した後、setQuery メソッドを使用して、クエリを設定します。 ここには SPARQL のクエリを文字列として渡してあげます。 ここで設定したクエリを次の段階で実行します。

そして最後に、query メソッドでクエリを実行し、結果を取得します。 結果を取得した後、convert メソッドを用いて、結果を扱いやすい形に変換しています。

最終的に、以下のような結果が得られます。

>>> print(results["results"]["bindings"])
[{'pref': {'type': 'uri', 'value': 'http://ja.dbpedia.org/resource/内陸県'}},
 {'pref': {'type': 'uri',
           'value': 'http://ja.dbpedia.org/resource/都道府県独立国家論'}},
 {'pref': {'type': 'uri', 'value': 'http://ja.dbpedia.org/resource/県央地域'}},
 {'pref': {'type': 'uri', 'value': 'http://ja.dbpedia.org/resource/県民手帳'}},
 {'pref': {'type': 'uri',
           'value': 'http://ja.dbpedia.org/resource/都道府県別百科事典'}},
 {'pref': {'type': 'uri', 'value': 'http://ja.dbpedia.org/resource/佐賀県'}},
 {'pref': {'type': 'uri', 'value': 'http://ja.dbpedia.org/resource/兵庫県'}},
 {'pref': {'type': 'uri', 'value': 'http://ja.dbpedia.org/resource/北海道'}},
 {'pref': {'type': 'uri', 'value': 'http://ja.dbpedia.org/resource/和歌山県'}},
 {'pref': {'type': 'uri', 'value': 'http://ja.dbpedia.org/resource/大分県'}}
...

プログラムから情報抽出できるようになったことで、色々おもしろいことができそうです。

参考資料