読者です 読者をやめる 読者になる 読者になる

歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【Python】魔法少女まどか☆マギカ考察Wikiの各話別台詞集をpandasのデータフレームに変換する

@Med_KUさんがラブライブ各話のキャラに向けたセリフのネットワークを描いてらしたので、同じことをPythonでもできないかと画策中。

 

(余裕があったらやりたいですが)さすがにアニメ全話見返してセリフを写経する時間は無いので、魔法少女まどか☆マギカ考察Wikiの各話別台詞集を使うことにし、とりあえず扱いやすいようにpandasのデータフレームで変換しました。ネットワーク化は近々やります。

 

台詞を一行ずつ読み込んで、"「"移行を削除、段落で分けられてる(改行が複数回続く)と次の会話としています。

例えば冒頭の部分は、

まどか「んっん…あっ…!」
まどか「あっ…!」
まどか「ひどい…」
キュゥべえ「仕方ないよ。彼女一人では荷が重すぎた」
キュゥべえ「でも、彼女も覚悟の上だろう」
まどか「そんな…あんまりだよ、こんなのってないよ」
キュゥべえ「諦めたらそれまでだ」
キュゥべえ「でも、君なら運命を変えられる」
キュゥべえ「避けようのない滅びも、嘆きも、全て君が覆せばいい」
キュゥべえ「そのための力が、君には備わっているんだから」
まどか「本当なの?」
まどか「私なんかでも、本当に何かできるの?こんな結末を変えられるの?」
キュゥべえ「もちろんさ。だから僕と契約して、魔法少女になってよ!」

まどか「夢オチ…?」


まどか「おはよう、パパ」
知久「おはよう、まどか」
まどか「ママは?」
知久「タツヤが行ってる。手伝ってやって」
まどか「はぁい」

 

アウトプットはこのようになります。

1段落目はまどかが9回、キュゥべえが7回発言しており、1行目にそれぞれ5,7という数字が入ります。つまりこの段落はこの二人の会話です。

2行目が全部ゼロなのは、段落ごとの改行の数がまちまちなせいです。これが気になるなら、全てゼロの行を削除すればいいと思います。

  まどか ほむら キュゥべえ マミ さやか 杏子 知久 詢子 和子 恭介 仁美
0 5 0 7 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 0
3 3 0 0 0 0 0 2 0 0 0 0

 

簡単に出来るとおもいきや、キャラ名が統一されていかったり(マミとまみ、恭介と上条)、心情や複数人の台詞に違う括弧が使われていたり、ややこしい点をひとつずつクリアしなきゃいけませんでした。「こつこつやる奴ァ ごくろうさん」の心境ですね。

 

知久・タツヤ『いってらっしゃい~』
みたいな、複数人のセリフはカウントできていません。

また、会話の向きまでは考慮していないため、誰から誰へ言葉を投げかけたかという有向グラフでの解析はできません。

 

このコードをちょっと変えれば二次創作のSSの解析にも使えそうですね。

# coding: UTF-8
import pandas as pd
#import networkx as nx #今回使ってませんが、今後ネットワーク化します…

#まみ→マミ、上条→恭介に統一
chara = [u"まどか",u"ほむら",u"キュゥべえ",u"マミ",u"さやか",u"杏子",u"知久",u"詢子",u"和子",u"恭介",u"仁美"]

def readchap(num):
    f = open('./madokatext/chap'+str(num)+'.txt') #txtファイルはutf-8形式
    chap = f.read()  # ファイル終端まで全て読んだデータを返す
    return chap

#正規表現で「」内を置き換えればいいんだろうけどわからん
def removekakko(text):
    text = text.replace("(","「")
    text = text.replace("『","「")
    temp = text.split("「")
    return temp[0]

def text_to_dataframe(chap):
    import numpy as np
    
    chap = chap.split("\n")
    for x in range(0,len(chap)):
        chap[x] = removekakko(chap[x])
        
    clist = np.zeros(11)

    templist = []
    for x in chap:
        if x != "":
            if x == "まどか":
                clist[0] += 1
            if x == "ほむら":
                clist[1] += 1
            if x == "キュゥべえ":
                clist[2] += 1
            if x == "マミ" or x == "まみ":
                clist[3] += 1
            if x == "さやか":
                clist[4] += 1
            if x == "杏子":
                clist[5] += 1
            if x == "知久":
                clist[6] += 1
            if x == "詢子":
                clist[7] += 1
            if x == "和子":
                clist[8] += 1
            if x == "恭介" or x == "上条":
                clist[9] += 1
            if x == "仁美":
                clist[10] += 1
        else:
            templist.append(clist)
            clist = np.zeros(11)
            
    dataframe = pd.DataFrame(templist)
    dataframe.columns = chara
    return dataframe

for num in range(1,13): #1話から12話まで変換をループ
    chap = readchap(num)
    DF = text_to_dataframe(chap)
    filename = './madokatext/dataframe'+str(num)+'.csv'
    DF.to_csv(filename,encoding="utf-8")