teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%

Q&A

解決済

1回答

1262閲覧

Python MeCabのTaggerの引数をchasenにすると実行できない

forn1225

総合スコア1

0グッド

0クリップ

投稿2024/05/18 10:04

編集2024/05/18 12:50

0

0

前提

WindowsにてVisual Studio CodeでPython 3.9.4を使用しています。
MeCabを使ってみようと思い、基礎的な使い方を確かめるため、Web上の入門的なサイトを見ながら
コードを真似ながら書いています。Taggerの引数を順番に変えながら出力結果を見ようとしています。
mecab-python3、unidic-liteをpipでインストールしました。

実現したいこと

文章をChasenの出力フォーマットで表示

エラーメッセージ

どこが主たるエラーメッセージかわからなかったため全体を載せます。見にくかったらすみません。

例外が発生しました: RuntimeError ---------------------------------------------------------- Failed initializing MeCab. Please see the README for possible solutions: https://github.com/SamuraiT/mecab-python3#common-issues If you are still having trouble, please file an issue here, and include the ERROR DETAILS below: https://github.com/SamuraiT/mecab-python3/issues issueを英語で書く必要はありません。 ------------------- ERROR DETAILS ------------------------ arguments: -Ochasen default dictionary path: c:\Users\ユーザネーム\AppData\Local\Programs\Python\Python39\lib\site-packages\unidic_lite\dicdir [!tmp.empty()] unknown format type [chasen] ---------------------------------------------------------- RuntimeError: The above exception was the direct cause of the following exception: File "C:\Users\ユーザーネーム\sample1\ファイル名.py", line 10, in <module> tagger = MeCab.Tagger("-Ochasen") RuntimeError: ---------------------------------------------------------- Failed initializing MeCab. Please see the README for possible solutions: https://github.com/SamuraiT/mecab-python3#common-issues If you are still having trouble, please file an issue here, and include the ERROR DETAILS below: https://github.com/SamuraiT/mecab-python3/issues issueを英語で書く必要はありません。 ------------------- ERROR DETAILS ------------------------ arguments: -Ochasen default dictionary path: c:\Users\ユーザーネーム\AppData\Local\Programs\Python\Python39\lib\site-packages\unidic_lite\dicdir [!tmp.empty()] unknown format type [chasen] ----------------------------------------------------------

ソースコード

Python

1import MeCab 2 3tagger = MeCab.Tagger("-Ochasen") 4result = tagger.parse("Pythonはオープンソースのプログラミング言語であり、人工知能や機械学習などの分野で広く使われています。") 5print(result)

調べたこと、試したこと

  • Taggerの引数を-Owakatiや-Odumpにするときちんと出力されます。
  • 以下のサイトにある方法であればきちんと出力された
    WindowsにおけるMeCab使用時のErrorについて
  • さらに調べていくうち、以下の質問が似ていると思い回答を見ましたたが、回答にある”辞書が置いてあるディレクトリ”というのがどこにあるかわからず、解決できませんでした。
    pythonでMeCabを使おうとするとエラー

個人的な興味、疑問

pythonでMeCabを使おうとするとエラー
この回答にあるdicrcというファイルは本来どうすれば生成されるものなのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2024/05/18 10:52

OSがなにか、インストール済みのものがなにで、どうやってインストールしたのか? という情報は最低限必要です あとこの質問は XY問題 https://ja.meta.stackoverflow.com/questions/2701/#answer-2702 に陥っています。ただの興味で聞いているだけであればいいのですが、問題を解決したいならあなたが遭遇した結果(エラー)を正確に引用することをおすすめします。 https://teratail.com/help/question-tips#questionTips34
quickquip

2024/05/18 10:58

なんで -Ochasen オプション付けたの? という素朴な疑問はあります
forn1225

2024/05/18 12:24

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
guest

回答1

0

ベストアンサー

dicrcはMeCab(Pythonのライブラリではなくてコマンドの方です)の辞書をビルドすると作られます。
辞書の情報と辞書をビルドした時の情報(文字コードとか)が書かれています。
-Oオプションで出力形式名を指定した時、どういう出力形式にするかの設定もそこに書いてあります。

なお、-O wakati-O dumpはMeCab本体に組み込まれているので、設定になくても使えます。
https://taku910.github.io/mecab/format.html

わかち書き出力 (-Owakati), デフォルトの出力, 出力ダンプ (-Odump) は 高速性を犠牲にしたく ないために, ハードコーディングされています.


MeCabの野良Pythonバインディングであるmecab-python3は、unidic-liteライブラリがインストールされている環境(import unidic_liteが成功するかどうかで判定しています)では、unidic-liteライブラリ配下に置かれた辞書を使おうとします。
https://github.com/SamuraiT/mecab-python3/blob/v1.0.9/src/MeCab/__init__.py#L62
https://github.com/SamuraiT/mecab-python3/blob/v1.0.9/src/MeCab/__init__.py#L125
コード中でunidic_lite.DICDIRが指している場所、すなわち Python の site-packages/unidic_lite/dicdir に dicrcファイルは存在します。

ただ、そのdicrcには chasen という形式は含まれていません。
mecab-python3のページにもわざわざ書いてくれてます。
https://github.com/SamuraiT/mecab-python3?tab=readme-ov-file#using-unsupported-output-modes-like--ochasen

エラーが出ているのは

  1. unidic-lite がインストールされていて自動的に unidic_lite/dicdir が辞書として使われている
  2. UniDic系の辞書には-O chasenに対応する書式設定がない
    という2つ理由で起こっています。

形態素解析器ChaSenは辞書がIPA品詞体系でした。
UniDicとは品詞体系が異なるのですから、ChaSen互換形式で出力したとしてもChaSenの出力を前提にしたプログラムがそのまま動くわけではないです。
だからUniDic系の辞書にChaSen互換形式の設定がないのはごく自然の判断です。同様にJuman辞書にもChaSen互換形式の設定はありません。
むしろChaSenと品詞体系が異なる辞書からChaSen互換形式で出力できてしまうと、形式はChaSenぽいのに中身(品詞情報)がChaSenのものではないファイルができあがります。それは害になりかねません。

ChaSen形式の出力が必要なのであればIPA品詞体系の辞書が必要です。
質問に書いてある https://github.com/SamuraiT/mecab-python3/issues/54 を読んで気がつきましたが、IPA辞書がPyPIでライブラリ化されていて、

shell

1pip install ipadic

でインストール可能なのですね。

python

1import MeCab 2import ipadic 3t = MeCab.Tagger(f'-r null -Ochasen -d "{ipadic.DICDIR}"') 4print(t.parse('すもももももももものうち'))

でIPA辞書を使ってChaSen形式で出力できますね。
(ChaSen形式の出力がなぜ必要なの? という疑問は強く残ります)
(-r null はunidic_liteがインストールされていてもunidic_liteを使わせないための指示です。unidic_liteやunidicがインストールされていない環境では不要です)

Windows以外だと書き方が変わって以下のようになります。

python

1import MeCab 2import ipadic 3t = MeCab.Tagger(f'-r /dev/null -Ochasen -d {ipadic.DICDIR}') 4print(t.parse('すもももももももものうち'))

投稿2024/05/18 13:43

編集2024/05/18 16:53
quickquip

総合スコア11310

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

forn1225

2024/05/18 23:50 編集

コメントありがとうございます! https://www.tech-teacher.jp/blog/mecab-python/ 上記のようなサイトでChasen形式の出力もできるとあったので出力の形式を順番に試していたらエラーになったので気になり今回の質問をしました。 まだMeCabを使い始めたばっかりでよくわからないので、全体的に的を射ない質問になっていたと思いますが、もしよければ、もう一つ教えていただけないでしょうか。 回答主さまもChasen形式の出力がなぜ必要なのかわからないとおっしゃっておられましたが、デフォルトでChasen形式が設定されていないというのはあまり必要性がないからということなのでしょうか? 要はChasen形式の出力が欲しかったらわざわざPythonなどでコードする必要はなくMeCabをコマンドとして利用するので十分ということですかね。
quickquip

2024/05/19 00:43 編集

> 上記のようなサイトでChasen形式の出力もできるとあった 「辞書に用意されている形式が指定できる」が正しい説明かと思います。 これからブログラムを書く人がChaSen形式を使う必要性は **全くない** でしょう。何ひとつとして必要な要素は思いつきません。 ChaSen 形式を見慣れている人か、ChaSen 形式のファイルを取り扱うプログラム群があって流用したい人にしか必要性はないはずです。 そしてそんな人は今はいません。 10年前の時点でも「今から作るコードでChaSen形式を取り扱う理由はない」「今から解析するのにChaSen形式で作るメリットはもうない」レベルでした。
quickquip

2024/05/19 00:51 編集

https://www.tech-teacher.jp/blog/mecab-python/ は、4〜5年くらい前の記事をコピーしたものかな、という印象です。 今となっては「それはない」という記述だらけです。
quickquip

2024/05/19 01:46

> 要はChasen形式の出力が欲しかったらわざわざPythonなどでコードする必要はなくMeCabをコマンドとして利用するので十分ということですかね。 MeCab.Taggerに渡すオプションは(基本的に)mecabコマンドに渡せるものと同じなので、mecabコマンドでも議論に変わりはありません。 IPA品詞体系でない辞書にはChaSen形式の設定はありませんので、コマンドだろうと mecab -O chasen -d IPA品詞体系でない辞書 は当然同じエラーになります。
forn1225

2024/05/19 09:32

回答ありがとうございます! https://www.tech-teacher.jp/blog/mecab-python/ このサイトに沿って進めていこうと思っていましたが、 別のサイトを探してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問