ダイナミックナレッジベースとしてのOJNavi
はじめに
どこでもリゾルバの機能追加。
http://haseharu.org/labs/d_resolve/about.php
Google Scholarを追加し、OJNaviも追加してみました。Google Scholarは通常の検索対象のサービスとして追加し、OJNaviはCiNii Articles上でどこでもリゾルバを使用した場合のみリンクとして出現します。
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を使っていると下記のように表示がでます。
おわりに
今回のケースに関してもデータベースとして機能させるのか、ナレッジベースとして機能させるのか、有用なデータがあればあるほど機械可読なシステム設計かどうかの差は大きいと感じています。Web API的なものがなければスクレイピングするだけですが、やはりWeb API的なものを公開して欲しいなあと*1。
*1:という自分が公開していない
どこでもリゾルバの公開
論文名とか書誌情報だけがころっと目の前にあったりなんかして、どこかにフルテキストがないかな、でもあっちもこっちも検索するのはめんどいよね、というシチュエーションで役に立つ仕組みはないかねと思って「Docodemo Resolver β」というものを作ってみました。
Docodemo Resolver β
http://haseharu.org/labs/d_resolve/about.php
起動自体は簡単で、Bookmarklet を作ったのでそれをブラウザに登録しておきます。論文名をテキスト選択した状態でさきほど登録した Bookmarklet をクリックすると中間窓*1が開きます。
下の方は切れていますが画面はこんな感じです。
現在、中間窓に表示されるサービスは「CiNii Articles」「NDL Search」「J-STAGE」「JAIRO」「arXiv」「Pubmed」の6種類です。論文タイトル名をキーに6種類のデータベースに検索をかけます。PDF有無までわかると使いやすいだろうと思ってCiNii Articlesのみ表示させてます*2。中間窓から、フルテキストへ一直線でナビゲートできます。ただし、利用者の契約情報等持っていないので「無料で」見られるかどうか、はクリックするまでわかりません。
リンクリゾルバってサービスの提供側にがっちり組み込まれていて利用範囲が狭いなあ、1対多じゃなくて多対多の仕組みに持ち込めたら便利だよねえ、持ち運べたらいいのに、と思ったのがそもそもの始まり。そこから動的にナレッジベースを作れないかね、と思ったのがそもそもの始まりでぼんやり仕組みだけイメージしていたのですが、某研修で似たような案件があり役立つかなあ、と思い続きを作ってみました。
利用者の契約情報とかはほぼ無視でタイトルドリブンなナレッジベースの一つのカタチとしてありかなあ、と。
機械可読でPDF有無までデータ吐きだすようにしたらダイナミックナレッジベースを名乗ってもいいかなあ、と。
いやいやGoogle Scholarも対象に入れなきゃ使えないよね、と思いつつ、まだ入れてません*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/
これ、Bootstrapベースです。
http://getbootstrap.com/
けっこう、使いやすくっていいかもしれません。
*1:いつものこと
「情報管理」をkindleで読む
前に作ったJ-Stageの論文をkindleで読めるよう変換するスクリプトですがいまのところ特に問題なく使えています*1。公開後、図表等の画像もちゃんと表示するように少し手を加えました。
- るるるkindle
http://haseharu.hatenablog.com/entry/2013/03/17/071008
まとめてダウンロードできたら便利かもねえ、と思いつつ。でも全部読むことないし。
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()'
看護・保健科学研究
いいですね。
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'」で判定、という感じにしてあります。
Red Data Books
はじめに
リードテックラボ、CiNii Booksで遊んでみる、の巻です*1。このところ id:kitone と id:otani0083 とあーでもないこーでもない、とやっていた成果の一部として「Red Data Books」というサービスを作りました。まだ試験公開でまったく機能が揃っていませんが。トップページに表示されているのは全国の大学図書館で1冊しか所蔵されていない図書です。ランダムに表示される仕組みになっています。
- Red Data Books
「へー、それだけ?」という反応かなと思います。はい、いまのところそれだけです。
しくみ
技術的な詳細は id:otani0083 が近々発表する予定なので、ここでは書きません。
このサービスの肝となっているのは「どの図書館がどんな本を持っているのか」というデータです。「全国の大学図書館における所蔵館数Nの図書リスト」であったり「各図書館が所蔵している図書リスト」があってはじめて「所蔵館数1の本をランダムで表示する」ということが実現できます*2。
上のようなデータを集めるのは大変だけど今回のように実際に取得できた場合どんなことができるのか。下記のささくれエントリーのような視点で今後、機能を追加していきたいとおもっています。
http://cheb.hatenablog.com/entry/2013/08/24/173533
旅のみちづれ
たぶんきっと id:otani0083 と id:kitone の粋な計らいで。さきほど、Skype参加でたのしそうな旅にまぜてもらえたので少しブログを書きたいと思います。内容はタイトルにぜんぜん関係なくただの作業メモです。
CiNiiのリンクの種類
必要があってCiNii Articlesの外部リンクとGETリクエスト内容の対応関係を調べていました。
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 PDF オープンアクセス , 定額アクセス可能 , 未公開 , 有料
http://ci.nii.ac.jp/lognavi?name=nels&lang=jp&type=pdf&id=ART0010004370
name=nels , NII-ELS分ですね。
J-stage
name=jstg , idはirと同じくURLです。
URLデコード後
http://japanlinkcenter.org/DN/JST.JSTAGE/nmc/52.697?from=CiNii
JOIでリゾルブしていてfrom=CiNiiも渡していますね。
CrossRef
http://ci.nii.ac.jp/lognavi?name=crossref&id=info:doi/10.1093/gji/ggs116
name=crossref , idはDOIです*3。
日経BP
name=rss , idはURLです。
こちらをみるとまだ種類はあるようです。
http://ci.nii.ac.jp/info/ja/articles/manual_bib.html
以上、ざっくりとメモを。また気がついたら更新します。