-
[파이썬] 자막에서 텍스트만 뽑아내기코딩/파이썬 2021. 3. 1. 15:15반응형
최근 외국어 공부를 위해서 자막을 활용한 자료를 만들 기회가 있어서 그때 공부한 파이썬 코드를 정리해 보았습니다. 소스코드는 구글 코랩(google colab)에서 작성하였습니다.
자막에서 텍스트만 뽑아내기(Extracting text from subtitle)
많이 사용되는 자막 파일 확장자는 srt, ass가 있지만 우리나라에서는 smi 확장자를 많이 사용합니다. srt, ass의 경우 간단히 처리할 수 있는 pysub2라는 모듈이 있어서 그것을 사용하였고 smi의 경우 line by line으로 읽어들여서 텍스트만 빼내는 코드를 작성하였습니다. 아래의 코드를 참고해 주세요.
smi 파일의 경우 구조가 html 문서와 유사합니다. 그중에서 대사에 해당하는 부분의 구조를 보면 다음과 같습니다.
...
<SYNC Start=3603><P Class=KRCC>
대사 1<SYNC Start=6803><P Class=KRCC>
대사 2.....
우리가 원하는 것은 대사 1, 대사 2 이기 때문에 정규표현식(regular expression)을 이용하여 <> 사이에 있는 글자 및 <> 기호를 삭제하고(아래 코드에서 re.sub()에 해당) 대사가 있는 것만 append 하여 데이터프레임으로 만들었습니다.
123456789101112131415161718192021222324252627#자막 파일에서 텍스트 뽑아내기#사용 모듈import pysubs2 #srt, ass 자막에서 텍스트 뽑아내는 모듈import re #smi 파일에서 텍스트를 뽑아내기 위해 사용하는 모듈#1) 확장자가 srt, ass일 때 자막에서 텍스트 뽑아내기subs = pysubs2.load('자막 파일 경로 및 파일 이름', encoding='utf-8')text_list = []for line in subs:text_list.append(line.text)text_pd = pd.DataFrame(text_list,columns=['Line']) #pandas dataframe으로 변환text_pd.to_csv('저장 경로 및 파일 이름', index=False) #index=False 은 pandas dataframe에서 index를 제거하여 csv 파일 만들어 줌#2) 확장자가 smi일 때 자막에서 텍스트 뽑아내기file = open('파일 경로 및 파일 이름', 'r',encoding = 'utf-8')wholefile = file.readlines()text = []for line in wholefile:line = line.strip()mod_line = re.sub(r"\<[^()]*\>", "", line) # regular expression: remove <> partif mod_line != '': #mod_line에 내용이 없을 때 즉, ''인 경우는 패스text.append(mod_line)text_pd = pd.DataFrame(text_list,columns=['Line']) #pandas dataframe으로 변환text_pd.to_csv('저장 경로 및 파일 이름', index=False) #index=False 은 pandas dataframe에서 index를 제거하여 csv 파일 만들어 줌cs 자막 파일과 다른 encoding 형식을 설정하여 발생한 오류 해결 방법
자료를 만들면서 srt, ass 파일의 경우는 문제가 없었지만, smi 파일의 경우 자막 파일에 따라서 encoding이 다른 경우가 있었습니다(올바른 encoding을 설정하지 않으면 오류가 발생합니다). encoding을 'utf-8', 'utf-16', 'cp949', 'euc-kr' 중 하나로 설정하니까 해결되었습니다. 파일마다 encoding을 확인하기 귀찮아서 아래와 같이 try, except 구문을 활용하여 코드를 만들어서 해결하였습니다. srt, ass 파일의 경우도 encoding이 맞지 않으면 오류가 발생합니다. 제가 가지고 있는 자막에서는 오류가 발생하지 않았지만 만일 encoding때문에 오류가 발생하는 경우 encoding을 위의 네개 중 하나로 바꿔보면 대부분 해결 될 것 같습니다.
12345678910111213141516171819202122try:file = open('파일 경로 및 파일 이름', 'r',encoding = 'utf-8')wholefile = file.readlines()except:try:file = open('파일 경로 및 파일 이름', 'r',encoding = 'utf-16')wholefile = file.readlines()except:try:file = open('파일 경로 및 파일 이름', 'r',encoding = 'cp949')wholefile = file.readlines()except:file = open('파일 경로 및 파일 이름', 'r', encoding='euc-kr')wholefile = file.readlines()text = []for line in wholefile:line = line.strip()mod_line = re.sub(r"\<[^()]*\>", "", line) # regular expression: remove <> partif mod_line != '':text.append(mod_line)text_pd = pd.DataFrame(text,columns=['Line'])cs 반응형'코딩 > 파이썬' 카테고리의 다른 글
[파이썬] 개별 주식 주간/월별 주익률 계산하기 (How to Calculate Weekly and Monthly returns of individual stocks) (0) 2021.10.15 [파이썬] Mean-Variance Frontier 계산하기 (최적 포트폴리오 계산하기) (4) 2021.10.14 [파이썬] 주식 포트폴리오 수익률 계산하기 (Calculate portfolio returns) (10) 2021.10.11 [파이썬] 개별 주식 일별 수익률 계산 (Calculate daily individual stock returns) (0) 2021.10.09 [파이썬] 일본어 한자에 후리가나 달기/일본어 한자 히라가나 변환 (0) 2021.09.14