Ubuntu 16.04 LTS での MeCab の辞書の場所と確認

結論

辞書の場所

ここです。

/var/lib/mecab/dic

実は以下の設定ファイルに書いてあります。これは Mroonga などでも使われます。

/etc/mecabrc

辞書の確認

以下を。

$ sudo update-alternatives --config mecab-dictionary
alternative mecab-dictionary (/var/lib/mecab/dic/debian を提供) には 3 個の選択肢があります。

  選択肢    パス                          優先度  状態
------------------------------------------------------------
* 0            /var/lib/mecab/dic/ipadic-utf8   80        自動モード
  1            /var/lib/mecab/dic/ipadic        70        手動モード
  2            /var/lib/mecab/dic/ipadic-utf8   80        手動モード
  3            /var/lib/mecab/dic/juman         30        手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 

MeCab のバージョン(補足)

0.996です。

$ mecab -v
mecab of 0.996

辞書を追加したい場合(補足)

以下を。ただし Ubuntu では/usr/local/libexecの部分は/usr/libと読み替えましょう。あとシステム辞書の場所も適宜読み替えましょう。

それと以下の記事中では CSV をシフトJISで保存するように書いてありますが、コンパイルのオプションに utf-8 が指定されているので、CSV は普通に UTF8 で編集していいです(しないとだめです)。

Goutte(グート)でスクレイピングをする準備

Goutte

PHP のスクレイピング用ライブラリであるGoutte(「グート」と読むらしい*1)を使うための準備の方法です。実際の使い方はオフィシャルのドキュメントを見るほうが早いでしょう。

php-curl と php-xml を入れる

以下、Ubuntu 16.04 LTS を用いた場合です。

$ sudo apt-get install php-curl php-xml

composer を入れる

$ sudo apt-get install composer

Goutteと、関連ライブラリを入れる

$ composer require fabpot/goutte symfony/browser-kit symfony/css-selector symfony/dom-crawler

テストしてみる

以下のようなコードでチェックして正しく表示されれば OK です。

<?php
require __DIR__ . '/vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'https://www.yahoo.co.jp/');
var_dump($crawler);

Embulk で Operation failed (0:08003) エラーが出た場合は out のサイズを見直してみる

Embulk でインターネット越しの転送

ローカルネットワークでは問題なかったのですが、インターネット越しに*1 Embulk で大量のデータを送信しようとするとOperation failed (0:08003)というエラーが出てしまいました。Output pluginsembulk-output-mysqlhttps://github.com/embulk/embulk-output-jdbc/tree/master/embulk-output-mysql)です。

結論

outの設定の中にbatch_sizeというものがありました。デフォルトではこれが16777216に設定されているのですが、程よく小さく指定することでエラーが出なくなりました。あまりに小さくすると細切れにデータを送りすぎて時間がかかったりログがえらいことになったりしますが、まあ失敗するよりかはいいのではないでしょうか。

余裕があれば値を変えて試してみて、最適な値を見つけるのも良いかと思います。

補足

batch_sizeの値によっては処理が速すぎるため(?)にERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'みたいなエラーが出ます。

なのでmodemerge系を選択するのが無難です。さらにfetch_rowsの値を抑えたほうがよいと思います。ただmergeだと困る運用もあると思いますので、そこはやはり値の微調整ということになるかと思います。

そもそもこのエラーが出る場合はネットワークの状況に疑いがある可能性が強いと踏んでいますので、上記はかなりのグレーパターンだとは思います。

*1:これが異常なオペレーションだとは思いますが

Embulk でレジューム(差分実行)するためには実行時に -o オプションを付ける

Embulk

ご存知Embulkhttp://www.embulk.org/)ですが、Fluentdhttp://www.fluentd.org/)とともにとても便利なプロダクトですよね。データベースの実質的なレプリケーションもこれで柔軟に行えたりします。プラグインにもよりますが、オプション指定も豊富にできて、様々な形で必要なデータを扱えます。

Embulk でレジューム実行する

MySQL の Input plugin に実装されている*1機能として、それまでに読み出した場所を記憶してくれて、次回以降はその続きから読んでくれるといういわゆるレジューム機能があります*2

MySQL の Input plugin ではこの機能を有効にするためにincrementaltrueにしてあげればいいです。……が、いくらこの設定をしても、毎回毎回最初から読み出してしまいます。数十万単位のレコードなら良いですが、数百万単位以上のレコードになるとこれはとてもツラいです。

きっとどこか設定が間違っているんだろうなと思って調べていたところ、救世主となる記事を見つけました。

結論から言えば、Embulk の実行時に -o(--output)オプションを指定する必要があります。このオプションを指定すると、Embulk の実行が終わった際に、指定の場所に次回実行に用いることができる.ymlファイルが生成されます。

この.ymlファイルの中にはレジュームに必要となるlast_recordというキーがちゃんと記録されています。次回に Embulk を実行するときにこのファイルを設定ファイルとして指定してあげれば無事レジュームしてくれるということです。

-r(--resume-state)オプションもあり

GitHub のドキュメントにあるのでこちらは有名かと思いますが、-r(--resume-state)オプションを用いればトランザクションに失敗した際のレジュームファイルが生成されます。こちらも指定してあげれば取得漏れがあった際に役立つことでしょう。

追記

実行ログを見ていたら、思いっ切り-oオプションはdeprecatedでした。代わりに-cを使いましょうとのことです……が-cだとlast_recordしか記録されない.ymlが出てくるような……。

*1:他のプラグインももちろんあると思われます

*2:トランザクションが失敗した際のレジュームとは異なります

Powered by はてなブログ