やりたいこと
Yahoo news APIからとったニュースのタイトルを形態素解析して名詞をカウントする。形態素解析には Yahoo形態素解析API を利用する。
ソース
Gemfile
source 'https://rubygems.org' gem 'rake' gem 'nokogiri' gem 'activesupport'
count_noun.rb
# -- coding: utf-8 require "cgi" require "open-uri" require "rubygems" require "nokogiri" def get_news_titles() news_api_url = "http://news.yahooapis.jp/NewsWebService/V2/topics" news_params = { appid: "あなたのアプリケーションIDを入れてください", pickupcategory: 'all' } query = news_params.map {|k, v| "#{CGI.escape k.to_s}=#{CGI.escape v.to_s}"}.join('&') news_url = "#{news_api_url}?#{query}" doc = Nokogiri::XML open(news_url) titles = doc.xpath('//news:Title', {'news' => 'urn:yahoo:jp:news'}).map(&:text) return titles end def get_words(text) ma_api_url = "http://jlp.yahooapis.jp/MAService/V1/parse" ma_params = { appid: "あなたのアプリケーションIDを入れてください", sentence: text, results: 'ma', response: 'reading,surface,pos' } query = ma_params.map {|k, v| "#{CGI.escape k.to_s}=#{CGI.escape v.to_s}"}.join('&') ma_url = "#{ma_api_url}?#{query}" doc = Nokogiri::XML open(ma_url) poss = doc.xpath('//jlp:pos', {'jlp' => 'urn:yahoo:jp:jlp'}).map(&:text) words = doc.xpath('//jlp:surface', {'jlp' => 'urn:yahoo:jp:jlp'}).map(&:text) return words.zip(poss) end def add_noun_to_hash(wordset, words) words.each {|word, pos| if pos == "名詞" if wordset.key?(word) wordset[word] += 1 else wordset[word] = 1 end end } end wordset = Hash::new get_news_titles.each{|title| add_noun_to_hash(wordset, get_words(title)) } wordset.each_pair {|key,value| puts "#{key}:\t#{value}"}
結果
福島: 1 原発: 1 事故: 1 全員: 1 不起訴: 1 被爆: 1 1: 1 長崎: 1 写真: 1 発見: 1 韓国: 1 美容: 1 整形手術: 1 増税: 1 事前: 1 運動: 1 自民: 1 秘書: 1 書類送検: 1 駅: 1 エスカレーター: 1 歩行: 1 ダメ: 1 北朝鮮: 1 携帯: 1 電話: 1 規制: 1 強化: 1 歌舞伎町: 1 暴走: 1 23: 1 摘発: 1 肉のハナマサ: 1 買収: 1 9: 1 めど: 1 乗り: 1 正念場: 1 中国: 1 経済: 1 甲子園: 1 米: 1 注目: 1