2011 |
02,02 |
Text::MeCabが謎の文字化けして、まぁ一応直ったのでメモ。
原因はわからずじまい。
ある日(というか今日)何気にText::MeCabを動かすと、あれれ・・
謎の文字化け発症・・。
単語と単語の切れ目がゴミと化しています。
前はフツーに動いていたのにぃ!
だからスクリプトの文字コード周りではないのかも。
これはターミナル上でのMySQLで、日本語を入力→削除で出てくるゴミに似ている気がする。
とりあえずcpanでText::MeCabをアップグレードするも直らず。
ふと調べると、mecab本体が2個所にある・・。
一方が正常で一方が文字化ける。
Text::MeCabインストール時に指定するパスは化けるほう。
ということでインストールしなおしてmecabのパスを正常な方に直すと・・・
うひょーー!
見事なおりました!!
しかし化ける方はなんなんだ、いつからおるんか、いつ正常なやつと入れ替わったのかはわからず。
原因はわからずじまい。
ある日(というか今日)何気にText::MeCabを動かすと、あれれ・・
彼
��
�態
�
��
謎の文字化け発症・・。
単語と単語の切れ目がゴミと化しています。
前はフツーに動いていたのにぃ!
だからスクリプトの文字コード周りではないのかも。
これはターミナル上でのMySQLで、日本語を入力→削除で出てくるゴミに似ている気がする。
とりあえずcpanでText::MeCabをアップグレードするも直らず。
ふと調べると、mecab本体が2個所にある・・。
一方が正常で一方が文字化ける。
Text::MeCabインストール時に指定するパスは化けるほう。
ということでインストールしなおしてmecabのパスを正常な方に直すと・・・
彼
は
変態
です
うひょーー!
見事なおりました!!
しかし化ける方はなんなんだ、いつからおるんか、いつ正常なやつと入れ替わったのかはわからず。
PR
2011 |
01,15 |
perlでText::MeCabを使っていて、「なんか変だなー。みょ〜〜に、変だな〜・・」と稲川淳二ばりに思っていたら、作成したはずのmecabのユーザ辞書がText::MeCabに適応されていませんでした。人生オワタ、と嘆いていると、ザッツさんがCPANを見ればといってくれたので、見てみると、あーなるほど普通に書いてある。ということで、Text::MeCabに自分で作成したユーザ辞書を適応させる方法です(CPAN見れば書くまでもありませんが...)。
実行結果
できました。まあ、ちゃんとCPANなりなんなりを読めと言うことですね。
use Text::MeCab;
use utf8;
binmode(STDOUT, ":raw :utf8");
binmode(STDIN, ":raw :utf8");
use Encode;
my $userdic ='../mecab_dic/wikipedia.dic, ../mecab_dic/hatena_keyword.dic'; # <- ユーザ辞書パス(複数OK)
my $m = Text::MeCab->new({ # <- ここで辞書のパスを記載
userdic => $userdic,
});
my $str = "千と千尋の神隠し";
my $n = $m->parse($str);
do{
printf("%s\t%s\t%s\n",
decode('utf8' ,$n->surface), # 表層
decode('utf8' ,$n->feature), # 現在の品詞
$n->cost, # その形態素までのコスト
);
}while ($n = $n->next)
実行結果
千と千尋の神隠し 名詞,固有名詞,*,*,*,*,千と千尋の神隠し,*,*,wikipedia_word, -4034
BOS/EOS,*,*,*,*,*,*,*,* -4468
Use of uninitialized value in printf at /home/akito/workspace/長岡さん/source/OLD_source/test_mecab.pl line 14.
できました。まあ、ちゃんとCPANなりなんなりを読めと言うことですね。
2011 |
01,13 |
mecabにwikipediaのタイトルの単語を追加します。
ググると、既に様々な人がされているので、参考にさせて頂きました。また、本家のサイトで詳しく説明されています。
csvファイルの作成にperlを使いました。
以下が作業の流れです。
wikipediaのタイトルを辞書に追加すると
これが
こうなってくれます。つまり、wikipediaに登録されている項目をmecabが判別してくれるのですね。
では本題。
1) まず、wikipediaのタイトルリスト(jawiki-latest-all-titles-in-ns0.gz)をこちら(http://download.wikimedia.org/jawiki/latest/)からダウンロード。適当なディレクトリ(home/foo/bar)に解凍します。
2) 次に、ダウンロードしたファイルから辞書へ変換するためのCSVファイルを作成します。ファイルの中身を見るとこのようになっていました。
これをこのようなCSV形式に整形し、ファイルに保存します
「#いらない語をとばす」のところで自分がいらないなと思った単語をとばしましょう。僕は.(ドット)から始まる後や(曖昧さの回避)の単語、数字のみの単語などを省きました。また、CSVファイルに書き込む際に3文字以下の単語は省きました。(lengthでuse utf8をしないと日本語などのユニコード文字の長さがちゃんとはかれないようです。)
これでCSVファイルができあがリました。
3)CSVファイルを辞書ファイル(.dic)へ変換します。CSVファイルのあるディレクトリで、以下のコマンドを入力。
できました。
最後に/usr/local/etc/mecabrcに以下を追加。
これで終了です。この調子ではてなキーワードもいれてみようと思います。
--2011-01-14 追記--
はてなキーワードリストをこちら(http://d.hatena.ne.jp/hatenadiary/20060922/1158908401)からダウンロードして、辞書に登録しました。
はてなキーワードにはふりがながあるものもあるので、スクリプトを少し改良しました。
変換後の中身
しかし、何と言うか、はてなキーワードはwikipediaと比べてなんだか世俗的、というかフォークソノミーちっく(死語!?)ですね。それぞれの単語追加の際のポリシーみたいなものがあるのでしょうかね。
ググると、既に様々な人がされているので、参考にさせて頂きました。また、本家のサイトで詳しく説明されています。
csvファイルの作成にperlを使いました。
以下が作業の流れです。
1)wikipediaのデータをダウンロード
2)ダウンロードしたデータからユーザ辞書のCSVファイルを作成
3)CSVファイルを辞書ファイル(.dic)へ変換
wikipediaのタイトルを辞書に追加すると
$ mecab
千と千尋の神隠し
千 名詞,数,*,*,*,*,千,セン,セン
と 助詞,格助詞,引用,*,*,*,と,ト,ト
千尋 名詞,一般,*,*,*,*,千尋,チヒロ,チヒロ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
神隠し 名詞,一般,*,*,*,*,神隠し,カミガクシ,カミガクシ
EOS
これが
$ mecab
千と千尋の神隠し
千と千尋の神隠し 名詞,固有名詞,*,*,*,*,千と千尋の神隠し,*,*,wikipedia_word,
EOS
こうなってくれます。つまり、wikipediaに登録されている項目をmecabが判別してくれるのですね。
では本題。
1) まず、wikipediaのタイトルリスト(jawiki-latest-all-titles-in-ns0.gz)をこちら(http://download.wikimedia.org/jawiki/latest/)からダウンロード。適当なディレクトリ(home/foo/bar)に解凍します。
2) 次に、ダウンロードしたファイルから辞書へ変換するためのCSVファイルを作成します。ファイルの中身を見るとこのようになっていました。
千ちゃんの幸せラジオドーム
千とせ
千と千尋
千と千尋の神隠し
千と千尋の神隠し_サウンドトラック
千なり
千のナイフ
これをこのようなCSV形式に整形し、ファイルに保存します
工藤,1223,1223,6058,名詞,固有名詞,人名,名,*,*,くどう,クドウ,クドウ詳しくは公式サイトにのっていますのでそちらを。なお、自分お好きな情報をCSVが許す範囲で 追加できるとのことなので、先人に習って、最後にwikipedia_wordを追加します。 CSVへの変換はこちらのサイトのperlスクリプトを参考にさせて頂きました(少し改変しました。)。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
binmode(STDOUT, ":utf8");
use encoding 'utf8';
my $file1 = "jawiki-latest-all-titles-in-ns0";
my $file2 = "wikipedia.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}./;
if (length($_) > 3) {
print OUT "$_,0,0,".max(-36000,-400 * (length^1.5)).",名詞,固有名詞,*,*,*,*,$_,*,*,wikipedia_word,\n";
}
}
sub max {
my $comp = shift @_;
my $val = shift @_;
my $max = $comp;
if ( $comp <= $val ) {
$max = $val;
}
return int($max);
}
「#いらない語をとばす」のところで自分がいらないなと思った単語をとばしましょう。僕は.(ドット)から始まる後や(曖昧さの回避)の単語、数字のみの単語などを省きました。また、CSVファイルに書き込む際に3文字以下の単語は省きました。(lengthでuse utf8をしないと日本語などのユニコード文字の長さがちゃんとはかれないようです。)
これでCSVファイルができあがリました。
3)CSVファイルを辞書ファイル(.dic)へ変換します。CSVファイルのあるディレクトリで、以下のコマンドを入力。
$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic \
> -u wikipedia.dic -f utf8 -t utf8 wikipedia.csv
reading wikipedia.csv ... 970539
emitting double-array: 100% |###########################################|
done!
できました。
最後に/usr/local/etc/mecabrcに以下を追加。
userdic = /home/foo/bar/foo.dic
これで終了です。この調子ではてなキーワードもいれてみようと思います。
--2011-01-14 追記--
はてなキーワードリストをこちら(http://d.hatena.ne.jp/hatenadiary/20060922/1158908401)からダウンロードして、辞書に登録しました。
はてなキーワードにはふりがながあるものもあるので、スクリプトを少し改良しました。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use encoding 'utf8';
#my ($file1,$file2) = @ARGV;
my $in = "hatena.csv";
my $ou = "hatena_keyword2.csv";
open(IN, "$in");
open(OUT, ">$ou");
binmode OUT, ":utf8";
for(<IN>) {
chomp($_);
######## for hatena <- ここを追加
$_ =~ s/(.*?)\t(.*?)/$2/;
my $yomi = $1;
$yomi = '*' if $yomi eq '';
print $_."\n";
next if $_ =~ /^\./;
next if $_ =~ /(曖昧さの回避)/;
next if $_ =~ /^[0-9]{1,100}$/;
next if $_ =~ /[0-9]{4}./;
if (length($_) > 1) {
# print OUT "$_,0,0,".max(-36000,-400 * (length^1.5)).",名詞,固有名詞,*,*,*,*,$_,*,*,wikipedia_word,\n";
print OUT "$_,0,0,".max(-36000,-400 * (length^1.5)).",名詞,固有名詞,key_word,key_word,*,*,$yomi,*,*,hatena_word,\n";
}
}
sub max {
my $comp = shift @_;
my $val = shift @_;
my $max = $comp;
if ( $comp <= $val ) {
$max = $val;
}
return int($max);
}
変換後の中身
千と千尋の神隠し,0,0,-3600,名詞,固有名詞,key_word,key_word,*,*,せんとちひろのかみかくし,*,*,hatena_word,
しかし、何と言うか、はてなキーワードはwikipediaと比べてなんだか世俗的、というかフォークソノミーちっく(死語!?)ですね。それぞれの単語追加の際のポリシーみたいなものがあるのでしょうかね。
プロフィール
HN:
fukushimu
性別:
男性
自己紹介:
熊本の某大学で情報処理の勉強をしてます。
カレンダー
カテゴリー
ブログ内検索
つぶやきパーツテスト
カレンダー
最新記事
最新コメント
最古記事
最新TB
P R
カウンター
フリーエリア