Published Date : 2019年4月30日2:18

!pip install markovify
# ライブラリをインポート
import markovify
# Wikipediaの文章を形態素で分割して、
# 不要な文字を取り除き、
# 改行をつけて一つの文字列にする。
text="モーニング娘。 モーニング むすめ は 、 日本 の 女性 アイドル ・ ボーカル & ダンス グループ で ある \n
所属 事務所 は アップフロントプロモーション 旧 ・ アップフロントエージェンシー \n
ハロー ! プロジェクト 以下 、 ハロプロ の 一員 \n
略称 は モー娘。 モー むす。 娘。 むすめ と 略さ れる こと も ある \n
また 、 メンバー や OG など は モーニング と 呼ぶ こと も 多い \n
日本 国外 で の 表記 は Morning Musume。 英語 、 早 安 少女 組 。 中国 語 など \n
正式 名称 について 、 2014 年 1 月 1 日 以降 は モーニング 娘。 の 後 に 当該 年 の 西暦 の 下 二 桁 を 付し て モーニング 娘。 '○○ と し て いる \n
例 : モーニング 娘 。 19 \n
読み は 、 もーにんぐむすめ に 続い て 、 西暦 の 10 の 位 と 1 の 位 を それぞれ 英語 読み する \n
例 : モーニング 娘。 19 なら ば モーニング むすめ ワン ナイン \n
ほぼ 全 楽曲 の 作詞 ・ 作曲 を 同 グループ の 生み の 親 で サウンド プロデューサー の つんく♂ シャ乱Q が 手掛ける \n
1998 年 の メジャーデビュー から 2018 年 10 月 現在 まで に リリース し た シングル の うち 66 作品 が オリコン の 週間 CD 販売 ランキング の トップ 10 に 、\n
さらに その 大 部分 が トップ 5 に 入り 、 過去 に は NHK 紅白 歌合戦 に 10 年 連続 出場 する など 、\n
グループ 発足 から 現在 に 至る まで 20 年 以上 に 渡り 安定 し た 人気 を 保ち 続け て いる \n
また 、 日本 国外 に も 多く の ファン が 存在 し 、 海外 ライブ や イベント など も 行う \n"
# 色々試してみて、日本語の場合は
# 形態素で分割したのち、
# 文の終わり「。」を改行に変えて
# 一つの文字列にして、NewlineTextメソッドを
# 使用したほうが良く認識してくれたので、
# この方法をとってます。
text_model = markovify.NewlineText(text)
# できたモデルを使って文章生成。
# make_sentenceメソッドを使い十回文章を生成させる。
# 文章が出来ないとNoneが返されるので、
# If文を使ってそれを弾いて表示させる。
for _ in range(10):
sentence=text_model.make_sentence()
if sentence is not None:
print(sentence)
else:
continue

# ブログ記事の文章を使うため、
# Sudachiをドライブに保存するため、
# またまた何回目なのよ!のドライブマウント。
from google.colab import drive
drive.mount('/content/drive')
# 前回のフォルダに民族大移動 cd drive/'My Drive'/data # sudachi install !pip install -e git+git://github.com/WorksApplications/SudachiPy@develop#egg=SudachiPy

# 最新の辞書をダウンロード !wget https://object-storage.tyo2.conoha.io/v1/nc_2520839e1f9641b08211a5c85243124a/sudachi/sudachi-dictionary-20190425-full.zip # ZIPを解凍 !unzip sudachi-dictionary-20190425-full.zip # 辞書を使えるように、大本営へ移してあげる。 !mv sudachi-dictionary-20190425/system_full.dic src/sudachipy/resources/system.dic



# SudachiをPythonで使えるように民族大移動
cd src/sudachipy
# JSONファイルを読み込むためにインポート
import json
# Sudachiぃを使えるようにインポート
from sudachipy import config
from sudachipy import dictionary
from sudachipy import tokenizer
# ブログ記事を読み込む
# '../../'は上の上のフロアを意味しています。
with open('../../morningblog.json','r',encoding='utf-8') as f:
morning_blog=json.load(f)
# 必要な設定ファイルを読み込む
with open(config.SETTINGFILE, 'r', encoding='utf-8') as f:
settings = json.load(f)
# 形態素をするためのオブジェクトを作成
tokenizer_obj = dictionary.Dictionary(settings).create()
# 実験で短い文章を入れてみる。
# windowsなら改行マークは「¥n」でよし。
text='\n'.join(morning_blog[0]['article'])
# SplitMode.C(モードC)
# にするといい感じに長い単語を認識してくれる。
mode = tokenizer.Tokenizer.SplitMode.C
# いざ形態素解析。
tokens = tokenizer_obj.tokenize(mode, text)
# 単語ごとにバラバラに分割したものを一つずつ解析。
for i,t in enumerate(tokens):
# 例外を排除していく。
try:
# 単語を正規化していく。
# こんばんわ ー> 今晩は
# ふいんき ー> 雰囲気(ふんいき)
# ツア− ー> ツアー 等
# 全角を半角にしたり、半角を全角にしたり、
# 漢字に直したり、通常の表現方法に直したり、etc
norm = tokenizer_obj.tokenize(mode,t)[0].normalized_form()
# 単語の品詞を調べる。
# 名詞、動詞、助動詞、形容詞など。
p_o_s = tokenizer_obj.tokenize(mode,norm)[0].part_of_speech()[0]
# 元の単語と、比べて表示していく。
print(f'*********{i+1}回目の解析*********')
print(f'元の単語 -> {t} : 正規化表現 -> {norm}')
print(f'元の単語 -> {t} : 品詞 -> {p_o_s}')
print('*'*30)
# 例外が出たら無視して続ける
except:
pass

# データをいっぺんに処理するためPandasをインポート import pandas as pd # 全ての記事のリストを改行で繋げて文字列にする。 articles=['\n'.join(mb['article']) for mb in morning_blog] # データフレームに変換。 new_df=pd.DataFrame([[mb['author'],mb['title'],mb['date'],articles[i]] for i,mb in enumerate(morning_blog)],columns=list(morning_blog[0].keys())) # 情報を覗く。 new_df.info() # 情報を覗く。 new_df.describe()

# メンバーごとに数値化してみる。
new_df.groupby('author').count()

# 時間をDatetimeオブジェクトにすり替える。 new_df['date']=new_df['date'].apply(pd.to_datetime)
# 午前中、午後、夕方、夜、夜中の彼女らの動向(マネージャーの動向)
morning_coffee=new_df[(new_df['date'].apply(lambda x: x.hour)>=6) & (new_df['date'].apply(lambda x: x.hour)<=12)].groupby('author').count()
afternoon_count=new_df[(new_df['date'].apply(lambda x: x.hour)>=13) & (new_df['date'].apply(lambda x: x.hour)<=16)].groupby('author').count()
after_five=new_df[(new_df['date'].apply(lambda x: x.hour)>=17) & (new_df['date'].apply(lambda x: x.hour)<=19)].groupby('author').count()
night_count=new_df[(new_df['date'].apply(lambda x: x.hour)>=20) & (new_df['date'].apply(lambda x: x.hour)<=23)].groupby('author').count()
midnight_temptation=new_df[(new_df['date'].apply(lambda x: x.hour)>=0) & (new_df['date'].apply(lambda x: x.hour)<=5)].groupby('author').count()





tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in articles]
# "author"の名前をリストにする。 authors=new_df['author'].unique().tolist() # "author"ごとにデータフレームを分ける。 split_by_author_df=[new_df[new_df['author'].apply(lambda x: x == author)] for author in authors]


# "author"を表示させてエディターにコピペ。
# print関数に今からPythonコードで繰り返すコードを先取り40万
for author in authors:
print(f'{author} = split_by_author_df[]')






# Google Colaboratory へ貼り付けるんるん。 # Python3は日本語の変数にしても全然OK 譜久村聖 = split_by_author_df[0] 石田亜佑美 = split_by_author_df[1] 羽賀朱音 = split_by_author_df[2] 横山玲奈 = split_by_author_df[3] 生田衣梨奈 = split_by_author_df[4] 小田さくら = split_by_author_df[5] 野中美希 = split_by_author_df[6] 森戸知沙希 = split_by_author_df[7] 牧野真莉愛 = split_by_author_df[8] 加賀楓 = split_by_author_df[9] 佐藤優樹 = split_by_author_df[10] 鞘師里保 = split_by_author_df[11] ブログ = split_by_author_df[12] 飯窪春菜 = split_by_author_df[13] 尾形春水 = split_by_author_df[14] 工藤遥 = split_by_author_df[15] 鈴木香音 = split_by_author_df[16]
# 一応長さ確認。
len(ブログ_tokens_list)
---> 63
# 形態素解析 (約5秒)
ブログ_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in ブログ['article']]
# 一個表示してみる。
print(''.join([t.surface() for t in ブログ_tokens_list[0]]))


display([(i,a.split('\n')[-1]) for i,a in enumerate(ブログ['article'].tolist())])


# 一つづつ様子を見て
# 片付けて行きたいので
for author in authors:
print(f'''{author}_tokens_list =
[tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article)
for article in {author}['article']]''')
譜久村聖_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 譜久村聖['article']] 石田亜佑美_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 石田亜佑美['article']] 羽賀朱音_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 羽賀朱音['article']] 横山玲奈_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 横山玲奈['article']] 生田衣梨奈_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 生田衣梨奈['article']] 小田さくら_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 小田さくら['article']] 野中美希_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 野中美希['article']] 森戸知沙希_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 森戸知沙希['article']] 牧野真莉愛_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 牧野真莉愛['article']] 加賀楓_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 加賀楓['article']] 佐藤優樹_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 佐藤優樹['article']] 鞘師里保_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 鞘師里保['article']] ブログ_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in ブログ['article']] 飯窪春菜_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 飯窪春菜['article']] 尾形春水_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 尾形春水['article']] 工藤遥_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 工藤遥['article']] 鈴木香音_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 鈴木香音['article']]
# ふくちゃんの番 譜久村聖_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 譜久村聖['article']] # 石田亜佑美_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 石田亜佑美['article']] # 羽賀朱音_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 羽賀朱音['article']] # 横山玲奈_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 横山玲奈['article']] # 生田衣梨奈_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 生田衣梨奈['article']] # 小田さくら_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 小田さくら['article']] # 野中美希_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 野中美希['article']] # 森戸知沙希_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 森戸知沙希['article']] # 牧野真莉愛_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 牧野真莉愛['article']] # 加賀楓_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 加賀楓['article']] # 佐藤優樹_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 佐藤優樹['article']] # 鞘師里保_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 鞘師里保['article']] # ブログ_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in ブログ['article']] # 飯窪春菜_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 飯窪春菜['article']] # 尾形春水_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 尾形春水['article']] # 工藤遥_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 工藤遥['article']] # 鈴木香音_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 鈴木香音['article']]
# 譜久村聖_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 譜久村聖['article']] # あゆみんの番 石田亜佑美_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 石田亜佑美['article']] # 羽賀朱音_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 羽賀朱音['article']] # 横山玲奈_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 横山玲奈['article']] # 生田衣梨奈_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 生田衣梨奈['article']] # 小田さくら_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 小田さくら['article']] # 野中美希_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 野中美希['article']] # 森戸知沙希_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 森戸知沙希['article']] # 牧野真莉愛_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 牧野真莉愛['article']] # 加賀楓_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 加賀楓['article']] # 佐藤優樹_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 佐藤優樹['article']] # 鞘師里保_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 鞘師里保['article']] # ブログ_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in ブログ['article']] # 飯窪春菜_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 飯窪春菜['article']] # 尾形春水_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 尾形春水['article']] # 工藤遥_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 工藤遥['article']] # 鈴木香音_tokens_list = [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in 鈴木香音['article']]
# yield文で返し、小分けにして取り出してやるぜぇ
# でも時間の総数は変わらないぜぇ
# マイルドだろぉ
def yield_sudachi(df_list):
for df in df_list:
yield [tokenizer_obj.tokenize(tokenizer.Tokenizer.SplitMode.C, article) for article in df['article'].tolist()]
# 使い方
# リストのスライスを使って、大体4分の1くらいの量をめざす!
tokens_list_by_author_quarter=yield_sudachi(split_by_author_df[:4])
# 一瞬で終わるが、tokens_list_by_authorの
# 正体は処理を待ち望んでいるジェネレーターだ!
# 確認してみるがよい!
import types
isinstance(tokens_list_by_author, types.GeneratorType)
---> True
# さあ、あとはちょこっとづつ取り出して、リストにアペンドしていくだけだ!
# ユニークな名前をつけておくのを忘れるな!
tokens_list_by_authors_quarter=[tlbaq for tlbaq in tokens_list_by_author_quarter]
# 範囲だけ先にリスト化していけばいいかも
# そんで空のリストにアペンドでもいいかもね
term_1=split_by_author_df[:4] # 0~3 4つ
term_2=split_by_author_df[4:8] # 4~7 4つ
term_3=split_by_author_df[8:13] # 8~12 4つ
term_4=split_by_author_df[13:] # 13~16 4つ
# 最初だけ用意
tokens_list_by_authors=[]
# 繰り返しながら時間の様子をみる。
# 結局メモリが足りなくなるとクラッシュするんだ慎重にな!
tokens_list_by_author=yield_sudachi(term_1)
tokens_list_by_authors.appned([tlba for tlba in tokens_list_by_author])
tokens_list_by_author=yield_sudachi(term_2)
tokens_list_by_authors.appned([tlba for tlba in tokens_list_by_author])
.........................
.........................
# みんなダイスキピックルが簡単に作れるよ!
import dill
# このままピックル(塩漬け)にすると
# エラーが起こり、ピックルにできねぇよ!と怒られるので、
# 不本意ですが一旦全て文字列にしておきます。
tokens_list_by_authors_list=[[[token.surface() for token in tokens] for tokens in tokens_list_by_author] for tokens_list_by_author in tokens_list_by_authors]
# ピックルピックル!
with open('../../tokens_list_by_authors_list.pkl','wb') as f:
dill.dump(tokens_list_by_authors_list,f)

# これで取り出せます。
with open('../../tokens_list_by_authors_list.pkl','rb') as f:
tokens_list_by_authors_list=dill.load(f)