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

Screaming Loud

研究・プログラミングなど気づいたことをメモをしています

mecabへの辞書追加(left-id.def でのエラー)

今回はmecabへの辞書追加でハマったのでそのメモとして残します.

ほとんどhttp://fukushimu.blog.shinobi.jp/Entry/76/を参照しました.

/usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u wikipedia.dic -f utf8 -t utf8 wikipedia.csv

mecabをローカルにコンパイルした人ならそこを指定します.
http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.htmlに書いてあるユーザ辞書の登録という項目にコマンドについては詳しく書いてあります.


しかし以下のようなエラーがでました.

context_id.cpp(88) [it != left_.end()] cannot find LEFT-ID for 名詞,固有名詞,一般,*,*,*,*

とりあえず文字コード周りを直すため,

nkf -w --overwrite /usr/local/lib/mecab/dic/ipadic/*.def

をしたのですが動きませんでした.

perlのコードを見直すと,csvに「,」が入っていてエラーが出ていたのでそこを直しました.

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use encoding 'utf8';

my $file1 = "wiki_ja.txt";
my $file2 = "wikija.csv";

open(IN, "$file1");
open(OUT, ">$file2");
binmode OUT, ":utf8";        ##    <- こっちが正しい

for(<IN>) {
    chomp($_);
    #print $_."\n";

  ## いらない単語をとばす
    next if $_ =~ /\(曖昧さの回避\)/;
    next if $_ =~ /\(.*?\)/; ## 括弧で囲まれている場合を全て除く
    next if $_ =~ /^[0-9]{1,100}$/; ## 数字のみを回避
    next if $_ =~ /[0-9]{4}./;
    next if $_ =~ /[*+.,]/; ## ここで「,」を除去する


    if (length($_) > 3) {
        print OUT "$_,1288,1288,64,名詞,固有名詞,*,*,*,*,$_,*,*,wikipedia_word\n";
    }
}

sub max {
    my $comp = shift @_;
    my $val  = shift @_;
    my $max  = $comp;
    if ( $comp <= $val ) {
        $max = $val;
    }
    return int($max);
}

これでコンパイルが完成し, /user/local/etc/mecabrcのuser-dictにパスを通せば完了!