バリケンのRuby日記 RSSフィード

2009-05-09

[] 英文テキストから単語数を調べる  英文テキストから単語数を調べる - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  英文テキストから単語数を調べる - バリケンのRuby日記  英文テキストから単語数を調べる - バリケンのRuby日記 のブックマークコメント

d:id:umedamochioさんが、ご自身の著書「シリコンバレーから将棋を観る―羽生善治と現代」を「翻訳してウェブにアップするのは自由」と宣言してから、あっという間に英訳プロジェクトが立ち上がって、すでにドラフト版として全訳が公開されているみたい。すごいすごい!

せっかくだから、これを題材に「あるテキストファイルの中に出てくる単語を多い順に出力するプログラム」をプログラミング言語Rubyを使って書いてみたよ。ちなみに、Rubyについては以前d:id:umedamochioさんがコラムを書いているよ。

count = Hash.new(0)

while line = gets
  words = line.downcase.gsub(/[\.<>\(\)\[\]\"\?!;:#\/]/,' ').
    split(/,?\s+/).map {|e| e.gsub(/(\A\'+|\'+\z)/, '')}
  words.each do |word|
    count[word] += 1
  end
end

dict = count.to_a.sort

count.values.uniq.sort.reverse.each do |value|
  dict.select {|e| e[1] == value}.each do |word, number|
    puts "#{word}: #{number}"
  end
end

このプログラムをテキストエディタで「wordcount.rb」というファイル名で保存して、コマンド入力画面で

ruby wordcount.rb < input.txt > output.txt

と入力してね。input.txtが単語数を調べたい英文ファイル、output.txtが結果を保存するファイルだから、適宜読み替えてね。

あ、もちろんこのプログラムを実行するにはRubyをインストールしておく必要があるよ。

はじめに(Preface)」を調べてみたところ、次のような結果になったよ。

shogi: 68
i: 60
the: 57
to: 51
a: 36
and: 34
that: 34
of: 29
on: 25
my: 23
it: 20
(以下省略)

「shogi」が一番たくさん出てくる単語なのは、将棋の本だからかな?

こんな感じで、プログラミング言語Rubyを使えば英文テキストを色々と分析することができるよ。ほかにもテキストの分析のやり方は色々あるから、色々な観点から分析して推敲に参加するのも面白いんじゃないかなあ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20090509

2009-01-04

[] トラックバックPing URLを自動検知する  トラックバックPing URLを自動検知する - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  トラックバックPing URLを自動検知する - バリケンのRuby日記  トラックバックPing URLを自動検知する - バリケンのRuby日記 のブックマークコメント

トラックバック技術仕様書」っていうのがあるんだね。トラックバック技術仕様書を読めば、トラックバックがどのように実装されているのかを理解することができるよ。

「トラックバック技術仕様書」には「あるサイトのURLが分かれば、そのサイトのトラックバックPing URLを自動検知する方法」も書かれているよ。でも、実装例はPerlで書かれているみたい。

じゃあ、この「トラックバックPing URLの自動検知スクリプト」をRubyで書き直してみよう!discover_tbメソッドの引数にURLを文字列として与えると、そのPermalinkに対応するトラックバックPing URLを文字列で返すよ。もしそのサイトがトラックバックPing URLを持っていない場合や、持っていてもPermalinkに対応するトラックバックPing URLが見つからない場合はnilを返すよ。

require 'uri'
require 'open-uri'

def discover_tb(url)
  begin
    c = URI.parse(url).read
    regexp_rdf = /(<rdf:RDF.*?<\/rdf:RDF>)/m
    raise unless c.match(regexp_rdf)

    rdfs = c.slice(/<rdf:RDF.*<\/rdf:RDF>/m)
    url_no_anchor = url.sub(/#.*\z/, '')

    regexp_dc_identifier = /dc:identifier="([^"]+)"/
    regexp_trackback_ping = /trackback:ping="([^"]+)"/
    regexp_about = /about="([^"]+)"/

    while rdfs.sub!(regexp_rdf, '')
      rdf = $1.to_s
      perm_url = rdf.slice(regexp_dc_identifier, 1)
      if perm_url == url || perm_url == url_no_anchor
        if rdf =~ regexp_trackback_ping
          return $1
        elsif rdf =~ regexp_about
          return $1
        end
      end
    end
  rescue
    nil
  end
end

if __FILE__ == $0
  p discover_tb('http://d.hatena.ne.jp/muscovyduck/')
  p discover_tb('http://d.hatena.ne.jp/muscovyduck/20080406')
  p discover_tb('http://d.hatena.ne.jp/muscovyduck/20080406#1207510313')
end

実行結果だよ。

$ ruby discover_tb.rb
nil
nil
"http://d.hatena.ne.jp/muscovyduck/20080406"
$
トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20090104

2008-07-14

[][] バリケンのPython日記  バリケンのPython日記 - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  バリケンのPython日記 - バリケンのRuby日記  バリケンのPython日記 - バリケンのRuby日記 のブックマークコメント

バリケンの中の人がAsakusa.rbに参加してきたみたい。

「最近日記更新しないんですか?」と聞かれたみたいだけど、どうやら最近は「バリケンのPython日記」のほうを書いているみたいだよ。

RubyPythonの比較とかもしているみたいだから、Python日記のほうもよろしくね。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20080714

2008-04-04

[][] Flickrの検索を使ってチベット関連の写真URLを出力  Flickrの検索を使ってチベット関連の写真URLを出力 - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  Flickrの検索を使ってチベット関連の写真URLを出力 - バリケンのRuby日記  Flickrの検索を使ってチベット関連の写真URLを出力 - バリケンのRuby日記 のブックマークコメント

またスクレイピングで。本当はAPIを使ったほうがいいと思うよ。

$KCODE = 's'

require 'open-uri'

require 'rubygems'
require 'hpricot'

uri = URI.parse("http://flickr.com/search/?q=tibet")

page = Hpricot.parse(uri.read)

page.search("img.pc_img").each do |e|
  puts(e["src"])
end

実行結果だよ。

C:\ruby>ruby tibet_photo.rb
http://farm3.static.flickr.com/2211/2212600119_eee3c2c5ac_m.jpg
http://farm2.static.flickr.com/1369/533859852_4500a6d52f_m.jpg
http://farm3.static.flickr.com/2395/2331107271_827281c0e9_m.jpg
http://farm2.static.flickr.com/1030/808332107_3455fec835_m.jpg
http://farm1.static.flickr.com/94/271203745_2bb16f0484_m.jpg
http://farm2.static.flickr.com/1221/529646943_eed1a533fc_m.jpg
http://farm1.static.flickr.com/56/138356714_853c52ff1d_m.jpg
http://farm2.static.flickr.com/1422/610638892_68476eab25_m.jpg
http://farm1.static.flickr.com/71/193566919_ebf8e9995c_m.jpg
http://farm1.static.flickr.com/211/529647057_162a715859_m.jpg
http://farm1.static.flickr.com/155/357908746_5a8883341a_m.jpg
http://farm3.static.flickr.com/2179/2338419239_5c6984afcd_m.jpg
http://farm1.static.flickr.com/118/302854212_2de0f4e1bf_m.jpg
http://farm3.static.flickr.com/2209/2341356419_39353afa35_m.jpg
http://farm3.static.flickr.com/2089/2342196105_50dee54842_m.jpg
http://farm3.static.flickr.com/2177/2340310006_615f24d1df_m.jpg
http://farm3.static.flickr.com/2403/2212427003_6565e55b23_m.jpg
http://farm1.static.flickr.com/45/109478512_faff51000f_m.jpg
http://farm3.static.flickr.com/2265/2068725242_0dee258c56_m.jpg
http://farm4.static.flickr.com/3010/2347748724_f29ceef2e9_m.jpg
http://farm3.static.flickr.com/2292/2351140496_671ce6545e_m.jpg
http://farm3.static.flickr.com/2026/2344285767_2268c71df5_m.jpg
http://farm1.static.flickr.com/102/289369461_12ac870836_m.jpg
http://farm3.static.flickr.com/2146/2349048535_8dbb2f6da0_m.jpg

C:\ruby>

こうやって色々とチベット関連の情報を集めて、静的なhtmlを生成して自動でftpでアップロードするようにすれば、チベット関連情報ポータル自動生成ができそうだねえ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20080404

2008-04-03

[][] Amazonの検索を使ってチベット関連の商品一覧を出力  Amazonの検索を使ってチベット関連の商品一覧を出力 - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  Amazonの検索を使ってチベット関連の商品一覧を出力 - バリケンのRuby日記  Amazonの検索を使ってチベット関連の商品一覧を出力 - バリケンのRuby日記 のブックマークコメント

本つながり、ということで、Amazonの検索を使ってチベット関連の商品一覧を出力してみるよ。

とりあえず、スクレイピングで。

$KCODE = 's'

require 'open-uri'
require 'cgi'
require 'nkf'

require 'rubygems'
require 'hpricot'

search_word = CGI.escape('チベット')
uri = URI.parse("http://www.amazon.co.jp/s/ref=nb_ss_gw/?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Daps&field-keywords=#{search_word}&Go.x=0&Go.y=0&Go=Go")

page = Hpricot.parse(uri.read)

page.search("td.dataColumn").each do |e|
  puts(NKF.nkf('-s', e.at("a").inner_text))
end

実行結果だよ。

C:\ruby>ruby tibet_book.rb
中国はいかにチベットを侵略したか
囚われのチベットの少女
セブン・イヤーズ・イン・チベット〈ニューマスター版〉
5つのチベット体操──若さの泉・決定版
若返りの秘儀チベット体操 決定版 (TJ MOOK) (TJ MOOK)
チベット旅行記〈上〉 (白水uブックス)
原典訳 チベットの死者の書 (ちくま学芸文庫)
チベット旅行記〈下〉 (白水uブックス)
セブン・イヤーズ・イン・チベット―チベットの7年 (角川文庫ソフィア)
原典訳 チベットの死者の書 (こころの本)
チベット永遠の書―宇宙より遥かに深く 「シャンバラ」極限の恐怖の果てに「生」の真理を見た
チベットを知るための50章 (エリア・スタディーズ)
奇跡のチベット体操詳解―5つのポーズで若返る
チベット―全チベット文化圏完全ガイド (旅行人ノート)
健康になる チベット体操
図説 チベット歴史紀行 (ふくろうの本)

C:\ruby>

うーん、ちゃんとAPIを使ったほうがいいかも。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20080403