ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬] 자막에서 텍스트만 뽑아내기
    코딩/파이썬 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 하여 데이터프레임으로 만들었습니다. 

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #자막 파일에서 텍스트 뽑아내기
    #사용 모듈
    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 <> part 
      if 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을 위의 네개 중 하나로 바꿔보면 대부분 해결 될 것 같습니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    try:
      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 <> part 
      if mod_line != '':
        text.append(mod_line)
    text_pd = pd.DataFrame(text,columns=['Line'])
    cs

     

     

    반응형

    댓글

Designed by Tistory.