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

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

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

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

Python

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

Q&A

1回答

1042閲覧

indexの長さのエラーを解消したい

naochan1027

総合スコア2

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2020/12/28 15:07

前提・実現したいこと

Pythonで形態素分析を行なった後に、自分で作成した辞書をもとに感情分析をするシステムを作っています。
実装中に以下のエラーメッセージが発生しました。

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

Traceback (most recent call last): File "fire1.py", line 43, in <module> dic_pn = read_pn_di() File "fire1.py", line 19, in read_pn_di dic_pn[columns[0]] = int(columns[3]) IndexError: list index out of range

該当のソースコード

Python

1import re 2import sys 3from janome.tokenizer import Tokenizer 4import codecs 5 6 7#感情ファイルの辞書を作成する 8def read_pn_di(): 9 dic_pn = {} 10 11 f = open('fire_dictionary.txt') 12 lines = f.readlines() # 1行を文字列として読み込む(改行文字も含まれる) 13 14 for line in lines: 15 #フォーマット 16 #見出し語:読み(ひらがな):品詞:感情極性実数値 17 columns = line.split(':') 18 #dic_pn[columns[0]] = float(columns[3]) 19 dic_pn[columns[0]] = int(columns[3]) 20 f.close 21 22 return dic_pn 23 24 25 26#文章データテキストファイルから読み込みます 27print("ツイート内容を入力してみよう。") 28f = input() 29src_txt = f 30 31 32#単語感情極性対応表データを取得する 33dic_pn = read_pn_di() 34#セパレータを「。」とする。 35seperator = "。" 36mixi_diary_origin = src_txt 37mixi_diary_origin = re.sub("[|  「」\n]", "", mixi_diary_origin) # | と全角半角スペース、「」と改行の削除 38 39 40mixi_diary_list = mixi_diary_origin.split(seperator) # セパレーターを使って文章をリストに分割する 41mixi_diary_list = [x+seperator for x in mixi_diary_list] # 文章の最後に。を追加 42 43#この時点でデータの準備が終わりです 44#ここから形態素分析に入ります 45t = Tokenizer() 46 47mixi_diary_words = [] #形態素分析したあとに出てきた語句を格納するリスト(この例では、名詞、形容詞のみの語句を取っています) 48 49semantic_value = 0 50semantic_count = 0 51for sentence in mixi_diary_list: 52 53 tokens = t.tokenize(sentence) 54 words = [] 55 for token in tokens: 56 # 品詞を取り出し 57 partOfSpeech = token.part_of_speech.split(',')[0] 58 59 #感情分析(感情極性実数値より) 60 if( partOfSpeech in ['動詞','名詞', '形容詞', '副詞']): 61 if(token.surface in dic_pn): 62 data = token.surface + ":" + str(dic_pn[token.surface]) 63 print(data) 64 semantic_value = dic_pn[token.surface] + semantic_value 65 semantic_count = semantic_count + 1 66 #if partOfSpeech == u'名詞' or partOfSpeech == u'形容詞' : 67 #print (token.surface) 68 words.append(token.surface) 69 70 if len(words) > 0: 71 mixi_diary_words.extend(words) 72 73 74 75data = "分析した単語数:" + str(semantic_count) + " 炎上値合計:" + str(semantic_value) + " 炎上値平均:" + str(semantic_value / semantic_count) 76print(data) 77 78

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

fire_dictionary.txtの内容は以下の通りです。
夫婦:めおと:名詞:20
普通:ふつう:名詞:20
女性:じょせい:名詞:80
お父さん:おとうさん:名詞:20
奥さん:おくさん:名詞:20
相手:あいて:名詞:20
お母さん:おかあさん:名詞:20
難癖:なんくせ:名詞:30育児:いくじ:名詞:20
女:おんな:名詞:80
皿洗い:さらあらい:名詞:10
ポンコツ:ポンコツ:30
夫:おっと:名詞:20

分かる方がいらっしゃったらどうぞよろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/12/28 15:26

辞書の「ポンコツ」エントリを確認してください。品詞情報がないので':'で分割しても3つにしかなりません。
naochan1027

2020/12/28 15:29

「ポンコツ」エントリを確認した所表示されました。大変助かりました。ありがとうございます。
guest

回答1

0

columns = line.split(':')

のあとに、
print(columns)
を入れてチェックしてみましょう

これでも原因不明なら、その出力結果を提示しよう

投稿2020/12/28 15:12

編集2020/12/28 15:13
y_waiwai

総合スコア88042

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

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

naochan1027

2020/12/28 15:24

返信ありがとうございます。 入力してみた所、 ツイート内容を入力してみよう。 (文章を入力) ['子供', 'こども', '名詞', '10\n'] ['文句', 'もんく', '名詞', '50\n'] ['家事', 'かじ', '名詞', '50\n'] ['旦那', 'だんな', '名詞', '60\n'] ['家族', 'かぞく', '名詞', '20\n'] ['家庭', 'かてい', '名詞', '20\n'] ['夫婦', 'めおと', '名詞', '20\n'] ['普通', 'ふつう', '名詞', '20\n'] ['女性', 'じょせい', '名詞', '80\n'] ['お父さん', 'おとうさん', '名詞', '20\n'] ['奥さん', 'おくさん', '名詞', '20\n'] ['相手', 'あいて', '名詞', '20\n'] ['お母さん', 'おかあさん', '名詞', '20\n'] ['難癖', 'なんくせ', '名詞', '30\n'] ['育児', 'いくじ', '名詞', '20\n'] ['女', 'おんな', '名詞', '80\n'] ['皿洗い', 'さらあらい', '名詞', '10\n'] ['ポンコツ', 'ポンコツ', '30\n'] Traceback (most recent call last): File "fire1.py", line 43, in <module> dic_pn = read_pn_di() File "fire1.py", line 20, in read_pn_di dic_pn[columns[0]] = int(columns[3]) IndexError: list index out of range というエラーが表示されました。 そして、fire_dictionary.txtの途中までしか読みこまれていないことがわかりました。 しかし、この後どうすれば全て読み込まれるのか、indexの長さが揃えられるのか分かりません。 どうかよろしくお願いいたします。
jbpb0

2020/12/28 21:24

「ポンコツ」の品詞
y_waiwai

2020/12/28 22:01

> ['ポンコツ', 'ポンコツ', '30\n'] この行では3つしか要素が取れません(品詞の項目がない) なので、columns[3]はエラーになってます ということで、辞書ファイルを修正しましょう #ってより、辞書ファイルが正しくない場合でも中断してしまわないようなコードを組む、のがベストですが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問