Published Date : 2019年5月23日8:25


Deep Manzai Part 2 〜 前半戦 〜



前回の簡単なあらすじ

前回 はScrapyを使って 台本のセリフを取得。

セリフをデータフレームに直して、 解析をしようと試みる。


続き

1 データ収集(Data Scraping)
2 前処理(Preprocessing)
3 分析(Analyizing)
4 Build Neural Network
5 Word2Vecを使う
6 LSTMによる文章生成

前処理と形態素解析

前処理と分析の続きです。

Colaboratory Google Drive マウントして、 作業していきましょう。

Colaboratoryに関しては この記事を参考に。
# まずグーグルドライブをマウント
from google.colab import drive
drive.mount('/content/drive')

"""
Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=hogehogehogehogehoge...................

Enter your authorization code:
[ここにコードを入力してエンターキー]
"""

# JSONファイルをアップロードした場所に移動。
# マイドライブ内に適当なフォルダを作ってそこにJSONファイルをおいてくだちぃ。
cd /content/drive/My Drive/data

# ライブラリインポート
import pandas as pd
import json
import numpy as np

# jsonファイルの読み込み。
with open('./daihon.json','r',encoding='utf-8') as f:
    daihon=json.load(f)

それではセリフを 形態素解析してから、 データフレームに 直していくことにします。

今回はnagisaを使っていきます。

nagisaとは、 pip installで簡単に セットアップできて、
RNNによる文字解析を 行う形態素解析ライブラリです。

簡単にインストールできて、 すぐ使えて高性能。
さらに、出力単語を微調整することが できるというのがかなり便利です。

こちらのリンク で作者の詳しい説明が読めます。

世の中には頭が良くて 人の役に立つ素晴らしい人が 大勢いるもんですね。

複雑な物事をシンプルにしてくれた 作者に、サンキューです!

それでは、nagisa をインストールして 使っていきましょう。

# nagisaをインストール
!pip install nagisa

# 軽く使ってみる
import nagisa
text  = 'ドナルド・トランプ大統領は先日Twitterであの出来事について語った'
words = nagisa.tagging(text)
print(words)

# 結果
--> ドナルド/名詞 ・/補助記号 トランプ/名詞 大統領/名詞 
は/助詞 先日/名詞 Twitter/名詞 で/助詞 
あの/連体詞 出来事/名詞 に/助詞 つい/動詞 て/助詞 語っ/動詞 た/助動詞

動作確認できたので、 元のデータをすっきりさせてから、 形態素解析していきましょう。

import re
import nagisa
import pandas as pd


# タイトルと芸名をまとめる。
titles=[d['title'] for d in daihon]
names=[t.split('「')[0] for t in titles]

# 分析に不要だと思われる記号類を取り除く準備
# 全体用
remove_words_all=lambda x: x.replace('Boke: ','').replace('mannaka: ','').replace('Tukkomi: ','').replace('?','').replace('。','').replace('!','').replace('…','').replace('…。','').replace('!?','').replace('「','').replace('」','').replace('【','').replace('】','').replace('『','').replace('』','').replace('・・・','').replace('~','').replace('(','').replace(')','').replace('、','')
# 分割用
remove_words=lambda x: x.replace('?','').replace('。','').replace('!','').replace('…','').replace('…。','').replace('!?','').replace('「','').replace('」','').replace('【','').replace('】','').replace('『','').replace('』','').replace('・・・','').replace('~','').replace('(','').replace(')','').replace('、','')

# スクレイピングしたJSONファイルから台本のセリフのみを抜き出し、1行ずつ改行でつなげ、一つの文字列にする。
scripts=list('\n'.join(remove_words_all(lines) for lines in d['article']) for d in daihon)

# 分割用
div_scripts=list('\n'.join(remove_words(lines) for lines in d['article']) for d in daihon)

# ボケと(トリオの場合にはmannakaがいる)ツッコミのセリフを分ける。
boke_lines=list(b.replace('Boke: ','') for b in [''.join(re.findall(r'Boke:[^\n]+\n',s)) for s in div_scripts])
mannaka_lines=list(b.replace('mannaka: ','') for b in [''.join(re.findall(r'mannaka:[^\n]+\n',s)) for s in div_scripts])
tukkomi_lines=list(b.replace('Tukkomi: ','') for b in [''.join(re.findall(r'Tukkomi:[^\n]+\n',s)) for s in div_scripts])


# 分かち書きする際に、例えば「四千頭身」が「四千」と「頭身」に分かれてしまうのを防ぐ。
# もう少し、シングルワードを加えていく。
# 台本をみながら独断と偏見で、しかもこれでも全体の2%という凶悪さ。

single_word=['どうも','ザ・バーディーズ','サッカーワールドカップ','サッカーW杯','お願い','お願いします','すいません','ありがとうございます',
'すごいっすね','でね','このまま','あのね','だから','80代','しょうもな','しょうもない','4人','かなと','やんか','なるんよ','たんかな','やないか',
'へんように','のよ','んやけど','てへんよ','やけに','おかえりなさい','タッちゃん','したはっ','くるんかーい','きたやん','いらん','とって','カリスマ美容師',
'美容師','なるほどな','ほんなら','ヘアスタイル','かしこまりました','いらっしゃいませ','木村拓哉','福士蒼汰','ベリーショート','モト冬樹','えっえっ','ショートカット',
'はやってる','モト冬樹','いや','すいません','全体的','だから','お赤飯','整髪料','ねん','これ','もうええわ','どうもありがとうございました','お姉ちゃん',
'よい子','めちゃくちゃ','数十倍','距離感','奇跡的','えいえい','んっ','えい','ダンスパーティー','神様','洋食屋','東京Walker','オムライス','温暖化',
'ポケットティッシュ','1回','ひょうたん島','お父さん','1か月','ちょっ','ちょっと','お金','お笑い','40年','ピン芸','2009年','M-1グランプリ','M-1',
'トップバッター','審査委員長','島田紳助','何回','6回','2012年','北野演芸館','ビートたけし','1年半','誰','医学部','国家試験','漫才師','自動車学校','学科',
'8回','9回','通り','三つ編み','オギャ~','14~15歳','25周年','関西弁','東京都','大阪府','通天閣','人前','スカイツリー','トテトテ','どっか','最先端',
'全問正解','1問','親しき中にも礼儀あり','こんにゃく','おじさん','与太小僧','他の人','お化け','メリーさん','一人称','貴様','びびって','女の人','肝の玉',
'エンドレスリピート','最先端','マジ卍','十二ひとえ','12枚','かごかい','いとをかし','コロ助','懐メロ','秋の田のかりほ','1つ','元カノ','ありがとうございました','2階',
'600','何度','気のせい','お手下げ','ドコドコドコドン','ブサイク','不細工','マックシェイク','失礼しま~す','ペチペチ星','5歳','週5','罰ゲーム','ペチンコ屋',
'パチンコ屋','ペチペチクイズ','10回','ホヤァ~ン','ペチペチダンス','だって','一回','一等','二等','3回','5年間','ジャスティン・ビーバー']

# くっつける。
names=names+single_word
# 分かち書きができるように準備
nagisa_tagger=nagisa.Tagger(single_word_list=names)

# 分かち書きして、データフレームに直す下準備の関数
def nagisa_parse(text,nagisa_tagger):
    text=text.split('\n')
    
    wakati_list=[nagisa_tagger.tagging(t) for t in text] 

    wakati_words=[wakati.words for wakati in wakati_list]
    wakati_postags=[wakati.postags for wakati in wakati_list]
  
    wakati_zip=[list(map(list,zip(w,wakati_postags[i]))) for i,w in enumerate(wakati_words)]
    wakati_comb=[j for z in wakati_zip for j in z]
    return wakati_comb

# 分かち書き 全体Ver
wakati_comb=[nagisa_parse(s,nagisa_tagger) for s in scripts]

# 分かち書き 各役割ごとVer
boke_wakati_comb=[nagisa_parse(s,nagisa_tagger) for s in boke_lines]
mannaka_wakati_comb=[nagisa_parse(s,nagisa_tagger) for s in mannaka_lines]
tukkomi_wakati_comb=[nagisa_parse(s,nagisa_tagger) for s in tukkomi_lines]

# キーをタイトルに、バリューをデータフレームにした辞書にする。
wakati_dfs_dict=dict((titles[i],pd.DataFrame(w,columns=['words','postags'])) for i,w in enumerate(wakati_comb))

# 役割ごと
# これはタイトル数と合わないので普通にデータフレームする
boke_wakati_dfs_dict=list(pd.DataFrame(w,columns=['words','postags']) for w in boke_wakati_comb)
mannaka_wakati_dfs_dict=list(pd.DataFrame(w,columns=['words','postags']) for w in mannaka_wakati_comb)
tukkomi_wakati_dfs_dict=list(pd.DataFrame(w,columns=['words','postags']) for w in tukkomi_wakati_comb)

# 中身を見る
scrpts_dfs_dict[titles[0]]


Responsive image

四千頭身は大丈夫だったけど、
Responsive image

コロコロコミック、
あと「オチだなどうも ありがとうございました」
が変になってるので、 修正が必要かと。

(一応、single_wordで修正したので直っているはず。。。)


次回へ続く

今回も激短くなってしまいました。 次回へ持ち越しデス。


See You Next Page !