Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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)
    

まとめ(感想)

  • 解決方法を須藤さんに伺った時は「ココらへんのソース読んでください」と言われ、どうなるこかと思いましたが、すんなり解決して良かったです。
  • お陰様で年を越せそうです。来年もよろしくお願いします!
ukitiyan
ここでの記載内容は個人の見解であり、所属する団体の公式見解ではありません。
https://www.optim.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした