uoz 作業日記

様々な作業の記録を共有するブログです。

mecabを使って、はてなブログから地名を抜き出してjsonでかえすrailsアプリを作ろう

事前準備


mecabmecab-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 アプリケーションプログラミング

Ruby on Rails 4 アプリケーションプログラミング

RailsによるアジャイルWebアプリケーション開発 第4版

RailsによるアジャイルWebアプリケーション開発 第4版