byh01337
@byh01337 (Geng Tanaka)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

カレントディレクトリ直下のユーザー辞書をPerlから使えずにおります

macのコンソール上でmecabによる分かち書きを試しています。

macOS Monterey (12.6.3)
bash-3.2
Perl(v5.36.0)

発生している問題・エラー


bash-3.2$ echo "シュレディンガーの猫とルシャトリエの原理" | mecab
(出力結果)
シュレディンガー 名詞,一般,,,,,*
の 助詞,連体化,,,,,の,ノ,ノ
猫 名詞,一般,,,,,猫,ネコ,ネコ
と 助詞,並立助詞,,,,,と,ト,ト
ルシャトリエ 名詞,一般,,,,,*
の 助詞,連体化,,,,,の,ノ,ノ
原理 名詞,一般,,,,,原理,ゲンリ,ゲンリ
EOS


bash-3.2$ echo "シュレディンガーの猫とルシャトリエの原理" | mecab -u ./user.dic
(出力結果)
シュレディンガー 名詞,一般,,,,,*
の 助詞,連体化,,,,,の,ノ,ノ
猫 名詞,一般,,,,,猫,ネコ,ネコ
と 助詞,並立助詞,,,,,と,ト,ト
ルシャトリエの原理 名詞,一般,,,,,ルシャトリエの原理
EOS

 ①で分かれていた「ルシャトリエの原理」が、②では1語として扱われましたから、カレントディレクトリ直下のuser.dicは正常に読み込まれている様子です。

③ 以下のPerlプログラムでは
Text::MeCab::Node=SCALAR(0x7f92fa80d278)
というエラーが出ていますが、①と同じ分かち書きがなされています。

#!/usr/bin/perl

use strict;
use warnings;

use Text::MeCab;

my $txt1 = "シュレディンガーの猫とルシャトリエの原理";

sub main{
my $mecab = Text::MeCab->new();

my $node = $mecab->parse($txt1);
print "$node\n";

my $count = -1;
while (defined($node)) {
    my $surface = $node->surface // '';
    my $feature = $node->feature;
    print "$surface\n";
    $node = $node->next;
    $count++;
}

}

main();

bash-3.2$ perl mecab-test.pl
(出力結果)
Text::MeCab::Node=SCALAR(0x7f92fa80d278)
シュレディンガー



ルシャトリエ

原理

④ 以下のPerlプログラムでは、③のものから辞書の指定のみ変更を施しました。
「my $mecab = Text::MeCab->new(-u './user.dic');」
エラーが出て、カレントディレクトリ直下の辞書を使えていない様子です。この原因がわからず、手をつかねております。
ご経験をお持ちの方々にアドバイスを賜われましたら、幸甚です。

#!/usr/bin/perl

use strict;
use warnings;

use Text::MeCab;

my $txt1 = "シュレディンガーの猫とルシャトリエの原理";

sub main{
my $mecab = Text::MeCab->new(-u './user.dic');

my $node = $mecab->parse($txt1);
print "$node\n";

my $count = -1;
while (defined($node)) {
    my $surface = $node->surface // '';
    my $feature = $node->feature;
    print "$surface\n";
    $node = $node->next;
    $count++;
}

}

main();

bash-3.2$ perl mecab-test.pl
(出力結果)
Odd number of elements in hash assignment at /usr/local/opt/perl/lib/perl5/site_perl/5.36/darwin-thread-multi-2level/Text/MeCab.pm line 49.
Use of uninitialized value $value in join or string at /usr/local/opt/perl/lib/perl5/site_perl/5.36/darwin-thread-multi-2level/Text/MeCab.pm line 60.
Text::MeCab::Node=SCALAR(0x7fab4700d260)
シュレディンガー



ルシャトリエ

原理

0

1Answer

ユーザー辞書のパスを渡す書き方は Text::MeCab->new(-u './user.dic') ではなく

Text::MeCab->new('-u', './user.dic');
# または
Text::MeCab->new({userdic => './user.dic'});

です。詳しくはドキュメントを読んでください。 https://metacpan.org/pod/Text::MeCab

1Like

Comments

  1. @byh01337

    Questioner

    @uasi

     ご回答ありがとうございます。しばらく入院しましたもので、返信がすっかり遅くなってしまいました。失礼をお許しください。

     Text::MeCab->new({userdic => './user.dic'});
    で無事に動きました。
    Text::MeCab->new('-u', './user.dic');
    では
    Text::MeCab->new(-u, './user.dic');
    とすると動いたようです。

     この返信で質問を重ねること、申し訳ないのですが、もしご存知でしたら教えていただきたいことがございます。ChetGPTなるものを使いましたところ、次のように書くことで複数のユーザー辞書を使えるようなのですが、

    my $mecab = Text::MeCab->new({
    dicdir => './ipadic',
    userdic => [
    './user1.dic',
    './user2.dic'
    ]
    });

    下のエラーが出力されておしまいになります。

    Failed to create mecab instance at /usr/local/opt/perl/lib/perl5/site_perl/5.36/darwin-thread-multi-2level/Text/MeCab.pm line 64, line 1.

    Perl+MeCabで複数のユーザー辞書を使うことはできるのでしょうか。

  2. mecab コマンドのほうではユーザー辞書はカンマ区切りで複数与えられるようです https://taku910.github.io/mecab/dic.html

    試していませんが

    my $mecab = Text::MeCab->new({
      dicdir => './ipadic',
      userdic => './user1.dic,./user2.dic'
    });
    

    でいけるかもしれません。

  3. @byh01337

    Questioner

     重ねてありがとうございます。いただきました

    my $mecab = Text::MeCab->new({
    dicdir => './ipadic',
    userdic => './user1.dic,./user2.dic'
    });

    で、2つのユーザー辞書が使えるようになりました。自分にはこの辺りの勘が利かず、たいへん助かりました。

Your answer might help someone💌