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

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

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

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

1回答

223閲覧

投票を行う関数を作成したい

aoisj

総合スコア27

Python 3.x

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2017/12/22 09:35

テキストファイルを使ってLDAモデルを作成しテキストファイルのカテゴリをしたいと考えています。
「学習データのカテゴリ番号」リストと
LDAモデル作成によって得られた「各トピック番号が最大トピックだったファイル番号の一覧」リストを使って
「各トピック番号がそれぞれどのカテゴリを表しているのか」を決定したいと考えています。
まず、関数に用いるデータです。

python

1#学習データのカテゴリ番号 2category_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] 3 4#学習データの最大トピック 5topic_result = [[11, 13, 26, 34, 37, 41, 46], 6 [7, 30], 7 [61], 8 [8, 10, 19, 27, 39, 48, 55, 62, 71], 9 [3, 14, 17, 24, 32, 51, 56, 60, 70], 10 [1, 9, 23, 25, 33, 38, 43, 44, 49, 57, 63], 11 [2, 6, 12, 21, 31, 32, 35, 50, 52, 58, 65], 12 [5, 16, 22, 42, 45, 59, 66, 67], 13 [18, 29, 53, 68], 14 [0, 4, 15, 20, 28, 36, 40, 47, 54, 64, 69]] 15 16#入力データのトピック(最大3つ) 17top3 = [9, 6, 4]

このtop3[]場合、トピック9,6,4についてcategory_listとtopic_listを用いて
入力データのカテゴリを推定します。
以下にカテゴリの推定に用いる関数を記します。

python

1def decide_category(category_list,topic_result,top3): 2 test_data_category = [] 3 for i in top3: 4 test_topic_list = topic_result[i] 5 a = [] 6 for j in test_topic_list: 7 a[category_list[j]] += 1 8   test_data_category.append(max(a)) 9 return test_data_category

イメージとしては学習データの各ファイルがそれぞれ
「自分の最大トピックの番号」に1票投票し、
トピック番号毎に最も票数が多かったトピック番号をそのトピックのカテゴリとする
といったところです。
分かりづらかったら申し訳ありません。
この関数で出てしまったエラーは以下の通りです。

a[category_list[j]] += 1 IndexError: list index out of range

a[] += 1という表現がまずかったということなのですが、解決策を教えていただきたいです。

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

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

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

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

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

guest

回答1

0

リストのまま運用したい場合
前もってaを0のリストに初期化しておけばよいです。

python

1a = [0] * 10

リストのままでなくても良い場合
辞書として扱ってよいなら、collections.defaultdictが便利でしょう。

ひょっとして

こういうことでしょうか?
このデータは何ぞや、という段階から考え直しているので、外していたらすみません。

Python

1from collections import Counter 2 3# トピックごとのカテゴリ番号 4topic_category_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] 5 6# 各学習データの最大トピック 7teacher_topic_list = [ 8 [11, 13, 26, 34, 37, 41, 46], 9 [7, 30], 10 [61], 11 [8, 10, 19, 27, 39, 48, 55, 62, 71], 12 [3, 14, 17, 24, 32, 51, 56, 60, 70], 13 [1, 9, 23, 25, 33, 38, 43, 44, 49, 57, 63], 14 [2, 6, 12, 21, 31, 32, 35, 50, 52, 58, 65], 15 [5, 16, 22, 42, 45, 59, 66, 67], 16 [18, 29, 53, 68], 17 [0, 4, 15, 20, 28, 36, 40, 47, 54, 64, 69] 18] 19 20# 入力データと類似した学習データ 21similar_teacher_data_indice = [9, 6, 4] 22 23def get_category_list_by_topics(topic_category_list, topic_list): 24 return [topic_category_list[i] for i in topic_list] 25 26def decide_category(topic_category_list, teacher_topic_list, similar_teacher_data_indice): 27 topic_list = [] 28 for index in similar_teacher_data_indice: 29 topic_list.extend( 30 get_category_list_by_topics(topic_category_list, teacher_topic_list[index]) 31 ) 32 33 return Counter(topic_list).most_common(1)[0][0] 34 35print( 36 decide_category( 37 topic_category_list, 38 teacher_topic_list, 39 similar_teacher_data_indice 40 ) 41)

同率一位が複数あるときはどうすんだろな、という思いもあります。

投稿2017/12/22 09:46

編集2017/12/22 10:19
LouiS0616

総合スコア35660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問