かんだブログ

かんだがちょっと勉強したことを書き連ねるブログです

Lineのトーク履歴をデータ分析してみる話 その1

なにしたの

Lineのトーク履歴をダウンロードして、パースしてPandasにつっこんだ

久々に真面目な記事なのです

どうもかんだです。もっと早く次を書こうとして忘れていました。

今回は思いつきでLineのトーク履歴をデータ分析したくなって、そのために前処理を行った話です。

はじめにLineのトーク履歴をダウンロードします。
そうするとこんな形式で出てきます。

[LINE] Aさんとのトーク履歴
保存日時:2017/10/25 01:31

2016/06/22(水)
01:21   Aさん よかったです!!おめでとうございます!!
01:21   かんだ   ありがとうございます!!
...
14:33   かんだ   もう離脱
14:35   Aさん はやい

2016/07/18(月)
15:05   Aさん [写真]
15:08   かんだ   いえーい
ありがとうー
15:09   Aさん いえーい[f:id:aka_keishin:20171028010847p:plain]
...

...

嫌がらせみたいな形式なわけですよ。しかも改行すると、行の頭に本文がくるという、、、
完全なパースはムリなのですが、自分なりに頑張ってみました。

def parse_linedata(rawdata):
    import pandas as pd
    import re
    rawdata = rawdata[3:]
    structed = []
    _s = []

    datetime_list = []
    name_list = []
    text_list = []
    for r in rawdata:
        if re.match( r"201[0-9]/[0-1][0-9]/[0-3][0-9]", r):
            if len(_s) != 0:
                structed.append(_s[:-1])
            _s = []
            _s.append(r[:-4])
            
            datestr = r[:-4]
        elif re.match( r"[0-2][0-9]:[0-5][0-9]\t", r):
            rs = r.split('\t', 2)
            _s.append(r.split('\t', 2))
            datetime_str = datestr +' ' + rs[0]
            datetime_list.append(datetime_str)
            name_list.append(rs[1])
            text_list.append(rs[2])
        else:

            jo = [_s[-1][2] , r]
            nr  = ''.join(jo)
            _s[-1][2] = nr
            
            join_text = [text_list[-1], r]
            new_text = ''.join(join_text)
            text_list[-1] = new_text

    line_pd = pd.DataFrame({
 
        "name": name_list,
        "text": text_list,
    })
    line_pd.index= pd.to_datetime(datetime_list)
    return line_pd

rawdataは、ファイルを読み込んで、readlinesでリストに突っ込んだだけのものを想定しています。

仕方がないので、最初の三行を読み飛ばしています。
その後は、行によって、日付と本文1行目、本文の2行目以降というように3つに場合分けして処理しています。
最後にpandasの形式にするのですが、日付と日時が別れているのがめんどくさすぎるので、日付日時のindexを作って
その後のカラムに名前、本文を入れる形にしています。

結果はこんな感じです。

f:id:aka_keishin:20171028010847p:plain
pandas

現在のバグは、その日の日付の末尾の本文の改行が2つはいってしまうということです。

次回までに直します!よろしく!