2010年11月17日水曜日
カスタマーレビューの有無によって表示を変更
JavaScriptだとクロスドメインの制限があるので、レビューの有無だけを調べるcgiを用意してajaxで問い合わせるようにしました。レビューのリンクは最初はグレーで表示し、レビューがあれば通常のリンク色(青)に、レビューが無ければ薄いグレーに変化します。背景色に対して目立つか溶け込むかでレビューの有無が分かります。
2010年11月16日火曜日
Amazonカスタマーレビューの表示判定
Product Advertising APIの仕様変更によって、カスタマーレビューを表示する方法がIFRAMEのみに限定されてしまいました。しかし、渡されたIFRAMEURLを常に表示していては、レビュー無しの空振りが多すぎます。IFRAMEの内容を加工しようとは思いませんが、IFRAMEの中を先読みして表示する/しないの切り替えは実装しようと思います。
底本とISBNの紐付け
青空文庫の底本情報にISBNがあれば便利と書きましたが、公開されているDB項目(data_item.csv)を見たらISBNはありませんでした。Amazonの検索を使えばかなり整備できると思うので、独自にやってみようと思います。底本にISBNが無い場合もあるので、全ての作品を関連付けることは出来ません。でも、一度やっておけばAmazonのAPI呼び出し回数を劇的に減らせるので、Aozoramazonとしては充分にメリットがあります。
ラベル:
Aozoramazon,
青空文庫
2010年11月15日月曜日
青空文庫の底本を検索してわかった事
Aozoramazonは当初、検索結果が空振り(検索結果なし)だったり、 関係無い書籍がヒットして本来の底本が埋もれてしまう事が今以上に起きていました。底本検索の考え方や、精度向上のために行った工夫を書き残しておきます。
主な 元ネタは公開日に書き込んだtwitterのログです。
http://twilog.org/ThinTube/date-101107
主な 元ネタは公開日に書き込んだtwitterのログです。
http://twilog.org/ThinTube/date-101107
- 検索は2種類の方法でやっています。基本的にItemSearchという点では共通ですが、条件の与え方が違います。一つはタイトル、出版社、著者を指定した底本検索、もう一つはこれらをキーワードとして同列に列挙するキーワード検索。
- 出版社名に「xx文庫、xx社」と入力されている場合が多いので、底本検索の検索条件に出版社を渡す場合は「、」の前を全て削除します。さもないと、まずヒットしません。
- 文庫名と類似する問題ですが、底本名に著者名を入れてしまっている場合があり、これも検索の障害になります。最近登録された例では、「龍馬の手紙、宮地佐一郎」があります。作品に登録されている著者と書籍の著者が異なるのですが、底本情報に著者の項目が無いため、他の項目に紛れ込んでいます。底本のタイトルに読点を含む他の作品に影響するため、一概に「、」以降を削除する訳にも行きません。この対策は諦めて、キーワード検索にマッチする事に望みを繋いでいます。
- 底本に「第五巻」とあるのをそのまま渡しても、AmazonのAPIでは大抵ヒットしません。Amazonでは「第5巻」のように巻数がアラビア数字になっている場合が多いです。そのままの底本名でヒットしない場合は漢数字をアラビア数字に置き換えて検索します。定量的に調べてはいませんが、これでずいぶんヒット率上がりました。あと、「巻」を省略することでヒットする事もあります。
- 底本優先で探すので、Titleの条件は底本名の次に作品名をトライします。次に作品名をTitleとして検索します。
- 底本がヒットしないとキーワード検索で適当に探します。新しい発見という意味では、その方が作品との出会いは増えますが、青空文庫の作品選択を助けるという意味では脱線気味です。
- 底本検索は出版社と著者を指定するので、割と確度が高いです。それに比べるとキーワード検索はいいかげん。でも、底本が見つからない場合は仕方ないので表示しますし、関連商品との出会いも楽しいといえば楽しいので、作品毎のページでは両方を表示します。
- 底本の情報にISBNがあれば、検索はとても楽、というか、検索するまでもなくカーリル等の書籍情報をダイレクトに表示できるはずです。
ラベル:
Aozoramazon,
青空文庫
生没年月日の不明な作者
青空文庫で公開されている作品の作者は、ペンネームの使い分けなどによる重複を含めて述べ695名。そのうち、生年月日未登録が186名、没年月日未登録が181名。Aozoramazonでは、その日に生まれた作者をトップページで表示しているが、生年月日不明な場合は表示対象とならない。日替わりトピックのネタとしては不完全なので、全ての作者を日替わりで満遍なく取り上げる良い術が無い物かと考えている。
2010年11月11日木曜日
青空文庫の第3第4水準漢字注記をUnicodeに置き換える
最近はWindowsもMacもJIS X 0213の第3第4水準を表示できるようなので、Aozoramazonで表示する作者名や作品名に含まれている青空文庫の注記をUnicodeに置き換えるようにしました。
で、そのために作ったPythonの変換モジュールとテーブルを置いておきます。
で、そのために作ったPythonの変換モジュールとテーブルを置いておきます。
- テーブル http://aozoranavi.appspot.com/jisx0213tbl.py.txt
- 変換モジュール http://aozoranavi.appspot.com/AozoraJisX0213.py.txt
コメントに書いてありますが、テーブルの元データはProject X0213からダウンロードしました。
ラベル:
Aozoramazon,
Python,
青空文庫
Pythonで漢数字をアラビア数字に変換
Aozoramazonの製作過程で漢数字をアラビア数字に変換する必要が生じて作りました。
使用例
出力
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
def kansuji2arabic(text):
"""漢数字からアラビア数字への変換"""
KANNUM_PATTERN = re.compile(u'(?P<kansuji>[壱一二弐三参四五六七八九十拾百千万萬億兆〇1234567890,,\d]+)')
index = 0
while index < len(text):
matched = KANNUM_PATTERN.search(text[index:])
if matched:
kansuji = matched.group('kansuji')
startindex = matched.start('kansuji') + index
endindex = matched.end('kansuji') + index
result = 0
digit = 1
numgroup = 1
kanindex = len(kansuji)
while kanindex > 0:
c = kansuji[(kanindex - 1):kanindex]
kanindex -= 1
if c == u'〇00':
digit *= 10
elif c in u'十拾':
digit = 10
elif c == u'百':
digit = 100
elif c == u'千':
digit = 1000
elif c in u'万萬':
numgroup = 10000
digit = 1
elif c in u'億':
numgroup = 10000*10000
digit = 1
elif c in u'兆':
numgroup = 10000*10000*10000
digit = 1
elif c in u',,':
pass
else:
if c in u'壱一11':
result += digit * numgroup
elif c in u'二弐22':
result += 2 * digit * numgroup
elif c in u'三参33':
result += 3 * digit * numgroup
elif c in u'四44':
result += 4 * digit * numgroup
elif c in u'五55':
result += 5 * digit * numgroup
elif c in u'六66':
result += 6 * digit * numgroup
elif c in u'七77':
result += 7 * digit * numgroup
elif c in u'八88':
result += 8 * digit * numgroup
elif c in u'九99':
result += 9 * digit * numgroup
digit *= 10
text = u'%s%d%s' % (text[:startindex], result, text[endindex:])
index = startindex + len('%d' % (result,))
else:
break
return text
使用例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import kan2arabic
def main():
examples = [u'平成22年度一般会計予算は92兆2292億円',
u'平成22年度一般会計予算は92兆2,292億円',
u'平成22年度一般会計予算は92兆2,292億円']
for text in examples:
print text, '->', kan2arabic.kansuji2arabic(text)
if __name__ == '__main__':
main()
出力
平成22年度一般会計予算は92兆2292億円 -> 平成22年度1般会計予算は92229200000000円
平成22年度一般会計予算は92兆2,292億円 -> 平成22年度1般会計予算は92229200000000円
平成22年度一般会計予算は92兆2,292億円 -> 平成22年度1般会計予算は92229200000000円
ラベル:
Aozoramazon,
Python
登録:
投稿 (Atom)