事前準備
mecab、mecab-rubyのインストールは終わってることにする。
http://d.hatena.ne.jp/eth0jp/20130407/1365278478
ここの通りやったらできた。
railsアプリづくり
javascript使うために設定
$ rails new parser --javascript=jquery --skip --database=sqlite3 $ cd parser $ vi Gemfile 略 # See https://github.com/sstephenson/execjs#readme for more supported runtimes gem 'therubyracer', platforms: :ruby #ここだけコメントアウト 略 $ bundle install
データはいっさい保存しないことにして、active recordとか使わん
ただのrubyのクラスをいろいろ仕事さすクラスにする
app/modelsにplaceWord.rbをつくる
placeWord.rb
require "MeCab" class PlaceWord #テキストを受け取って地名を抽出する def self.parse(text) retryCount = 0 begin node = MeCab::Tagger.new.parseToNode(text) rescue retryCount += 1 if retryCount < 3 #3回はチャレンジする retry else return nil end end result = [] while node do #mecabフォーマット 表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音 features = node.feature.force_encoding("UTF-8").split(",") #原型 original = features[6] #2番目 second = features[1] #3番目 third = features[2] #表層 surface = node.surface.force_encoding("UTF-8"); #地名だったら if second== "固有名詞" && third == "地域" #対象とする品詞だったら追加 #words.push({:text => node.surface.force_encoding("UTF-8"), :class => apart}) result.push(original) end node = node.next end return result end end
コメントに書いてある通り、テキストをパースして地名だったら結果用の配列に組み込む関数をつくった
さらに上のクラスに、結果をjsonで返す関数を追加
require "json" 略 #json形式で結果を取り出す def self.getJSON(text) result = parse(text) return JSON.parse(result) end
コントローラを作る
getメソッドでURLパラメータで対象のブログのurlを受け取ることにする
あと、ブログから当該テキストを取り出す処理は、BlogPaserクラスを作ってこいつにやらせよう
$ rails generate controller main index
app/controllers/main_controller.rb
class MainController < ApplicationController def index end def result url = params[:url] text = BlogParser.parse(url) resultArray = PlaceWord.parse(text) render :json => resultArray end end
ルーティングを設定
config/routes.rb
get "main/index” get “main/result" 略
ブログをパースするクラスを作るにはnokogiriを使おう
参考
http://himaratsu.hatenablog.com/entry/2013/04/27/002249
http://nokogiri.org/
$ sudo gem install nokogiri
app/moels/blogParser.rb
#coding: utf-8 require 'open-uri' class BlogParser def self.parse(url) doc = Nokogiri::HTML(open(url)) text = "" doc.css('div.entry-content').each do |entry| text += entry.content end return text end end
最後に、viewを作る
app/views/main/index.html
<h1>はてなブログから地名を取り出す</h1> <%= form_tag('/main/result', :method => :get) do %> <%= text_field_tag 'url', :placeholder => 'はてなブログのURL' %> <% end %>
これで、localhost:3000/main/indexにアクセスして、フォームにブログのURLを入れてエンターを押すと地名を取り出せる
ソースはこちらで公開
https://saoyagi@bitbucket.org/saoyagi/getlocationfromhatenablog.git
Ruby on Rails 4 アプリケーションプログラミング
- 作者: 山田祥寛
- 出版社/メーカー: 技術評論社
- 発売日: 2014/04/11
- メディア: 大型本
- この商品を含むブログを見る
RailsによるアジャイルWebアプリケーション開発 第4版
- 作者: Sam Ruby,Dave Thomas,David Heinemeier Hansson,前田修吾
- 出版社/メーカー: オーム社
- 発売日: 2011/12/01
- メディア: 単行本(ソフトカバー)
- 購入: 12人 クリック: 206回
- この商品を含むブログ (39件) を見る