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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1380閲覧

txtファイル内の単語をカウントするプログラム

rrrrrrrry

総合スコア20

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/03 01:58

編集2018/12/03 02:38

前提・実現したいこと

テキストファイルから指定した品詞を頻出順に抽出したいです.
プログラムの条件分のところで以下のエラーが出たのですが対処法がわかりません.
ご指摘いただきたいです.

なお, 参考にしたサイトでは名詞のみでしたが, 対象追加として動詞, 形容詞, 形容動詞も同時に処理したいと思っています.

発生している問題・エラーメッセージ

Traceback (most recent call last): File "count.py", line 21, in <module> for item in items File "count.py", line 23, in <listcomp> item[1] == '名詞' or item[2] == '動詞' or item[3] == '形容詞' or item[4] == '形容動詞' and item[5] == '一般')] IndexError: list index out of range

該当のソースコード

Python

1import MeCab 2import sys 3import re 4from collections import Counter 5 6# ファイル読み込み 7cmd, infile = sys.argv 8with open(infile) as f: 9 data = f.read() 10 11# パース 12mecab = MeCab.Tagger() 13parse = mecab.parse(data) 14lines = parse.split('\n') 15items = (re.split('[\t,]', line) for line in lines) 16 17 18 19# 名詞をリストに格納 20words = [item[0] 21 for item in items 22 if (item[0] not in ('EOS', '', 't', 'ー') and 23 item[1] == '名詞' or item[2] == '動詞' or item[3] == '形容詞' or item[4] == '形容動詞' and item[5] == '一般')] 24 25# 頻度順に出力 26counter = Counter(words) 27for word, count in counter.most_common(): 28 print("{word}: {count}") 29

試したこと

orにて処理を試みたがうまくいきませんでした.

補足情報(FW/ツールのバージョンなど)

参考文献
【Python3】MeCabでテキストファイルから名詞を頻出順に抽出
https://qiita.com/reima21/items/cb73aeb569af48877261

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

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

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

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

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

can110

2018/12/03 02:15

現象が再現する文字列(data)の例を提示ください。またその文字列で得られる理想の結果も提示ください。
rrrrrrrry

2018/12/03 02:19

自分が読み込んでいるファイルは単語ごとに分けられているかつそれぞれ改行されています. 例えば, りんご\\みかん\\りんご\\みかん\\ぶどうというファイルを読み込んだなら, りんご:3\\みかん:2\\ぶどう:1のようにしたいと思っています.
can110

2018/12/03 02:22

追記ありがとうございます。つまり「りんご(改行)みかん(改行)りんご(改行)みかん(改行)ぶどう」というファイルにてエラーが再現するということでしょうか?
can110

2018/12/03 02:31

エラーが再現できません。wordsが空のまま正常終了します。「items = (re.split」の次行に「print(list(items))」で表示される結果を追記くださると回答得られやすいと思います。
rrrrrrrry

2018/12/03 02:40

[['りん', '副詞', '助詞類接続', '*', '*', '*', '*', 'りん', 'リン', 'リン'], ['ご', '接頭詞', '名詞接続', '*', '*', '*', '*', 'ご', 'ゴ', 'ゴ'], ['みかん', '名詞', '一般', '*', '*', '*', '*', 'みかん', 'ミカン', 'ミカン'], ['りんご', '名詞', '一般', '*', '*', '*', '*', 'りんご', 'リンゴ', 'リンゴ'], ['みかん', '名詞', '一般', '*', '*', '*', '*', 'みかん', 'ミカン', 'ミカン'], ['りんご', '名詞', '一般', '*', '*', '*', '*', 'りんご', 'リンゴ', 'リンゴ'], ['ぶどう', '名詞', '一般', '*', '*', '*', '*', 'ぶどう', 'ブドウ', 'ブドー'], ['EOS'], ['']]のような結果です.
guest

回答2

0

['EOS']時にitem[2]にアクセスして提示エラーが発生しています。

Python

1 if (item[0] not in ('EOS', '', 't', 'ー') and 2 item[1] == '名詞' or item[2] == '動詞' or item[3] == '形容詞' or item[4] == '形容動詞' and item[5] == '一般'):

において、item[0] not in ('EOS', '', 't', 'ー') and item[1] == '名詞'部分は偽と判定されますが、orで続くため、それに続くitem[2] == ~も解釈されています。

以下のように演算順序を正すとエラー発生しなくなります。

Python

1 if (item[0] not in ('EOS', '', 't', 'ー') and 2 (item[1] == '名詞' or item[2] == '動詞' or item[3] == '形容詞' or item[4] == '形容動詞' and item[5] == '一般'))]

この条件判定部分、複雑になりデバッグしにくくなっているので、通常のforループに変えたほうがよいかと思います。

ちなみに最後のprint("{word}: {count}")も意図した結果にならないはずなので適切に修正が必要です。

投稿2018/12/03 03:19

can110

総合スコア38266

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

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

0

ベストアンサー

itemsの要素数が、あなたが期待しているより小さい行があると言う事なので、データを確認しましょう。

#補足を見ての追記
条件部分がおかしかったです。データを見ると、おそらくこれが意図するところでしょう。

Python

1# 名詞をリストに格納 2words = [item[0] 3 for item in items 4 if item[0] not in ('EOS', '', 't', 'ー') and 5 item[1] in ('名詞', '動詞','形容詞','形容動詞') and 6 item[2] == '一般']

あと、ここも、fが抜けてます。

Python

1 print(f"{word}: {count}")

投稿2018/12/03 02:08

編集2018/12/03 03:46
otn

総合スコア84555

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

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

rrrrrrrry

2018/12/03 02:11

item[2]-[4]の部分を消したらエラー文は出ないので, ご指摘された点が原因ではないと思います.
otn

2018/12/03 02:18

どういうコードに修正したらですか?
rrrrrrrry

2018/12/03 02:20

#名詞をリストに格納の部分のif文の中身です. item[2]からitem[4](私がor文で追加した部分)です.
otn

2018/12/03 02:23

なぜ「itemsの要素数が、あなたが期待しているより小さい行がある」が原因じゃないと思うのでしょうか?データは調べましたか?
can110

2018/12/03 02:34

「item[2]からitem[4](私がor文で追加した部分)」の説明と 質問のソース「~or item[2] == '動詞' or item[2] == '形容詞' or item[2] == '形容動詞'~」 が合っていません。どちらが間違っていますか?
rrrrrrrry

2018/12/03 02:37

ソースです. ソースは訂正いたします.
otn

2018/12/03 03:33

item[0]がEOS等の時は、item[1]以降は存在しないので、それらの存在を仮定するコードは駄目です。 回答に追記しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問