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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Q&A

0回答

395閲覧

Python:MeCabでエラーとなってしまう

Ykkykk

総合スコア140

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

0グッド

0クリップ

投稿2023/06/07 14:28

編集2023/06/08 13:27

『Pythonで学ぶテキストマイニング入門』を読みながら、テキストマイニングの仕方を学習している初心者です。
環境は以下の通りです。

  • OS:Ubuntu 20
  • Python3.8

掲載されているこちらのソースコードを使用して、進めています(下記引用)。

Python

1# -*- coding: utf-8 -*- 2 3 4import MeCab 5 6# path = '-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd' 7path = '' 8tagger = MeCab.Tagger(path) 9 10def tokens(text, pos = ['名詞', '形容詞', '動詞']): 11 text = ''.join(text.split()) 12 node = tagger.parseToNode(text) 13 word_list = [] 14 while node: 15 # print(node.surface) 16 if node.surface != '': 17 elem = node.feature.split(',') 18 term = elem[6] if elem[6] != '*' else node.surface 19 # print(elem[0]) 20 if len(pos) < 1 or elem[0] in pos: 21 # print(term) 22 word_list.append(term) 23 node = node.next 24 return word_list 25 26if __name__ == '__main__': 27 out = tokens("今日の午後は八宝菜を食べました。") 28 print(out)

こちらのコードの17行目で、IndexError: list index out of rangeとなっている状態です。
こちらのページにあるようにソースコードを書いて実行しているのですが、上記エラーとなってしまいます。

Python

1import pandas as pd 2import openpyxl as px 3from wordcloud import WordCloud 4import matplotlib.pyplot as plt 5imp 6ort my_mecab as my_tokenizer 7 8#url = 'http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt' 9#urllib.request.urlretrieve(url, './data/stopwords.txt') 10 11okinawa = pd.read_excel('./data/H18koe.xlsx', engine='openpyxl') 12okinawa.drop(columns='Opinion').describe() 13df = okinawa.drop(columns='Region').dropna(how='any') 14 15words = [] 16for texts in df.loc[:, 'Opinion']: 17 lists = my_tokenizer.tokens(texts) 18 words.extend(lists)

上記を実行して出力されるエラーメッセージは下記の通りです。

Traceback (most recent call last): File "test.py", line 19, in <module> lists = my_tokenizer.tokens(texts) File "/home/hoge/test/my_mecab.py", line 18, in tokens term = elem[7] if elem[7] != '*' else node.surface IndexError: list index out of range

原因がわからず、解決することができませんでした。
参考情報などお持ちの方がいらっしゃいましたら是非お教えください。
よろしくお願いいたします。

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

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

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

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

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

meg_

2023/06/07 21:43

> こちらのコードの17行目で、IndexError: list index out of rangeとなっている状態です。 解析している文章は参考書と同一ですか?
Ykkykk

2023/06/07 22:11

上記Gitのdataディレクトリからダウンロードした同じファイルです!
quickquip

2023/06/07 23:10 編集

mecabコマンドやpythonのMeCabをどうセットアップしたか書きましょう(質問を編集してください。この欄で返答する必要はありません) エラーが出た行で、データがどうなっているのか確認をしなかったんでしょうか?
quickquip

2023/06/07 23:33

エラーのTracebackも全て載せた方がよさそうです
quickquip

2023/06/08 04:25 編集

# path = '-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd' path = '' となっていますが実際には辞書は何を使っていますか? コードはコメントアウトされているとおりipadic用のものになっています。それを別の辞書で解析しているせいでエラーになっているだけなんじゃないでしょうか
poto568

2023/06/08 06:16

質問者さんの環境では、そもそも my_mecab.py(八宝菜の方) 単品でちゃんと 動いてるんですかね。 うちのMeCabが動いてる環境でtagger(path)だけ(自分の環境に合わせて) 書いてあげたら my_mecab.py と後半のプログラムの両者ともにそれらしく 動いてました。 MeCab(と辞書)の動作が確認できる最小単位のプログラムから始めてみた方が 良いかもしれません。
jbpb0

2023/06/08 06:17

> OS:Ubuntu 20 同じosのgoogle colabで、質問の二つ目の「import pandas as pd」で始まるコードを実行したら、質問のエラーは出ませんでした 以下、当方で実行した手順を書きます 1. 下記を実行 !apt-get -y install sudo file mecab libmecab-dev mecab-ipadic-utf8 git curl !git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git !echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n !pip install mecab-python3 !ln -s /etc/mecabrc /usr/local/etc/mecabrc !git clone https://github.com/IshidaMotohiro/python_de_textmining.git %cd /content/python_de_textmining/ 2. 「/etc/mecabrc」を修正 dicdir = /var/lib/mecab/dic/debian ↓ 変更 dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd 3. 質問の二つ目の「import pandas as pd」で始まるコードを実行 以上、ご参考までに
Ykkykk

2023/06/08 13:25

皆様多くのご意見いただきありがとうございます。 辞書というものについては、上記に記載の通り、空欄で実行しております。neologdというものがインストールできなかったため、空欄で動かしておりました。 また、my_mecab.py単体で動かした場合は、エラーにはなりませんが、['今日', '午後', '八宝', '食べる']と出力されています。
Ykkykk

2023/06/08 13:41

上記jbpb0様にお教えいただいた手順を行いますと、mecab-ipadic-neologdのインストールコマンドを打つと、しばらく処理がされた後、 home/hoge/test/mecab-ipadic-neologd/bin/../libexec/make-mecab-ipadic-neologd.sh: 525 行: 3980 強制終了 ${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t UTF8 というエラーで停止している状態です。
quickquip

2023/06/08 14:25

コード→term = elem[6] if elem[6] != '*' else node.surface Traceback→term = elem[7] if elem[7] != '*' else node.surface エラーとコードが違っているので、単純なミスなのではないでしょうか?(ファイルコピーしてないとか、別のディレクトリで実行しているとかの、動いてるコードと動いていると思っているコードが違うパターン)
jbpb0

2023/06/09 00:26 編集

> home/hoge/test/mecab-ipadic-neologd/bin/../libexec/make-mecab-ipadic-neologd.sh: 525 行: 3980 強制終了 ${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t UTF8 というエラーで停止 もしかしたら、「MECAB_LIBEXEC_DIR」が適切に設定されてないのかも https://qiita.com/johejo/items/34a88147e4b637ad39cb によると、 mecab-config --libexecdir の実行結果(パス)が「MECAB_LIBEXEC_DIR」に格納されます 質問者さんの環境で mecab-config --libexecdir を実行したら表示されるパスに、「mecab-dict-index」という名前のファイルは有りますでしょうか? 【追記】 google colabで、私の最初のコメントの手順で一通りインストールした後で !which mecab-config !mecab-config --libexecdir !ls -l `mecab-config --libexecdir` を実行した結果は /usr/bin/mecab-config /usr/lib/mecab total 80 -rwxr-xr-x 1 root root 14648 Feb 26 2020 mecab-cost-train -rwxr-xr-x 1 root root 14648 Feb 26 2020 mecab-dict-gen -rwxr-xr-x 1 root root 14648 Feb 26 2020 mecab-dict-index -rwxr-xr-x 1 root root 14648 Feb 26 2020 mecab-system-eval -rwxr-xr-x 1 root root 14648 Feb 26 2020 mecab-test-gen で、「mecab-config --libexecdir」の実行結果のパス「/usr/lib/mecab」に「mecab-dict-index」が有ります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問