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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

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

解決済

IndexError: list index out of rangeや、関数の挙動を修正したい

moukin
moukin

総合スコア4

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

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

1回答

0グッド

0クリップ

168閲覧

投稿2022/11/28 04:00

前提

python初心者です
授業の一環で、flaskで俳句の季節類推システムを作っています。
入力された季語がどの季節に該当するかを判定し、もし、季節が判別しづらいものであったら(三春などに該当するものですが、ここでは詳細を省きます)、その季語をword2vecで、俳句中の他の単語との類似度から算出した値で決めるというものです
word2vecでの関数からのreturnを受け取る時に以下のエラーメッセージが発生しました。

rekigo = q[0]

IndexError: list index out of range

実現したいこと

エラーを消して、一連の流れを完遂させたい

エラーメッセージ

rekigo = q[0]

IndexError: list index out of range

該当のソースコード

python

1view.py 2 3import logging 4 5from flask import Blueprint, render_template, request, session 6from flask_wtf.csrf import CSRFError 7 8from apps.haiku.form import UploadhaikuForm 9from apps.haiku.season import seki 10from apps.haiku.setup_log import setup_log 11from apps.haiku.word2vec import simiweight, split_weight 12 13ha = Blueprint("haiku", __name__, template_folder="templates") 14 15@ha.route("/", methods=["GET", "POST"]) 16def detectkigo(): 17 r = [] 18 q = [] 19 form = UploadhaikuForm() 20 if request.method == "GET": 21 return render_template("haiku/index.html", form=form) 22 elif request.method == "POST" and form.validate: 23 session["postkigo"] = form.kigo # htmlからの入力 24 session["posthaiku"] = form.haiku # htmlからの入力 25 postkigo = session["postkigo"] 26 posthaiku = str(session["posthaiku"]) 27 season = seki(postkigo) 28 setup_log() 29 logging.debug("%s", season) 30 if season == "三春": 31 r = split_weight(postkigo, posthaiku, season) 32 nouns = r[0] 33 sword = r[1] 34 seasonname = r[2] 35 q = simiweight(nouns, sword, seasonname) 36 # return split_weight(kigo, haiku, season) 37 elif season == "三夏": 38 r = split_weight(postkigo, posthaiku, season) 39 nouns = r[0] 40 sword = r[1] 41 seasonname = r[2] 42 q = simiweight(nouns, sword, seasonname) 43 # return split_weight(kigo, haiku, season) 44 elif season == "三秋": 45 r = split_weight(postkigo, posthaiku, season) 46 nouns = r[0] 47 sword = r[1] 48 seasonname = r[2] 49 q = simiweight(nouns, sword, seasonname) 50 # return split_weight(kigo, haiku, season) 51 elif season == "三冬": 52 r = split_weight(postkigo, posthaiku, season) 53 nouns = r[0] 54 sword = r[1] 55 seasonname = r[2] 56 q = simiweight(nouns, sword, seasonname) 57 # return split_weight(kigo, haiku, season) 58 59 rekigo = q[0] 60 resum = q[1] 61 thse = q[2] # rekigo=春夏秋冬 resum=類似度合計値 62 return render_template( 63 "haiku/index.html", season=rekigo, sum=resum, three=thse, form=form 64 ) 65 66 if __name__ == "__main__": 67 ha.debug = True 68 ha.run(host="0.0.0.0", port=int("5000"), debug=True) 69 70 71@ha.errorhandler(CSRFError) 72def handle_csrf_error(e): 73 return render_template("haiku/csrf_error.html", reason=e.description), 400 74

python

1season.py 2 3from openpyxl import load_workbook 4 5def seki(kigo): 6 wb = load_workbook(r"C:/Users/81804/flaskbook/apps/haiku/季語.xlsx") 7 ws = wb["スクレイピング結果"] 8 ws = wb.active 9 target_string = kigo 10 season = "三秋" 11 for r in ws.columns: 12 for c in r: 13 # もしc.valueがtarget_valueと一致したらその行番号を返す 14 if c.value == target_string: 15 # セル番地を指定する:M10 16 v = c.row 17 b = int(v) 18 season = ws.cell(row=b, column=2).value 19 return season

python

1word2vec.py 2 3import MeCab 4from gensim.models import KeyedVectors 5 6model_dir = r"C:/Users/81804/flaskbook/apps/haiku/entity_vector.model.bin" 7model = KeyedVectors.load_word2vec_format(model_dir, binary=True) 8 9 10def split_weight(sword, text, season): 11 m = MeCab.Tagger("-Ochasen") 12 parse_result = [line.split() for line in m.parse(text).splitlines()][:-1] 13 nouns = [w[0] for w in parse_result if w[3].startswith("名詞")] 14 15 if sword in nouns: 16 num = nouns.index(sword) # 俳句中の季語の配列の格納場所を判定 17 18 seasoname = season 19 nouns.pop(num) # 季語を配列から除去 20 return nouns, sword, seasoname # 俳句中の名詞と季語を渡す 21 22def simiweight(nouns, sword, seasoname): 23 seasons = ["春", "夏", "秋", "冬"] 24 weight = [] 25 for e in seasons: 26 s = model.similarity(sword, e) 27 weight.append(s) 28 29 max = -1 30 i = 0 31 count = 0 32 for n in seasons: # nで季節を切り替え 33 sum = 0 34 for f in nouns: # 俳句中の単語 35 p = model.similarity(f, n) 36 sum = sum + p * weight[i] 37 if sum > max: 38 max = sum 39 count = count + 1 40 i = i + 1 41 season = seasoname 42 43 if count == 1: 44 se = "春" 45 elif count == 2: 46 se = "夏" 47 elif count == 3: 48 se = "秋" 49 elif count == 4: 50 se = "冬" 51 52 return se, max, season

python

1form.py 2 3from flask_wtf.form import FlaskForm 4from wtforms import TextAreaField 5from wtforms.fields.simple import SubmitField 6from wtforms.validators import Length 7 8 9class UploadhaikuForm(FlaskForm): 10 # ファイルフィールドに必要なバリデーションを設定する 11 kigo = TextAreaField( 12 "季語を入力してください:", validators=[Length(min=1, max=5, message="季語の長さにしてください")] 13 ) 14 haiku = TextAreaField( 15 "俳句を入力してください:", validators=[Length(min=8, max=20, message="俳句の長さにしてください")] 16 ) 17 submit = SubmitField("アップロード")

流れとしては、form.pyで受け取った季語と俳句を、view.pyにおいて、順にseason.pyで季語を季語リストから判定し、word2vec.pyのsplit_weightに渡し、その結果をsimiweightに渡し、q[]に格納されるといった感じです。

初めてpythonで書いたので、汚いところばかりですが、原因を教えていただけると幸いです。

試したこと

rekigo = q[0]
resum = q[1]
thse = q[2] の部分を、

rekigo, resum, thse = q とすると、

ValueError: not enough values to unpack (expected 3, got 0)
となり、
returnをもともと受け取れていないのかとも思います。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

melian

2022/11/28 04:07

原因は、season の値が「三春」「三夏」「三秋」「三冬」のいずれでもない場合に q の値が空リスト([])のままになるからです。
moukin

2022/11/30 06:27

コメントありがとうございます、解決できました!

回答1

1

ベストアンサー

seasonが春夏秋冬のどれでもないとき、qは空です。

投稿2022/11/28 04:06

ozwk

総合スコア13048

ps_aux_grep👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

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