読者です 読者をやめる 読者になる 読者になる

macOS Sierra の mecab 辞書に mecab-ipadic-NEologd を入れる

MeCab Mac

先日macOS Sierraにmecabwikipedia, はてなの単語をユーザー辞書に追加しました。
kimiaki.hatenadiary.jp


この時に「mecab-ipadic-NEologd」という最近の単語を含めた辞書があることも知ったので、こちらもインストール

mecab-ipadic-NEologd

多数のWeb上の言語資源から得た新語を追加することでカスタマイズした MeCab 用のシステム辞書

ネット上で流行した単語や慣用句やハッシュタグをエントリ化したデータ

ということで、wikipediaはてなの単語以上に色々入っていると思うので、こちらのみで十分かもです。


インストール手順はとても簡単で、こちらを参考にしました。

必要なコマンド

インストールにはいかコマンドが必要だそうなので、不安な方は適宜コマンドが通るか確認してください。

sort head cut egrep mecab mecab-config make curl sed cat diff tar unxz xargs grep iconv patch which file openssl awk

ちなみに自分はiconvコマンドが見当たらずエラーとなっていました。(下で述べています)


mecab-ipadic-NEologdをダウンロード。

~/Downloadにて作業を実施しました。

$ cd ~/Download
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git 
Cloning into 'mecab-ipadic-neologd'...
remote: Counting objects: 72, done.
remote: Compressing objects: 100% (71/71), done.
remote: Total 72 (delta 5), reused 51 (delta 0), pack-reused 0
Unpacking objects: 100% (72/72), done.


mecab-ipadic-NEologdをインストール

$ cd mecab-ipadic-neologd/
$ ./bin/install-mecab-ipadic-neologd -n -a

...
./../../libexec/iconv_euc_to_utf8.sh ./pos-id.def
pyenv: iconv: command not found

The `iconv' command exists in these Python versions:
  anaconda3-4.0.0/envs/anaconda3
  anaconda3-4.0.0/envs/r
...

自分はiconvコマンドが見当たらずエラーとなっていました。

ここを参考に、pyenv globalでバージョンを複数指定(上記の in these Python versions: のどれかを含めた)して対処。

$ ./bin/install-mecab-ipadic-neologd -n -a

...
./../../libexec/iconv_euc_to_utf8.sh ./pos-id.def
pyenv: iconv: command not found

The `iconv' command exists in these Python versions:
  anaconda3-4.0.0/envs/anaconda3
  anaconda3-4.0.0/envs/r
...

あれ?サイド同じエラーが。ターミナルではiconvは認識されていたがおかしいな、ということでエラーとなっていたファイル「mecab-ipadic-neologd/libexec/iconv_euc_to_utf8.sh」を、パスが通るように直接編集。

FILE_NAME=$1
# iconv -f EUC-JP -t UTF-8 ${FILE_NAME} | sed -e 's/—/―/g' > ${FILE_NAME}.utf8
~/.pyenv/versions/anaconda3-4.0.0/envs/anaconda3/bin/iconv -f EUC-JP -t UTF-8 ${FILE_NAME} | sed -e 's/—/―/g' > ${FILE_NAME}.utf8


これで通るはずだ、ってことで再度インストール

$ ./bin/install-mecab-ipadic-neologd -n -a
...
[make-mecab-ipadic-NEologd] : Encode the character encoding of system dictionary resources from EUC_JP to UTF-8
./../../libexec/iconv_euc_to_utf8.sh ./Adj.csv
./../../libexec/iconv_euc_to_utf8.sh ./Adnominal.csv
# ちゃんといけてるっぽい
...

# NEologd辞書の確認が出てくる。問題ないので「yes」を入力。
[test-mecab-ipadic-NEologd] : Please check difference between default system dictionary and mecab-ipadic-NEologd

default system dictionary	  |	mecab-ipadic-NEologd
やき う 				  |	やきう 
けものフレンズ 11 話 		  |	けものフレンズ 11話 
樺 嶋 				  |	樺嶋 
やまだ てつ お 			  |	やまだ てつお 
山田 てつ お 			  |	山田 てつお 
試合 開始 			  |	試合開始 
トリガー ル 			  |	トリガール 

[test-mecab-ipadic-NEologd] : Finish..

[install-mecab-ipadic-NEologd] : Please check the list of differences in the upper part.

[install-mecab-ipadic-NEologd] : Do you want to install mecab-ipadic-NEologd? Type yes or no.
yes
...

[install-mecab-ipadic-NEologd] : Usage of mecab-ipadic-NEologd is here.
Usage:
    $ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd ...

[install-mecab-ipadic-NEologd] : Finish..
[install-mecab-ipadic-NEologd] : Finish..
...


ということで、無事にインストールができた。

最後に、都度システム辞書のパス指定が面倒なので、mecabrcを編集。

$ less /usr/local/etc/mecabrc

# dicdirのパスを変更
;dicdir =  /usr/local/lib/mecab/dic/ipadic
dicdir = /usr/local/lib/mecab/dic/ipadic-neologd


試しに「ピコ太郎」で確認

$ mecab
ピコ太郎
ピコ太郎	名詞,一般,*,*,*,*,ピコ太郎,*,*
EOS


問題なさそうだ。

ということで、mecab-ipadic-NEologdのインストールは以上です。


macOS Sierra にMecabをインストールし、Wikipediaとはてなの単語を辞書に追加する

Mac MeCab テキスト処理

今更ながら、MacBook Air (13-inch, Early 2014)をSierraにアップデートしたので、MeCabを再インストールした。
のだが、単にインストールしてもあれなので、Wikipediaはてなの単語をシステム辞書に追加してみた。

結論から言うと、よくわからない事態に陥り、最終的にはシステム辞書+ユーザー辞書と言う一般的な構成になった。(おい笑)

MeCabをインストール

プライベート用Macが2台あるのだが、そのうち1台はMeCabを入れていなかったので、こちらを参考にターミナルよりMeCabをインストール

$ cd ~/Download
$ git clone https://github.com/taku910/mecab.git
$ cd mecab/mecab
$ ./configure  --enable-utf8-only
$ make
$ make check
$ sudo make install


IPA辞書をインストール

こちらもMeCab同様にターミナルよりインストール

$ cd ../mecab-ipadic
$ ./configure --with-charset=utf8
$ make
$ sudo make install

これで、MeCabが使えるようになったはず。
試しに、ターミナルでMeCabを使ってみる。

$ mecab
今日はスターバックスに来ました。
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
スター	名詞,一般,*,*,*,*,スター,スター,スター
バックス	名詞,一般,*,*,*,*,バックス,バックス,バックス
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
来	動詞,自立,*,*,カ変・来ル,連用形,来る,キ,キ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

一応動いている様子。スターバックスが「スター」と「バックス」に分かれていることが確認できる。

Wikipeiaとはてなの単語をユーザー辞書に追加

MeCabの辞書はシステム辞書とユーザー辞書の2パターンがあり、本当はシステム辞書に追加したかったのだが、色々やっているうちに気づけばmecabが使えない状態になってしまったり、何度かチャレンジしたのだが数時間経っていたため、諦めてユーザー辞書として追加した。

辞書のキーワードリストを取得

まず、こちらを参考に、Wikipediaはてなのキーワードリストを取得

$ cd ~/Download
$ # Wikipedia
$ wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz
$ gunzip jawiki-latest-all-titles-in-ns0.gz
$ # はてな
$ wget http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv
$ nkf -w --overwrite keywordlist_furigana.csv
CSV変換用スクリプトを作成

続いて、取得したキーワードリストからcsv変換を行った。

# makedic.rb で保存

require 'csv'

CSV.open("wiki_hatena.csv", 'w') do |csv|
  %w(jawiki-latest-all-titles-in-ns0 keywordlist_furigana.csv).each do |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, '*', '*']
      end
    end
  end
end
辞書をコンパイル

上で作成したmakedic.rbでdicファイルを作成し、mecab辞書にコンパイル

$ ruby makedic.rb
$ # 色々やった結果、mecab-dict-indexが変なところに入っちゃったので、参考サイトとはpathが異なる
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u wiki_hatena.dic -f utf-8 -t utf-8 wiki_hatena.csv
reading wiki_hatena.csv ... 1332723
emitting double-array: 100% |###########################################|

done!

適当にユーザー辞書フォルダを作成して、そこに置いておく。

$ sudo mkdir /usr/local/lib/mecab/dic/user_dic
$ mv wiki_hatena.dic /usr/local/lib/mecab/dic/user_dic
ユーザー辞書をデフォルトで読み込むように設定

これは、辞書のパスを設定するファイル mecabrc を以下のように編集した。(辞書の置き場所はどこでも大丈夫なので、管理しやすい場所に適宜修正ください)

$ sudo less /usr/local/etc/mecabrc
vi
....
# userdicを以下のように修正
userdic = /usr/local/lib/mecab/dic/user_dic/wiki_hatena.dic
....

これで使える状態になったはずなので、ターミナルから使って確認。

$ # 通常のIPA辞書(システム辞書)
$ mecab
今日はスターバックスに来ました。
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
スターバックス	名詞,一般,*,*,*,*,スターバックス,*,*
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
来	動詞,自立,*,*,カ変・来ル,連用形,来る,キ,キ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

スターバックスがちゃんと単語として認識してくれていることが確認できましたー!


これでテキスト処理ができる最低限のベースができたので、次は機械学習でのテキスト処理にもチャレンジしてみます!


追記(2017/03/24)

最近はWikipediaはてなだけでなく、ネット上でいろんな単語がものすごい勢いで生まれており、そいういうもの辞書として使いたいよ〜、という方向けに「mecab-ipadic-NEologd」というものが2015年に出ていたらしいです。
以下にて適用方法を書きましたので、参考ください。
kimiaki.hatenadiary.jp




L1/L2正則化に関して調べたメモ

Python 機械学習 R

機械学習を勉強しているとよく目にするL1/L2について、いろいろ調べたものをメモ程度に。


  • 分類や回帰分析では、学習データとモデル値の誤差を最小化することでモデル化を行うが、過学習を避けるためにペナルティ項を加える。
  • そのペナルティを加えることで、重み付けベクトル(e.g. 2次元:w1, w2)の値が取れる範囲に条件をつけられ、過学習を防ぐ。


わかりやすい絵は「パターン認識機械学習(出版:シュプリンガー・ジャパン株式会社)」に載っているのでご参考まで。
d.hatena.ne.jp


L1ノルム正則化

  • { \displaystyle  ||θ||_1≤R,  ||θ||_1=\sum_{j=1}^{b} |θ_j|} のように定義され、w1, w2は原点を中心とした四角の領域を取る。
  • このとき、四角の領域に接するようにしないといけなく、自ずとw1=0となる。
  • Lasso回帰とも呼ばれる。

< 特徴 >

  • L1正則化は重み付け要素w1=0となるため、「不要なパラメータを削りたい」という時によく使われる。(次元・特徴量削減)
  • モデルの推定と変数の選択を同時に行うことができる。
  • 特に、次元数 >> データ数(仕事ではよくこの状況に出くわす)に強い。但し、変数はデータ数を超えることはできない。
  • 変数間に強い相関があると、相関を捉えられず適切に変数を選択できない可能性がある。

L2ノルム正則化

  • { \displaystyle  ||θ||^2≤R} のように定義され、w1, w2は原点を中心とした円の領域を取る。
  • このとき、円の領域に接するようにしないといけなく、自ずとw1≠0, w2≠0となる。
  • Ridge回帰とも呼ばれる。

< 特徴 >

  • L2正則化は「過学習を抑えて汎用化したい」という時によく使われる。
  • L2正則化項は微分が可能なため、解析的に解ける。L1正則化項は解析的に解けない。

Elastic net正則化


いずれも、Pythonだとscikit-learn(機械学習ライブラリ)、Rだと{glmnet}で利用が可能。



参考

TJOさんブログ
tjo.hatenablog.com

くるじぇさんブログ
breakbee.hatenablog.jp

PythonのDataFrameを削除などをした時のインデックス振り直し

Python DataFrame

pythonのDataFrameオブジェクトで時系列データを処理する時に、インデックスを振り直さなかったが故に少しハマってしまった。

df = df[df.colum_nm condition]
df

上記のように、DataFrameデータの一部をフィルタなどで削除した場合、インデックスが歯抜け状態になってしまうため、その後、例えば

df.ix[ index, column ]

などで要素を取り出そうとした際に、フィルタしたインデックスが見当たらないため、エラーとなってしまう。


このような場合は、reset_index で振り直す必要がある。

df
#----------------
#    X   Y    Z
# 0  A  AA  AAA
# 1  B  BB  BBB
# 2  C  CC  CCC
# 3  D  DD  DDD
# 4  E  EE  EEE
#----------------

df = df[df.Y != 'BB']
df
#----------------
#    X   Y    Z
# 0  A  AA  AAA
# 2  C  CC  CCC
# 3  D  DD  DDD
# 4  E  EE  EEE
#----------------

# => index = 1 が歯抜け状態になっている

# reset_indexでindexを振り直す
df = df.reset_index(drop=True)
df
#----------------
#    X   Y    Z
# 0  A  AA  AAA
# 1  C  CC  CCC
# 2  D  DD  DDD
# 3  E  EE  EEE
#----------------


こうすることで、df.ix[ 1, : ] などで再度指定ができるようになる。

メモまで。

参考

ailaby.com

MacのPython環境をPyenvに構築する

Python Mac Pyenv

Macで複数のバージョンのPythonを管理したい時には、pyenv(Pythonのバージョンマネージャ)を使うそうです。
(普段業務で使っているMacでは、色々やりすぎてかなり複雑になっちゃっているが、、笑)

少し調べてやってみたので、メモがてら。

pyenvをインストール

まず、gitからpyenvをホームディレクトリの .pyenv にcloneします。

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv


pyenvにパスを通す

~/.bash_profile(~/.bashrc などでも大丈夫)に以下を追加します。

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

直接編集はちょっと、という方は、echoを使ってターミナルから追加しても大丈夫です。

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile


sourceコマンドで有効化を忘れないように。

# .bash_profile はパスを追加したファイルに適宜修正
$ source ~/.bash_profile


pyenvにPythonをインストール

ここまでで pyenvにパスが通ったはずなので、好きなPythonのバージョンをインストールします。

$ pyenv install --list

Available versions:
  2.1.3
  2.2.3
  2.3.7
  ・・・

ここでは、"2.7.13"と"3.5.3"をインストールしました。(特に意味はないですはい。)

$ pyenv install 2.7.13
$ pyenv install 3.5.3

インストールができました。インストールしたPythonは ~/.pyenv/Version/ 配下に配置されます。
インストールした後は、shimのリフレッシュを忘れないように。

$ pyenv rehash


使うPythonを指定

実際に使うPythonのバージョンを指定するのですが、ローカルで使いたい場合とグローバルに使いたい場合で記述を分けます。

# ローカルで使用
$ pyenv local 3.5.3

# グローバルで使用
$ pyenv global 3.5.3

上記で指定した後、pythonの場所が .pyenv 配下になっていれば大丈夫です。

$ which python

# /Users/user_nm/.pyenv/shims/python


pyenvのPythonをアンインストール

pyenvのPythonをアンインストールしたい場合は、通常のPythonアンインストールコマンドをpyenvに変更するだけです。

$ pyenv uninstall 3.5.3


とりあえずここまで。

とりあえずブログ始めてみた。

どうも。

 

IT業界の人たちがよくブログに色々書き留めているので、

自分もやってみようかなと思い、とりあえず始めてみた。

 

はてなさん、よろしくどうぞ!