프로젝트/2021 한이음(probono)

[프로보노 프로젝트] 토큰화의 실시간성 문제 의견 공유와 해결과정

pxatd 2021. 10. 2. 23:53
728x90

0. 상황

머신러닝 전처리 개발이 완료되어 이 모듈을 라즈베리파이 우분투에 옮겨 실행시켜보았다. 전처리 중 토큰화 부분이 완료된 것 까지 확인하였고, 그 다음 단계인 불용어를 처리하는 부분에서 다음과 같은 오류가 발생했다. 

colab에서 실행할 땐 오류가 나지 않았으니 아마 리눅스 python 환경에서 발생하는 버전 충돌 같은데 오류를 잡으려 코드를 수정한 후 다시 실행시키려니 colab에서도 오래 걸리던 토큰화 부분(약 30분)이 리눅스에서는 2시간 이상 걸리는 것을 확인했다. 

코드를 수정했음에도 결과를 보기까지 시간이 많이 걸려 계속 이 상태로 진행한다면 다른 오류도 오래 기다려야 했기 때문에 비효율적이라고 판단했다. 

 

문제 : colab환경에서도 리눅스 환경에서도 데이터의 토큰화가 너무 오래 걸림

 


IDEA : 토큰화한 후의 파일을 save시켜서 다시 그 부분부터 시작할 순 없을까? (게임에서 체크포인트 있는 것 처럼, 세이브파일 있는 것 처럼)

 

colab에서 최대한 빨리 돌린게 1444초 

의견 : 데이터 셋의 개수가 2만 개가 넘다보니 colab에서는 30분, 라즈베리파이 리눅스에서는 2시간이 넘게 걸린다. 아직 main 함수(모듈)의 오류도 다 해결하지 못했는데 코드를 Run 할 때마다 2시간씩 기다려야 하는 건 너무 비효율적인 것 같다. 시간을 단축시킬 수 있도록 아이디어를 생각해봤으면 좋겠다. 

IDEA
그나마 토큰화 시간이 적게 걸리는 코랩에서 한번 돌리고 그 결과를 파일로 저장하면 어떨까
그 파일 자체를 라즈베리파이에 넘겨주면 어떨까?

IDEA MAP
[python file read and write 패키지 -> txt 파일로 만들어서 저장 -> 다음 단계인 stop words 함수에 파일 경로를 넣어줌->동작(RUN)]

마음에 걸리는 것 : list->str로 바꾼다음에 다시 라즈베리파이에서 str->list 로 바꿔주면 너무 번거롭지 않을까? encoding과정에서 파일 손상이 일어나진 않을까? (아스키 문자 깨짐 현상 등)

 

 

 

 

1. 해결과정 

사용한 코드 1
참고 :
https://colab.research.google.com/github/Tajyu/sm11/blob/master/ch04/ch4_03_file_io.ipynb

 

ch4_03_file_io.ipynb

Run, share, and edit Python notebooks

colab.research.google.com

f = open("새파일.txt", "w") f.close() f = open("./새파일.txt", "w") for i in range(1, 11): data = "%d번째 줄입니다.\n" % i f.write(data) f.close()

발생한 오류 : 리스트는 write 함수로 쓸 수 없다. str만 가능

 



해결하기 위해 참고 (파이썬에서 str리스트를 문자열로 변환)
https://www.delftstack.com/ko/howto/python/how-to-convert-a-list-to-string/

 

파이썬에서리스트를 문자열로 변환하는 방법

이 튜토리얼은 파이썬에서리스트를 문자열로 변환하는 방법을 보여줍니다

www.delftstack.com

추가한 코드

StrA = "".join(A) print(StrA)

발생한 오류 2
TypeError: sequence item 0: expected str instance, int found
StrA에는 문자열 리스트만 넣을 수 있다.. (분명 토큰화라 문자일텐데 이게 왜 발생한걸까 )

 



참고한 자료 (그럼 int 자료형을 강제로 형변환 시켜주자)
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=crm06217&logNo=221778003888

 

1. 파이썬 list와 string 간의 상호 변환, 오류(TypeError: expected str instance, int found)

이번 포스팅에서는 Python의 list와 string의 상호 변환에 대해서 살펴보자. 우선, 먼저 두 가지에 대해 ...

blog.naver.com

작성한 코드

for i in range(len(mylist): mylist[i] = str(mylist[i])


발생한 오류3
ValueError: I/O operation on closed file.
https://www.python2.net/questions-1265746.htm

 

python : ValueError : 닫힌 파일에 대한 I /O 작업

import csv with open('v.csv', 'w') as csvfile: cwriter= csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) for w, c in p.items(): cwriter.writerow(w + c) 여기,피사전입니다.w과씨둘 다 문자열입니다. 파일에 쓰

www.python2.net

https://stackoverflow.com/questions/12998873/whats-the-encoding-in-which-the-file-is-saved-when-i-use-openfilename-in-pyth

 

What's the encoding in which the file is saved when I use open(filename) in Python or fopen(filename) in C?

Runtime Environment: Python 2.7, Windows 7 NOTE:I am talking about the encoding of the file generated by the PYTHON source code(NOT talking about the PYTHON source file's encoding), the encoding

stackoverflow.com

파일을 연 후 제대로 닫아주지않아 발생한 오류 같은데 아무리봐도 들여쓰기나 문법적으로 틀린 부분이 없었다.
어차피 이 방법으로 하다가는 같은 코드를 A->B B->C C->D 처럼 빙빙 도는 느낌이라 포기하고 다른 방법 모색하기로 하였다. 

 

 

IDEA
그럼 리스트 자체를 받아 파일로 저장해주는 라이브러리는 없을까
https://hello-bryan.tistory.com/217

 

[Python] list 를 text file 에 한줄씩 쓰기 ( \n 안나오게 )

Python List 의 각 요소를 text file 에 한줄씩 쓰기 testList = ['123', '456', 'abc', 'def'] 123 456 abc def filePath = './test.txt' testList = ['123', '456', 'abc', 'def'] with open(filePath, 'w+') as..

hello-bryan.tistory.com

import pickle 로 간단히 해결할 수 있었다.

작성한 코드

import pickle filePath1 = 'textDataOutput.txt' with open(filePath1, 'wb') as lf: pickle.dump(pad, lf) with open(filePath1, 'rb') as lf: readList1 = pickle.load(lf) print(readList1)

문제2: 토큰화 한 파일을 라즈베리파이로 넘겨주는 코드를 개발할거면 애초에 colab에서 전처리까지 완료한 파일을 output으로 받아서 전처리의 결과만 넘겨주는게 더 효율적이지 않을까? 해보자! 

 

 

 

 


2. 해결

preprocessing을 거친 후 pickle 모듈을 통해 output 데이터를 text와 target에 대해 각각 txt 파일로 생성한다. ( 이 파일은 padding 과정까지 모두 거친 것임) 이 파일이 존재함으로써 1시간 반 가량의 토큰화를 계속 진행하지 않아도 된다. 

 

참고한 블로그
https://wayhome25.github.io/cs/2017/04/04/cs-04/

 

강의노트 04. 파이썬 pickle 모듈 · 초보몽키의 개발공부로그

패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용을 정리했습니다. 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

wayhome25.github.io

 

내가 짠 코드 그리고 output 

import pickle filePath1='/content/textDataOutput.txt' with open(filePath1, 'rb') as lf: readList1 = pickle.load(lf) print(readList1) one=np.array(readList1) filePath2='/content/targetDataOutput.txt' with open(filePath2, 'rb') as lf: readList2 = pickle.load(lf) print(readList2) two=np.array(readList2)

 

text data output 파일이 너무 커서 github에 올라가지 않길래 git clone를 실행할 수 없었다. 예외적으로 output파일만 카카오톡을 사용해 팀원들에게 넘겨주었다.

이 파일로 학습한 모델은 다음과 같다. 

성공적으로 결과가 잘 도출됨을 알 수 있다.
이 과정이 없었더라면 전처리 과정을 거칠 때마다 2시간 이상씩 기다려야 했을 것이다. 프로젝트 진행 중 효율적인 방법을 찾아낸 것 같아 뿌듯하다. 

728x90