日々気まぐれログ

やったりやらなかったり。  

ツギクルバナー 小説『夢次元機アルマエレンシア』連載中です。
 よろしくお願いします。

雑記

Colabでseq2seqを動かす2行のおまじない

colab-logo-1


Google Colaboratoryのケラスとテンソルフローの
なんか安定した組み合わせのアレ的な備忘録です。



#おまじない

!pip uninstall tensorflow
!pip uninstall keras
!pip install keras==2.3.1
!pip install tensorflow==2.2.0




アンインストールかけてもかけなくても良いけど念の為。

JUMAN++の処理速度が遅い問題

colab-logo-1


MeCab他、形態素解析はそれぞれ一長一短あれど
ひとまずウチではJUMAN++を採用するに至り。

しかし、処理速度が遅い。遅いったら遅い。
Google Colabで走らせて寝て起きて。
気づいたら止まってた、ということもしばしば。

なので途中までの出力をドライブに保存しつつ、
処理済みのコーパスをスルーしようというアレ。

ただ、途中で処理をやめたものはやり直してほしいので
存在するファイルの一個前から再処理という形に。
初回0番目ファイルは普通に処理してもろて、はいヨロシクゥ。


# 品詞分解メイン処理

def juman():
    spritfile_list = glob.glob(output_dir + '/*')
    spritfile_list.sort()
    print('総分割ツイートファイル数:'+str(len(spritfile_list)))

    for i in range(0,len(spritfile_list)) :
        if os.path.exists(juman_dir +'/juman-' + str(i) + '.csv') and i != 0:
           print('処理済みなのでスルー:juman-'+str(i)+'.csv')
           i=i-1
        else :
             reedfile = spritfile_list[i]
             cmd = 'cat "' + spritfile_list[i] + '" | /usr/local/bin/jumanpp > "' + 
       juman_dir +'/juman-' + str(i) + '.csv"'
             os.system(cmd)
             print('出力完了:juman-'+str(i)+'.csv')


Twitter産対話コーパスを整形するやつ

colab-logo-1

前回の記事では対話コーパスに識別子をわざわざつけた。
しかし、別ファイルに保存したほうが取り扱いが楽なのでは?
と思い立ったのでコーパスファイルを整形するやつ。

24時間毎にテキストファイルが分割されているのを前提に、
一度すべて結合したものを中間保存する。
クソデカコーパスファイルが出来上がるが、
これを処理したほうが楽な場合もあるので
一時ファイルとして残しておく。

次に一時ファイルを1行ずつ読み込み
識別子で発話文と応答文別にファイルを振り分け保存。
偶数行奇数行に分けると楽なんだろうけど
なんかノイズが混じってたら破綻するのでこういう仕様。
多分これが一番遅いと思います(迫真)

import glob

src_dir = "/SOURCE" # 対話コーパスを格納しているディレクトリ
joint_name = "/joint.txt" # 結合したファイルのパス
q_name = "/q.txt" # 発話ファイルのパス
a_name = "/a.txt" # 応答ファイルのパス



# ファイル結合
def gattai():
    file_list = glob.glob(src_dir + '/*')
    for i in range(0,len(file_list)) :
            with open(file_list[i], 'r') as file:
                 text = file.readlines("".join(lines))
                 with open(joint_name, 'a') as save_file:
                      save_file.write(text)

# ファイル仕分け
def bunri():     
    with open(joint_name, 'r') as file:
         while True:
               line = file.readline()
               if line:
                  if  'REQ:' in line:
                      with open(q_name, 'a') as file_q:
                           file_q.write("".join(line))
                  if  'RES:' in line :
                      with open(a_name, 'a') as file_a:
                           file_a.write("".join(line))
               else:
                 break

#gattai()
#bunri()
#使いたい方のコメントアウトを解除する


Twitterで集めた対話コーパスを分割して品詞分解するやつ

colab-logo-1Juman++で品詞分解するやつ。


もっとも、Google Colaboratoryの場合、あまりに大きいファイルは処理できないらしい。
対話コーパスも100万ツイートほどのファイルとなるとそこそこのサイズになる。
これを細切れにしてテンポよく処理させる。

あ、事前にJuman++の準備はしといてもろて。
以下宜しく。

# coding: utf-8

import os
import sys
import glob

N = 100 # 一時ファイルの切り分け数
srcput_dir = "" # 対話コーパスを格納しているディレクトリ
output_dir = "" # コーパスを分割したファイルを一時格納するディレクトリ
juman_dir  = ""  # 品詞分解したファイルを格納するディレクトリ

file_list = glob.glob(srcput_dir + '/*')
file_list.sort()

# 分割ファイル読み込み
def readlines_file(reedfile):
     with open(file_list[i], 'r') as file:
          return file.readlines()

# 分割ファイル保存処理
def save_file(text):
     with open(output_dir + str(i)  + '-' + suffix(a) + '.txt', 'w') as file:
          file.write(text)
          print('SAVE:'+str(i)  + '-' + suffix(a) + '.txt')

# 接頭詞の桁調整
def suffix(a):
     return "{:05d}".format(a)

# ファイル分割メイン処理
def split():
    print('日別ツイートファイル数:'+str(len(file_list)))
    for i in range(0,len(file_list)) :
            reedfile = file_list[i]

            for a in range(int(N)):
                lines = readlines_file(file_list[i])
                limit = len(lines) // int(N)
                offset = a * limit
                # 分割
                text = lines[offset: offset + limit]
                save_file("".join(text))

# 品詞分解メイン処理
def juman():
    spritfile_list = glob.glob(output_dir + '/*')
    spritfile_list.sort()
    print('総分割ツイートファイル数:'+str(len(spritfile_list)))

    for i in range(0,len(spritfile_list)) :
        reedfile = spritfile_list[i]
        cmd = 'cat "' + spritfile_list[i] + '" | /usr/local/bin/jumanpp > "'
     + juman_dir +'/juman-' + str(i) + '.csv"'
        os.system(cmd)
        print('Output:juman-'+str(i)+'.csv')




if __name__ == '__main__': 
  
  bunkai()
  juman()

識別子を付け忘れたコーパスにあとから付与するやつ

colab-logo-1

ディープラーニングでAIチャットボットを作るには
Twitterなんかで対話コーパスをつくるわけだけども、
発言とそのリプに識別子を付けておいたほうが良い。
というか、収集した後に気づいた。
……ので、後からつけるやつ。

奇数行のヘッダにREQ、偶数行のヘッダにRESをつけてるだけなので
デリミタとかはうまくやってクレメンス。以下宜しく。




#coding:utf-8
#識別子を付け忘れたコーパスファイルにあとから付与するやつ

  import pandas as pd
  import re
  sourcefile_name = "未処理ファイルのパス"
  outputfile_name = "処理後ファイルのパス"

 # 元ファイル
  df = pd.read_csv(sourcefile_name, encoding="utf_8")
  df.insert(0, 'Head', 'value')
  df['Head'] = "REQ:"
  df.loc[0::2, 'Head'] = 'RES:'
  # 中間ファイル
  df.to_csv(outputfile_name)
with open(outputfile_name, encoding="utf_8") as f:
    data_lines = f.read()
    data_lines = data_lines.replace(",Head,", "REQ:").replace(":,", ":")
    text = re.sub("[0-9]+,","", data_lines)
with open(file_name, mode="w", encoding="utf_8") as f:
    f.write(text)


ぼちぼちゲームライターやってます。なお、このブログやTwitterでの発言は私個人のものであり、各掲載媒体様は無関係であります。予めご承知おきくださいませ。
うちの同人誌
amazon.co.jp