teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

2509閲覧

2つのリストに格納されている重複率を知りたい

hidemomo

総合スコア31

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/08/20 07:26

編集2019/08/20 07:44

0

0

pythonで作成した2つのリスト(予測値/真値)があります。それぞれワードが各行に5つ入っており、同一ワードが入っている確率(重複率/合致率)を知りたいです。目視では「おいしそう」など重複もあるのですが、どうしても重複リストが空になります。とりあえずそのまま重複率計算まで進めましたが、合っているか不明です。またかなり冗長なのでわかりやすく処理できるコードもご教示いただけると幸いです。

試行したこと/悩み

(悩み1)重複リスト(true_lst)が空になる
(悩み2)重複率の計算が合っているか不明。

python

list_a(予測値:5×5): [['おいしそう', 'こわだり', '飲みもの', '爽やか・さっぱり', '冷たい'], ['おいしそう', '飲みもの', '季節', '色・色合い', '爽やか・さっぱり'], ['なじみ', '好み', '濃厚', '風味', '目立つ'], ['おいしそう', '安心・信頼', '飲みもの', '好み', '親しみ・懐かしい'], ['おいしそう', 'こわだり', '飲みもの', '形状', '爽やか・さっぱり']] list_b(真値:5×5): [['おいしそう', '色・色合い', '洗練', '爽やか・さっぱり', '優しい'], ['おいしそう', 'シンプル', 'わかる', '高級', '文字・字体'], ['おいしそう', 'わかる', '菓子', '画像・イラスト', '色・色合い'], ['おいしそう', 'わかる', '果実・果実感・みずみずしさ', '画像・イラスト', '色・色合い'], ['おいしそう', 'わかる', '可愛い', '色・色合い', '野菜']] list_a_df = pd.DataFrame(list_a) list_b_df = pd.DataFrame(list_b) true_lst = [] #重複リスト false_lst = [] #非重複リスト n = len(list_a) for i in range(n): for tag_a in list_a_df.iloc[i]: if tag_a in list_b_df.iloc[i]: true_lst.append(tag_a) else: false_lst.append(tag_a) #true_lst=[] empty #false_lst = 25 #以下、重複率計算(真値list_bとの重複) #リスト内の全要素数をカウント def my_len(l): count = 0 if isinstance(l, list): for v in l: count += my_len(v) return count else: return 1 list_b_count = my_len(list_b) true_lst_count = my_len(true_list) accuracy = true_lst_count/list_b_count

色々探ってみましたが、かなりスタックしています。
アドバイスのほど、どうぞよろしくお願いします。

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

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

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

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

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

quickquip

2019/08/20 07:39

重複率はこういう式で求める、という定義はできるがその通りに実装できない、という話でしょうか。 重複率という名前のぼんやりした何かの指標を、どういう式で求めたらいいかわからない、という話でしょうか。
hidemomo

2019/08/20 07:46

ご質問ありがとうざごいます。 前者になります。
guest

回答1

0

ベストアンサー

行ごとに 一致する文字列の数 / リストb のその行の要素数 を計算したい場合、set に変換して、集合演算を行えばよいです。

イメージ説明

python

1list_a = [ 2 ["おいしそう", "こわだり", "飲みもの", "爽やか・さっぱり", "冷たい"], 3 ["おいしそう", "飲みもの", "季節", "色・色合い", "爽やか・さっぱり"], 4 ["なじみ", "好み", "濃厚", "風味", "目立つ"], 5 ["おいしそう", "安心・信頼", "飲みもの", "好み", "親しみ・懐かしい"], 6 ["おいしそう", "こわだり", "飲みもの", "形状", "爽やか・さっぱり"], 7] 8 9list_b = [ 10 ["おいしそう", "色・色合い", "洗練", "爽やか・さっぱり", "優しい"], 11 ["おいしそう", "シンプル", "わかる", "高級", "文字・字体"], 12 ["おいしそう", "わかる", "菓子", "画像・イラスト", "色・色合い"], 13 ["おいしそう", "わかる", "果実・果実感・みずみずしさ", "画像・イラスト", "色・色合い"], 14 ["おいしそう", "わかる", "可愛い", "色・色合い", "野菜"], 15] 16 17for a, b in zip(list_a, list_b): 18 intersection = set(a) & set(b) # 共通の要素 19 score = len(intersection) / len(b) # 共通の要素数 / b の要素数 20 print(score) 21# 0.4 22# 0.2 23# 0.0 24# 0.2 25# 0.2

投稿2019/08/20 07:49

tiitoi

総合スコア21960

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

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

hidemomo

2019/08/20 07:53

なるほど。集合演算は思いつきませんでした。ご指導ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問