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)