このままでいっか

アニメとか,プログラミングとか,研究とか,思ったことをだらだらと書く感じで

solaにちょっとだけ実験的な機能つけてみた!

拙作のCommon LispShangrilaアニメAPI(アニメデータストア操作ライブラリ)のラッパーライブラリに機能を追加してみました.

github.com

どの機能もin progressで,全く完成の気配はないんですが,自分用のメモ程度に書き残しておきます.

そもそもこのライブラリ自体は,Shangrila本来の機能を十分にラップできているわけではないのですが,別のプロジェクトで使おうと思っている機能が意外とここで使えるのではないかと思ったので追加してみました.

追加したのは,DBpediaから,指定したタイトルを持つアニメの概要説明情報を検索する機能です.

こんな感じで使うことを想定しています.

CL-USER>  (sola:with-prefix (val)
               ((dbpedia-jp "http://ja.dbpedia.org/resource/")
            (rdf-schema "http://www.w3.org/2000/01/rdf-schema"))
               ((:select (nil ?p ?o)
             :distinct t
             :subject (dbpedia-jp "冴えない彼女の育てかた")
             :predicate (rdf-schema "#comment")))
    (format nil "~A~%"
          (caar
               (sola:get-single-key "O"
              (sola:request-dbpedia
               (sola:convert-query val))))))
=>『冴えない彼女の育てかた』(さえないヒロインのそだてかた)は、丸戸史明による日本のライトノベル。イラストは深崎暮人が担当している。単行本はKADOKAWA 富士見書房より、富士見ファンタジア文庫の書き下ろしの長編として2012年7月から既刊8冊(2015年6月現在)が刊行されている。また、短編も2冊刊行されている。

という感じです. この書き方は,僕が別プロジェクトで作っている(これもまだまだ開発中)cl-ignitionというSPARQLライブラリに準拠しています.

github.com

ちなみに,DBpediaとは,Wikipediaの情報をもとに,Linked Open Data(LOD)という,多少構造を持ったデータへと変換し,公開してくれているデータストアで,SPARQLというSQLに似た構文のクエリ言語を用いて検索を行います.

SPARQL言語の仕様はここ: W3C RDF用クエリ言語 SPARQLにあります.

これに基づいたクエリをDBpediaのSPARQL実行ページで試してみることができます. DBpedia SPARQL実行ページ

select distinct * where { <http://ja.dbpedia.org/resource/東京都> ?p ?o .  } LIMIT 100

SPARQL(というかRDF)では,「主語」,「述語」,「目的語」の関係に基づいてデータがストアされていて,上記のうようなクエリで問い合わせをします.

上記のクエリは,主語の部分が"http://ja.dbpedia.org/resource/東京都"である,述語と目的語を上限100件検索してくるというクエリです.

検索結果は次の画像のようになります.

f:id:dbym4820:20180701193200p:plain

例えば,画像の一番下のレコードは,P(Predicate:述語)が"http://www.w3.org/2000/01/rdf-schema#comment",O(Object:目的語)が"東京都(とうきょうと)は、日本国の首都であり、関東地方に位置する広域地方公共団体都道府県)の一つである。東京特別区多摩地域島嶼部(大島・三宅・八丈・小笠原)を管轄する。都庁所在地は新宿区。英語での都公認の表記は Tokyo Metropolis で、そのほかには Tokyo Prefecture と Tokyo Metropolitan Prefecture がある。"@jaになっています.

これは,主語が”東京都”に当てはまるデータの一つとして,Wikipediaの一言コメント(ほとんどが概要欄に当てはまる部分)部分が上記のものになっているということを表しています.

同様に,Wikipedianoページのタイトルであったり,その他のメタデータをベースに検索ができるというものです.

これを用いて,アニメ情報を取り出すAPI的なものを書こうと思いたち,部分的に実装してみました.

Roswellスクリプトとして実装しているsolaコマンドの1オプションとして加えてみました.

インストール,使い方はこんな感じです(Roswellがインストール済みなことが前提).

  • インストール
$ ros install dbym4820/sola
Installing from github dbym4820/sola
To load "sola":
  Load 1 ASDF system:
    sola
; Loading "sola"
....
; compiling file "/Users/tomoki/Dropbox/Project-Myself/sola/src/sola.lisp" (written 01 JUL 2018 07:05:15 PM):
; compiling (IN-PACKAGE :CL-USER)
; compiling (DEFPACKAGE SOLA ...)
; compiling (IN-PACKAGE :SOLA)
; compiling (DEFPARAMETER *SOLA-ENDPOINT* ...)
; compiling (DEFUN SET-SOLA-ENDPOINT ...)
; compiling (DEFPARAMETER *LATEST-MASTER* ...)
; compiling (DEFUN ALREADY-MASTER-P ...)
; compiling (DEFUN MAKE-REQUEST-URL ...)
; compiling (DEFUN COMPOSE-EVEN-ITEMS ...)
; compiling (DEFUN JSON-TO-ALIST ...)
; compiling (DEFUN GET-ANIME-MASTER ...)
; compiling (DEFUN GET-ANIME-DATA ...)
; compiling (DEFMACRO WITH-ANIME-API ...)
; compiling (DEFUN GET-ANIME-LIST ...)
; compiling (DEFUN GET-SINGLE-COLUMN ...)
; compiling (DEFUN GET-COLUMNS ...)

; /Users/tomoki/.cache/common-lisp/sbcl-1.4.4-macosx-x64/Users/tomoki/Dropbox/Project-Myself/sola/src/sola-tmp5GEXGEG5.fasl written
; compilation finished in 0:00:00.037
[1/3] System 'sola' found. Loading the system..
[2/3] Processing build-hook..
[3/3] Attempting to install the scripts in roswell/ subdirectory of the system...
Found 2 scripts: sola sola
/Users/tomoki/.roswell/bin/sola
/Users/tomoki/.roswell/bin/sola
up to date. stop
  • アニメ概要の取得
$ sola --abstract 冴えない彼女の育てかた

これを実行すると,

『冴えない彼女の育てかた』(さえないヒロインのそだてかた)は、丸戸史明による日本のライトノベル。イラストは深崎暮人が担当している。単行本はKADOKAWA 富士見書房より、富士見ファンタジア文庫の書き下ろしの長編として2012年7月から既刊8冊(2015年6月現在)が刊行されている。また、短編も2冊刊行されている。

という感じで結果が返ってきます.

DBpediaは,Wikipediaから人間が半手動でデータをコンバートしているようなので,データが取れないアニメとかもあるので,そのあたりは多少妥協がいりますね.

これを今後拡張しながら,なにかできないか,ちょっと考えようかなぁと思っています.

ちなみに,ある程度安定したCommon Lisp用SPARQLライブラリとしてcl-fusekiがありますが,これは日本語に少し弱い側面もあり,新しくモダンなものを作れないかなぁという感覚でcl-ignitionというのも少しずつ作り進めている感じです.

github.com

詳細な話は,ある程度仕様がかっちりしてきたら記事を書こうと思います.

参考文献