やりたいこと
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