LoginSignup
5
4

More than 5 years have passed since last update.

Mecabの「too long sentence」エラーの解消方法

Last updated at Posted at 2015-12-20

Groonga Advent Calendar 2015の20日目の記事です。

もうすぐクリスマスですね。

ということで、MroongaでトークナイザにMecabを採用している時にたまに出くわす「mecab_sparse_tostr() failed len=XXX err=too long sentence.....」というエラーの解消方法を紹介します。

そもそもの原因

メッセージからも読み取れるとおり、取り込む文章が大きすぎてリソースが溢れてるというのは以下の記事でも触れています。

解消方法

Groongaバージョン 5.0.1 から追加されたプロパティを設定するだけです。
5.0.1リリース - 2015-03-29

[実験的][mecab] チャンクに分割してトークナイズできるようにしました。この機能は MeCabの "too long sentense" エラーの回避策です。有効にするには GRN_MECAB_CHUNKED_TOKENIZE_ENABLED 環境変数を yes に設定します。この設定により、Groonga は長いテキスト (デフォルトでは 8192 バイトを越えるテキスト)を小さなチャンクと呼ばれるかたまりに分割してMeCabへと渡します。この処理により、上記のエラーが発生しないようになります。

以下で実際に再現から解消されるかを検証してみます。
環境はAmazon Linux(Micro)で実施してます。

再現方法

  1. 以下を参考にMroongaをインストールします。トークナイザーとして MeCabもインストールしてください。

    2.5.4. CentOS 6(OracleのMySQL 5.7パッケージを利用)

  2. データベースを用意します。

    # mysql -uroot -p
    mysql> create database mecabdb default character set utf8;
    mysql> grant all privileges on mecabdb.* to mecab@'%' identified by 'Mecab1234!';
    mysql> exit;
    
  3. テーブルを用意します。

    # mysql -uroot -p mecabdb
    mysql > CREATE TABLE `mecab_test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `content` LONGTEXT,
      PRIMARY KEY (`id`),
      fulltext index(content) comment 'parser = "TokenMecab"')
    ENGINE=mroonga AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    
  4. ビック文章をインサートしてみます。

    # mysql -umecab -p mecabdb < big text.sql
    ERROR 1026 (HY000) at line 1: [tokenizer][mecab] mecab_sparse_tostr() failed len=2257788 err=too long sentence.
    

再現しました。このエラーを見ると現実逃避するためにスプラトゥーンを朝までやり続けた日々を思い出すわけですが、もう怖くありません。

解消方法

  1. Mroongaを停止します。

    # service mysqld stop
    
  2. 起動スクリプトにGRN_MECAB_CHUNKED_TOKENIZE_ENABLED 環境変数を設定します。

    # vi /etc/init.d/mysqld
    export GRN_MECAB_CHUNKED_TOKENIZE_ENABLED=yes
    を序盤に追記
    
  3. Mroongaを再開します。

    # service mysqld start
    

結果確認

  1. ビック文章をインサートしてみます。

    # mysql -umecab -p mecabdb < big text.sql
    

    エラー出てませんね。

  2. インサートされてるか確認します。

    # mysql -umecab -p mecabdb
    mysql> select count(*) from mecab_test;
    +----------+
    | count(*) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.00 sec)
    

まとめ(感想)

  • 解決方法を須藤さんに伺った時は「ココらへんのソース読んでください」と言われ、どうなるこかと思いましたが、すんなり解決して良かったです。
  • お陰様で年を越せそうです。来年もよろしくお願いします!
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4