【mecab】hatenaキーワードとwikipediaのタイトルからオリジナルの辞書を作る
mecabデフォルトの辞書では以下のようにちょっと専門用語などが入ってくると解析が不十分
$ mecab
クラウド
クラ 名詞,固有名詞,一般,*,*,*,クラ,クラ,クラ
ウド 名詞,一般,*,*,*,*,ウド,ウド,ウド
EOS
hatenaキーワードやwikiからもっと多くの単語を取り込むことで精度を上げる
wikipediaの辞書をダウンロード
$ curl -L http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz | gunzip > jawiki-latest-all-titles-in-ns0
はてなキーワードのリスト取得
$ curl -L http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv | nkf -w > keywordlist_furigana.csv
$ vi store_wikipedia_and_hatena_to_csv.rb
require 'csv'
original_data = {
wikipedia: 'jawiki-latest-all-titles-in-ns0',
hatena: 'keywordlist_furigana.csv'
}
CSV.open("custom.csv", 'w') do |csv|
original_data.each do |type, filename|
next unless File.file? filename
open(filename).each do |title|
title.strip!
next if title =~ %r(^[+-.$()?*/&%!"'_,]+)
next if title =~ /^[-.0-9]+$/
next if title =~ /曖昧さ回避/
next if title =~ /_\(/
next if title =~ /^PJ:/
next if title =~ /の登場人物/
next if title =~ /一覧/
title_length = title.length
if title_length > 3
score = [-36000.0, -400 * (title_length ** 1.5)].max.to_i
csv << [title, nil, nil, score, '名詞', '一般', '*', '*', '*', '*', title, '*', '*', type]
end
end
end
end
さっきダウンロードしてきたファイルをCSVに出力。
$ ruby store_wikipedia_and_hatena_to_csv.rb
実行するとcustom.csvが作成される
ユーザー辞書を作成する
custom.csvを元に mecab-dict-index コマンドでユーザー辞書 custom.dic を作ります。
$ /usr/lib/mecab/mecab-dict-index -d /usr/lib/mecab/dic/ipadic -u custom.dic -f utf-8 -t utf-8 custom.csv
reading custom.csv ... 1720131
emitting double-array: 100% |###########################################|
done!
これでユーザー辞書は完成
作成した辞書を使ってみる
$ mecab -u custom.dic
クラウド
クラウド 名詞,一般,*,*,*,*,クラウド,*,*,wikipedia
EOS
今度はクラウドが名詞として認識された!
システムとして作成した辞書を使うなら/etc/mecabrcのuserdicに指定しておくこと
ruby on railsで形態素解析(mecab)が使えるようになるバインド【natto】の設定
前回の記事でrubyからmecabを使える環境を作ったので、railsからも使えるようにする。
ちなみに前回の記事はこちら
Ubuntu Server 14.04にMeCabとMeCab-Rubyをインストール - watariseinの日記
railsアプリケーションを作成
$ rails new mecab
Gemfileに以下を追加
$ vi Gemfile
gem 'natto'
インストール
$ bundle install
rails consoleで動作を確認する
$ bundle exec rails c
irb(main):005:0> mecab = Natto::MeCab.new
=> #<Natto::MeCab:0x00556de5e021c8 @model=#<FFI::Pointer address=0x00556de6692f00>, @tagger=#<FFI::Pointer address=0x00556de605ceb0>, @lattice=#<FFI::Pointer address=0x00556de6bf0f50>, @libpath="/usr/lib/libmecab.so", @options={}, @dicts=[#<Natto::DictionaryInfo:0x00556de5e01160 @filepath="/usr/lib/mecab/dic/ipadic/sys.dic", charset=utf8, type=0>], @version=0.996>
irb(main):007:0> puts mecab.parse("すもももももももものうち")
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
=> nil
Ochasenも使える
irb(main):020:0> mecab = Natto::MeCab.new("-Ochasen")
=> #<Natto::MeCab:0x00556de7730f78 @model=#<FFI::Pointer address=0x00556de6ba5ba0>, @tagger=#<FFI::Pointer address=0x00556de648fe80>, @lattice=#<FFI::Pointer address=0x00556de7748430>, @libpath="/usr/lib/libmecab.so", @options={:output_format_type=>"chasen"}, @dicts=[#<Natto::DictionaryInfo:0x00556de7746238 @filepath="/usr/lib/mecab/dic/ipadic/sys.dic", charset=utf8, type=0>], @version=0.996>
irb(main):021:0> text="明日は会社行かないでコーディングしていたいな"
=> "明日は会社行かないでコーディングしていたいな"
irb(main):022:0> mecab.parse(text) do |n|
irb(main):023:1* puts "#{n.surface}\t#{n.feature}"
irb(main):024:1> end
明日 明日 アシタ 明日 名詞-副詞可能
は は ハ は 助詞-係助詞
会社 会社 カイシャ 会社 名詞-一般
行か 行か イカ 行く 動詞-自立 五段・カ行促音便 未然形
ない ない ナイ ない 助動詞 特殊・ナイ 連用デ接続
で で デ で 助詞-接続助詞
コーディング コーディング コーディング コーディング 名詞-一般
し し シ する 動詞-自立 サ変・スル 連用形
て て テ て 助詞-接続助詞
い い イ いる 動詞-非自立 一段 連用形
たい たい タイ たい 助動詞 特殊・タイ 基本形
な な ナ な 助詞-終助詞
EOS
=> nil
これでrailsからmecabを使うことができるようになった。
ちなみに、ユーザー辞書や辞書ディレクトリを指定する場合は以下のようにする
mecab = Natto::MeCab.new(dicdir: "/usr/lib/mecab/dic/ipadic/", userdic: "/mecab/dic/custom.dic")
参考
【railsのエラー】Bundler::GemRequireError: There was an error while trying to load the gem
新しくrails newしたりすると以下のようなエラーに遭遇した
Bundler::GemRequireError: There was an error while trying to load the gem 'uglifier'.
nodeをインストールすることで解消した
$ sudo apt-get install node
Ubuntu Server 14.04にMeCabとMeCab-Rubyをインストール
mecab自体はapt-get出来る状態だったので、それを利用します。
$ sudo apt-get install mecab
$ sudo apt-get install libmecab-dev
$ sudo apt-get install mecab-ipadic-utf8
ipaの辞書ファイルを落としてきます
$ wget http://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
$ tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801/
carsetにutf-8を指定してmake
$ sudo ./configure --with-charset=utf8
$ make
$ sudo make install
標準では別の辞書ファイルがインストールされるため、設定を編集してipadicに変更します。
$ sudo vim /etc/mecabrc
- dicdir = /var/lib/mecab/dic/debian
+ dicdir = /usr/lib/mecab/dic/ipadic
mecab-rubyは利用するmecabのバージョンと一致させる必要がある。
mecabのバージョン確認
$ mecab --version
mecab of 0.996
0.996のmecab-rubyをダウンロードしてインストール
$ wget http://mecab.googlecode.com/files/mecab-ruby-0.996.tar.gz
$ tar vxf mecab-ruby-0.996.tar.gz
$ cd mecab-ruby-0.996/
$ gem build mecab-ruby.gemspec
$ gem install mecab-ruby-0.99.gem
$ gem list | grep mecab
mecab-ruby
下記コマンドを実行して形態素解析ができればOK
$ ruby test.rb
この 連体詞,*,*,*,*,*,この,コノ,コノ
本 名詞,一般,*,*,*,*,本,ホン,ホン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二 名詞,数,*,*,*,*,二,ニ,ニ
郎 名詞,一般,*,*,*,*,郎,ロウ,ロー
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見 動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性 名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し 動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS
CentOS7.1にFluentd+ElasticSearch+Kibana4をインストールする
まずは準備
ここからasticsearch, kibana, logstashをダウンロード、現時点の最新版を取りましょう
# wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.1.1/elasticsearch-2.1.1.rpm
# wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz
# wget https://download.elastic.co/logstash/logstash/packages/centos/logstash-2.1.1-1.noarch.rpm
Java SE Runtime Environment 8 の 最新RPMパッケージをダウンロードして、インストール
https://java.com/ja/download/manual.jsp
※今回は、jre-8u71-linux-x64.rpm をインストール
# rpm -ivh jre-8u71-linux-x64.rpm
elasticsearchのインストール
# rpm -ivh elasticsearch-2.1.1.rpm
# sudo systemctl daemon-reload
# sudo systemctl enable elasticsearch.service
設定ファイルの末尾に以下を追加。kibana連携に必要
# enable cross-origin resource sharing
http.cors.enabled: true
起動 # sudo systemctl start elasticsearch.service
logstashのインストール
# rpm -ivh logstash-2.1.1-1.noarch.rpm
kibanaのインストール
# tar vxf kibana-4.3.1-linux-x64.tar.gz
# mv kibana-4.3.1-linux-x64 /opt/kibana
kibanaの起動スクリプトを拝借
# vi /etc/rc.d/init.d/kibana
#!/bin/sh
### BEGIN INIT INFO
# Provides: kibana
# Required-Start: $local_fs $remote_fs $network
# Should-Start: $time
# Required-Stop: $local_fs $remote_fs $network
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: Kibana 4
# Description: Service controller for Kibana 4
### END INIT INFO
INSTALLED_DIR=/opt/kibana
EXEC_SCRIPT="$INSTALLED_DIR/bin/kibana"
LOG_DIR=/var/log/kibana
PID_DIR=/var/run
PID_FILE="$PID_DIR"/kibana.pid
LOG_FILE="$LOG_DIR"/kibana.log
test -d $LOG_DIR || mkdir $LOG_DIR
# Source function library.
. /etc/init.d/functions
RETVAL=0
case "$1" in
start)
if [ ! -f "$PID_FILE" ]; then
echo -n "Starting Kibana"
nohup $EXEC_SCRIPT 0<&- &> $LOG_FILE &
echo $! > $PID_FILE
success
else
echo -n "Kibana is already running"
RETVAL=1
failure
fi
echo
;;
stop)
if [ -f "$PID_FILE" ]; then
echo -n "Stopping Kibana"
test -f $PID_FILE && cat $PID_FILE | xargs kill -s SIGKILL && rm -f $PID_FILE
success
else
echo -n "Kibana is not running"
RETVAL=1
failure
fi
echo
;;
restart)
$0 stop
$0 start
;;
reload)
$0 restart
;;
status)
status kibana
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|status|restart|reload}"
exit 1
;;
esac
exit $RETVAL
起動スクリプトの実行権限を追加
# chmod 755 /etc/rc.d/init.d/kibana
サービス起動
# systemctl start kibana
アクセス
ブラウザから http://[IP address]:5601/kibanaにアクセスすると、kibanaの設定画面が表示されます。 (firewallの設定は適宜...)
Fluentd (td-agent 2.3.0) インストール
最新版をインストール
# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
サービス起動
# systemctl start td-agent
# systemctl enable td-agent
あとは、後でElasticsearchにデータを転送できるようにするために、連携用のfluent-plugin-elasticsearchプラグインをインストールしておく。 プラグインはfluent-gemコマンドでインストールできる。
# /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch
Fetching: elasticsearch-api-1.0.15.gem (100%)
Successfully installed elasticsearch-api-1.0.15
Fetching: multipart-post-2.0.0.gem (100%)
Successfully installed multipart-post-2.0.0
Fetching: faraday-0.9.2.gem (100%)
Successfully installed faraday-0.9.2
Fetching: elasticsearch-transport-1.0.15.gem (100%)
Successfully installed elasticsearch-transport-1.0.15
Fetching: elasticsearch-1.0.15.gem (100%)
Successfully installed elasticsearch-1.0.15
Fetching: excon-0.45.4.gem (100%)
Successfully installed excon-0.45.4
Fetching: fluent-plugin-elasticsearch-1.3.0.gem (100%)
Successfully installed fluent-plugin-elasticsearch-1.3.0
Parsing documentation for elasticsearch-1.0.15
Installing ri documentation for elasticsearch-1.0.15
Parsing documentation for elasticsearch-api-1.0.15
Installing ri documentation for elasticsearch-api-1.0.15
Parsing documentation for elasticsearch-transport-1.0.15
Installing ri documentation for elasticsearch-transport-1.0.15
Parsing documentation for excon-0.45.4
Installing ri documentation for excon-0.45.4
Parsing documentation for faraday-0.9.2
Installing ri documentation for faraday-0.9.2
Parsing documentation for fluent-plugin-elasticsearch-1.3.0
Installing ri documentation for fluent-plugin-elasticsearch-1.3.0
invalid options: -SHN
(invalid options are ignored)
Parsing documentation for multipart-post-2.0.0
Installing ri documentation for multipart-post-2.0.0
Done installing documentation for elasticsearch, elasticsearch-api, elasticsearch-transport, excon, faraday, fluent-plugin-elasticsearch, multipart-post after 6 seconds
7 gems installed
試しにfluentにメッセージを飛ばしてログを見る
# curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
以下のようなログが出力される。
# cat /var/log/td-agent/td-agent.log
2016-01-28 21:08:17 +0900 debug.test: {"json":"message"}
以上で構築は完了です、次は実際にログの収集、解析をして見たいと思います。
【tmuxの設定】ローカルのファイルを端末にドラッグアンドドロップでリモートにコピー
既にそこかしこで設定が晒されているので、今回は他であまり見なかった設定について説明します。
末尾のローカルのファイルをリモートに貼り付ける設定が便利です。 設定は以下です。
#ローカルのファイルをリモートに張り付ける
bind-key i command-prompt -p "(load-and-paste) file?" "load-buffer %%" \; paste-buffer
bind-key I command-prompt -p "(load-buffer) file?" "load-buffer %%"
ファイルを端末にドラッグアンドドロップすると、内容を貼り付けることができます。 いちいちコピーしたいファイルを開いてコピペしていた手間が無くなり便利です。
参考までに全体の設定
$ cat ~/.tmux.conf
# prefixキーをC-aに変更する
set -g prefix C-t
#
# # C-bのキーバインドを解除する
unbind C-b
# キーストロークのディレイを減らす
set -sg escape-time 1
#
# # ウィンドウのインデックスを1から始める
set -g base-index 1
#
# # ペインのインデックスを1から始める
setw -g pane-base-index 1
#
# # 設定ファイルをリロードする
bind r source-file ~/.tmux.conf \; display "Reloaded!"
#
# # 256色端末を使用する
set -g default-terminal "screen-256color"
#
# # ステータスバーの色を設定する
set -g status-fg white
set -g status-bg black
#
# # ウィンドウリストの色を設定する
setw -g window-status-fg cyan
setw -g window-status-bg default
set -g pane-border-bg black
# # アクティブなペインを目立たせる
set -g pane-active-border-fg white
set -g pane-active-border-bg yellow
#
# # コマンドラインの色を設定する
set -g message-fg white
set -g message-bg black
set -g message-attr bright
#
# # ステータスバーを設定する
# ## 右パネルを設定する
set -g status-right "#[fg=cyan][%Y-%m-%d(%a) %H:%M]"
# ## ステータスバーのUTF-8サポートを有効にする
set -g status-utf8 on
# ## リフレッシュの間隔を設定する(デフォルト 15秒)
set -g status-interval 60
# ## ヴィジュアルノーティフィケーションを有効にする
setw -g monitor-activity on
set -g visual-activity on
#
# # コピーモードを設定する
# ## viのキーバインドを使用する
setw -g mode-keys vi
# ## コピーモードの操作をvi風に設定する
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
#ローカルのファイルをリモートに張り付ける
bind-key i command-prompt -p "(load-and-paste) file?" "load-buffer %%" \; paste-buffer
bind-key I command-prompt -p "(load-buffer) file?" "load-buffer %%"
【Ruby On Rails】infinit scrollとkaminariによる無限スクロールの実装
javascriptのプラグインinfinitscroll.jsとrailsのページネーションプラグイン"kaminari"を使って、いわゆる無限スクロールページを実装します。
環境
$ ruby -v ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux] $ rails -v Rails 4.1.8
デモ
作成したデモ。ページの最下部にスクロールすると、新たに部分テンプレートのページが読み込まれるようになっている。
概要
- Gemに必要なプラグインを追加
- Pictureモデルを作成
- Pictureを複数表示する部分テンプレートを作成
- 部分テンプレートごとにページネーションを実装
- 無限スクロールを実装
手順
Gemに必要なプラグインを追加
以下のGemを追加
# vi Gemfile
gem 'kaminari'
gem 'jquery-turbolinks'
Pictureモデルを作成
例えば以下のようにPictureモデルを作成する
$ rails generate scaffold Picture title:string img:string
$ rake db:migrate
Pictureを複数表示するよう部分テンプレートを作成
パーシャルを表示する大元のページを作成
# vi app/views/pictures/search.html.erb
<div id="pictures">
<div class="page">
<%= render 'search_result' %>
</div>
</div>
<%= javascript_include_tag 'jquery.infinitescroll' %>
写真を表示するテンプレートとしてパーシャルを作成
# vi app/views/pictures/_search_result.html.erb
<div class="pictures">
<% @pictures.each do |p| %>
<img src="p.img" alt="photos">
<% end %>
</div>
部分テンプレートごとにページネーションを実装
コントローラーを以下のように編集
# vi app/controllers/pictures_controller.rb
def search
@pictures = Picture.order(:created_at).page(params[:page]).per(30)
end
per(30)で、1ページあたり30件表示させている。(デフォルトは25?)
先ほど作成した部分テンプレートに以下を追記
# vi app/views/pictures/_search_result.html.erb
<%= paginate @pictures %>
試しに/pictures/searchにアクセスすると以下のようにページ番号が表示されている
無限スクロールを実装
まずは、JavaScriptリクエストのために、部分テンプレートをappendするビューを記載する
# vi app/views/pictures/search.js.erb
$("#pictures").append("<div class='page'><%= escape_javascript(render('search_result', :locals => { :tags => @picture.tag_list })) %></div>");
infinitscroll.jsを読み込んで無限スクロール用の設定 先ほど作成したsearchのビューファイルに以下を追加
# vi app/views/pictures/search.html.erb
<%= javascript_include_tag 'jquery.infinitescroll' %>
<script>
$("#pictures .page").infinitescroll({
loading: {
img: "http://www.mytreedb.com/uploads/mytreedb/loader/ajax_loader_blue_48.gif",
msgText: "loading..."
},
navSelector: "nav.pagination",
nextSelector: "nav.pagination a[rel=next]",
itemSelector: "#pictures div.pictures" /* このDOMに差し掛かった時に、次のページのロードが始まる*/
});
</script>
これで無限スクロールが完成
参考
How To: Create Infinite Scrolling with jQuery · kaminari/kaminari Wiki · GitHub
Infinite Scroll | jQuery plugin, Wordpress plugin, interaction design pattern