『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
原因がわからず、解決することができませんでした。
参考情報などお持ちの方がいらっしゃいましたら是非お教えください。
よろしくお願いいたします。
> こちらのコードの17行目で、IndexError: list index out of rangeとなっている状態です。
解析している文章は参考書と同一ですか?
上記Gitのdataディレクトリからダウンロードした同じファイルです!
mecabコマンドやpythonのMeCabをどうセットアップしたか書きましょう(質問を編集してください。この欄で返答する必要はありません)
エラーが出た行で、データがどうなっているのか確認をしなかったんでしょうか?
エラーのTracebackも全て載せた方がよさそうです
# path = '-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd'
path = ''
となっていますが実際には辞書は何を使っていますか?
コードはコメントアウトされているとおりipadic用のものになっています。それを別の辞書で解析しているせいでエラーになっているだけなんじゃないでしょうか
質問者さんの環境では、そもそも my_mecab.py(八宝菜の方) 単品でちゃんと
動いてるんですかね。
うちのMeCabが動いてる環境でtagger(path)だけ(自分の環境に合わせて)
書いてあげたら my_mecab.py と後半のプログラムの両者ともにそれらしく
動いてました。
MeCab(と辞書)の動作が確認できる最小単位のプログラムから始めてみた方が
良いかもしれません。
> 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」で始まるコードを実行
以上、ご参考までに
皆様多くのご意見いただきありがとうございます。
辞書というものについては、上記に記載の通り、空欄で実行しております。neologdというものがインストールできなかったため、空欄で動かしておりました。
また、my_mecab.py単体で動かした場合は、エラーにはなりませんが、['今日', '午後', '八宝', '食べる']と出力されています。
上記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
というエラーで停止している状態です。
コード→term = elem[6] if elem[6] != '*' else node.surface
Traceback→term = elem[7] if elem[7] != '*' else node.surface
エラーとコードが違っているので、単純なミスなのではないでしょうか?(ファイルコピーしてないとか、別のディレクトリで実行しているとかの、動いてるコードと動いていると思っているコードが違うパターン)
> 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」が有ります

あなたの回答
tips
プレビュー