ダイナミックナレッジベースとしてのOJNavi

はじめに

どこでもリゾルバの機能追加。

http://haseharu.org/labs/d_resolve/about.php

Google Scholarを追加し、OJNaviも追加してみました。Google Scholarは通常の検索対象のサービスとして追加し、OJNaviはCiNii Articles上でどこでもリゾルバを使用した場合のみリンクとして出現します。

Google Scholar

Web API的なものはないのでスクレイピング対応です。他のサービスと同様「タイトルベース」で検索した結果をスクレイピングしています。

OJNavi

上と同じく、Web API的なものはないので、スクレイピング対応です。ただし、タイトルではなくCiNii APIを通じてISSNを取得してISSNでの検索をした結果をスクレイピングしてます。Li:d techメンバーからNDL SearchやCiNii Articlesで書誌情報だけは出てくるけど、そこには書誌だけでフルテキストへのリンクがない、検索エンジンでもヒットしづらい論文がある、という声があったので、それならじゃあ、とOJNaviをみなしダイナミックナレッジベースとして取り入れてみました。

“オープンジャーナルナビゲーター(OJNavi)”、公開:無償電子ジャーナルの検索システム
http://current.ndl.go.jp/node/24369

先に書いた通り、CiNii Article上でどこでもリゾルバを起動させた場合しかOJNaviへのリンクはでません。

ちょっと整理

国内のNII,NDL,JSTをはじめとしたサービスへのタイトルベースでの横断検索と検索エンジンとしてのGoogle Scholarへのタイトルベースでの検索、に加えてOJNavi収録の有無をCiNii Articlesからチェックし、OJNaviの示すリソースリンク先までをシームレスにたどれるようになりました。

こまごまと修正

各サービスへの問い合わせは全て「並列」でやっていて高速処理化しています。あと今回、日本語文字列が入っているケースの場合は、Pubmed, arXivへの検索はかけないようにしたので少し処理を軽減。Bookmarkletにバージョンのチェック機能を追加しました。古いバージョンのBookmarkletを使っていると下記のように表示がでます。

f:id:haseharu:20131230174128p:plain

おわりに

今回のケースに関してもデータベースとして機能させるのか、ナレッジベースとして機能させるのか、有用なデータがあればあるほど機械可読なシステム設計かどうかの差は大きいと感じています。Web API的なものがなければスクレイピングするだけですが、やはりWeb API的なものを公開して欲しいなあと*1

*1:という自分が公開していない

どこでもリゾルバの公開

論文名とか書誌情報だけがころっと目の前にあったりなんかして、どこかにフルテキストがないかな、でもあっちもこっちも検索するのはめんどいよね、というシチュエーションで役に立つ仕組みはないかねと思って「Docodemo Resolver β」というものを作ってみました。

Docodemo Resolver β
http://haseharu.org/labs/d_resolve/about.php

起動自体は簡単で、Bookmarklet を作ったのでそれをブラウザに登録しておきます。論文名をテキスト選択した状態でさきほど登録した Bookmarklet をクリックすると中間窓*1が開きます。

下の方は切れていますが画面はこんな感じです。
f:id:haseharu:20131215173747p:plain

現在、中間窓に表示されるサービスは「CiNii Articles」「NDL Search」「J-STAGE」「JAIRO」「arXiv」「Pubmed」の6種類です。論文タイトル名をキーに6種類のデータベースに検索をかけます。PDF有無までわかると使いやすいだろうと思ってCiNii Articlesのみ表示させてます*2。中間窓から、フルテキストへ一直線でナビゲートできます。ただし、利用者の契約情報等持っていないので「無料で」見られるかどうか、はクリックするまでわかりません。

リンクリゾルバってサービスの提供側にがっちり組み込まれていて利用範囲が狭いなあ、1対多じゃなくて多対多の仕組みに持ち込めたら便利だよねえ、持ち運べたらいいのに、と思ったのがそもそもの始まり。そこから動的にナレッジベースを作れないかね、と思ったのがそもそもの始まりでぼんやり仕組みだけイメージしていたのですが、某研修で似たような案件があり役立つかなあ、と思い続きを作ってみました。

利用者の契約情報とかはほぼ無視でタイトルドリブンなナレッジベースの一つのカタチとしてありかなあ、と。

機械可読でPDF有無までデータ吐きだすようにしたらダイナミックナレッジベースを名乗ってもいいかなあ、と。

いやいやGoogle Scholarも対象に入れなきゃ使えないよね、と思いつつ、まだ入れてません*3

あとは、ふつーに横断検索の仕組みとして動くようにしてあります。

http://haseharu.org/labs/d_resolve/

*1:サーバ側で処理。haseharu.org側のプログラム

*2:あとは時間があるときにでも

*3:要望等いただけると嬉しいです

「Flat UI」

3ヶ月前にComing soon! とかいいつつ放置してある*1「Red Data Books」ではやりのフラットデザインでやってみるかー、と思って「Flat UI」をカタチだけ使ってみることに。

Flat UI
http://designmodo.github.io/Flat-UI/

Pro版もあるようですが、とりあえずフリーで使える範囲で。

Red Data Books
http://haseharu.org/labs/rdbs/

f:id:haseharu:20131124214242p:plain

これ、Bootstrapベースです。
http://getbootstrap.com/

けっこう、使いやすくっていいかもしれません。

*1:いつものこと

「情報管理」をkindleで読む

前に作ったJ-Stageの論文をkindleで読めるよう変換するスクリプトですがいまのところ特に問題なく使えています*1。公開後、図表等の画像もちゃんと表示するように少し手を加えました。

http://haseharu.hatenablog.com/entry/2013/03/17/071008

まとめてダウンロードできたら便利かもねえ、と思いつつ。でも全部読むことないし。

f:id:haseharu:20131124211612p:plain

1論文あたり3-4MBくらいの容量になるようです。図表等の画像がなければ100-200KB程度。新しいkindle paperwhite欲しいなあとも思いつつ。

*1:といっても情報管理くらいしか読んでないのですが

シェルスクリプト × Web API

シェルスクリプトでWeb API的なものを使うメモ。
たぶんWeb API的なものをつかってデータをがーっともらってくる場合、シェルスクリプトが一番手軽です。
ほんの数行でかけます*1

たとえば、CiNii API(RDF)を通じてNCIDを使って資料タイトルを取り出す。

1件だけなら1行*2

curl "http://ci.nii.ac.jp/ncid/AA12227144.rdf"  | xpath '//rdf:RDF/rdf:Description/dc:title[1]/text()'

curlでデータ取得してxpathxml解析。

看護・保健科学研究

いいですね。

100件とか1000件とかある場合。while文で。

 AA12227144
 AA11354292
 AN00023058
 AN10507651

NCIDを別ファイル(ncid.txt)で用意しておいて、

while read id
do
	DATA=$(curl "http://ci.nii.ac.jp/ncid/${id}.rdf")
	TITLE=$(echo ${DATA} | xpath '//rdf:RDF/rdf:Description/dc:title[1]/text()')
	echo ${id}'\t'${TITLE} >> ncid_result.txt
done < ncid.txt

で回します。

AA12227144	看護・保健科学研究
AA11354292	千葉看護学会会誌 = Journal of Chiba Academy of Nursing Science
AN00023058	榮養學雑誌	
AN10507651	日本精神科看護学会誌

無事データとれてます。

他にもたとえば、dc:languageあたりもとりたいよ、という場合、

LANGUAGE=$(echo ${DATA} | xpath '//rdf:RDF/rdf:Description/dc:language/text()')

で追加していけばおっけーです。
NCIDのマッチングが失敗した場合、別途失敗したNCIDをncid_false.txtに書き込む処理をif文で組み込んでみます。

while read id
do
	DATA=$(curl "http://ci.nii.ac.jp/ncid/${id}.rdf")
	FLAG=$(echo ${DATA} | grep 'DOCTYPE html')
	if [ "${FLAG}" == "" ]
		then
			TITLE=$(echo ${DATA} | xpath '//rdf:RDF/rdf:Description/dc:title[1]/text()')
			LANGUAGE=$(echo ${DATA} | xpath '//rdf:RDF/rdf:Description/dc:language/text()')
			DATE=$(echo ${DATA} | xpath '//rdf:RDF/rdf:Description/dc:date/text()')
			OWNERCOUNT=$(echo ${DATA} | xpath '//rdf:RDF/rdf:Description/cinii:ownerCount/text()')
			echo ${id}'\t'${TITLE}'\t'${LANGUAGE}'\t'${DATE}'\t'${OWNERCOUNT} >> ncid_result.txt
		else
			echo ${id} >> ncid_false.txt
	fi
	sleep 1
done < ncid.txt
AA12227144	看護・保健科学研究	jpneng	2001	5
AA11354292	千葉看護学会会誌 = Journal of Chiba Academy of Nursing Science	jpn	1996	49
AN00023058	榮養學雑誌		jpn	1941	406
AN10507651	日本精神科看護学会誌		jpn	1990	82

実はCiNiiでRDF取得する場合、失敗したときの値はxmlで返ってきません。「html」で表示されるため失敗時の条件判断は「grep 'DOCTYPE html'」で判定、という感じにしてあります。

*1:とはいえ、利用の前にちゃんとWeb API的なものの利用規約のご確認をお願いします。

*2:1件だけデータ取得、なんてシチュエーションなさそうですが

Red Data Books

はじめに

リードテックラボ、CiNii Booksで遊んでみる、の巻です*1。このところ id:kitoneid:otani0083 とあーでもないこーでもない、とやっていた成果の一部として「Red Data Books」というサービスを作りました。まだ試験公開でまったく機能が揃っていませんが。トップページに表示されているのは全国の大学図書館で1冊しか所蔵されていない図書です。ランダムに表示される仕組みになっています。

「へー、それだけ?」という反応かなと思います。はい、いまのところそれだけです。

しくみ

技術的な詳細は id:otani0083 が近々発表する予定なので、ここでは書きません。

このサービスの肝となっているのは「どの図書館がどんな本を持っているのか」というデータです。「全国の大学図書館における所蔵館数Nの図書リスト」であったり「各図書館が所蔵している図書リスト」があってはじめて「所蔵館数1の本をランダムで表示する」ということが実現できます*2

上のようなデータを集めるのは大変だけど今回のように実際に取得できた場合どんなことができるのか。下記のささくれエントリーのような視点で今後、機能を追加していきたいとおもっています。
http://cheb.hatenablog.com/entry/2013/08/24/173533

*1:遊んでる場合か、という突っ込みが突き刺さります。

*2:もちろんCiNii Booksからデータをもらっているのですが。そういった視点でデータを集めるとなると実はけっこう困難です。どうやったのかという詳細はおーたにさんの発表で。

旅のみちづれ

たぶんきっと id:otani0083id:kitone の粋な計らいで。さきほど、Skype参加でたのしそうな旅にまぜてもらえたので少しブログを書きたいと思います。内容はタイトルにぜんぜん関係なくただの作業メモです。

CiNiiのリンクの種類

必要があってCiNii Articlesの外部リンクとGETリクエスト内容の対応関係を調べていました。

f:id:haseharu:20130727233926p:plain

GETでは、

name=*

でリンク先の情報と、

id=*

で具体的な個別アイテムのIDを渡しているようです。しかし、けっこういろいろあってびっくり。

機関リポジトリ

http://ci.nii.ac.jp/lognavi?name=ir&lang=jp&type=pdf&id=http%3A%2F%2Fhdl.handle.net%2F11094%2F24780

name=ir , でJAIRO連携分です。

URLデコード後
http://hdl.handle.net/11094/24780

idで渡しているのは上のようにターゲット先となるURLがそのまま渡されています*1

CiNii Link

http://id.nii.ac.jp/1001/00091366/

外部無料本文へのリンクです*2

CiNii PDF オープンアクセス , 定額アクセス可能 , 未公開 , 有料

http://ci.nii.ac.jp/lognavi?name=nels&lang=jp&type=pdf&id=ART0010004370

name=nels , NII-ELS分ですね。

J-stage

http://ci.nii.ac.jp/lognavi?name=jstg&lang=jp&type=pdf&id=http%3A%2F%2Fjapanlinkcenter.org%2FDN%2FJST.JSTAGE%2Fnmc%2F52.697%3Ffrom%3DCiNii

name=jstg , idはirと同じくURLです。

URLデコード後
http://japanlinkcenter.org/DN/JST.JSTAGE/nmc/52.697?from=CiNii

JOIでリゾルブしていてfrom=CiNiiも渡していますね。

*1:ただ、この場合、handleシステムで処理されるのでクリック後に表示されるURLとイコールではありません。

*2:これってよく考えたことなかったのですがCiNii側で書誌同定やリンク張りをやってるのでしょうか

*3:info:、がついてますね。