본문 바로가기
Python/Python 개념

파이썬을 이용해 영화 대본 원하는 캐릭터 대사 긁어모으기

by hyun-am 2021. 4. 5.

Python에서 pdf파일 읽기

 

먼저 원하는 영화의 대본을 구한 후 거기에 있는 캐릭터의 대사를 출력하겠습니다. 먼저 대부분의 영화 대본은 pdf파일로 되어있는데 이것은 다음과 같은 사이트에서 쉽게 .txt파일로 변환할 수 있습니다.

pdftotext.com/ko/

 

온라인으로 PDF파일을 TEXT파일로 변환

무료 대용량 PDF 문서의 일반 TEXT파일로의 변환으로 어떤 TEXT 편집기로도 문서 열람이 가능합니다.

pdftotext.com

 

Dark Knight에서 Joker의 대사를 꺼내보겠습니다. 먼저 Dark Knight의 대본은 다음과 같은 링크에서 찾을 수 있습니다.

링크 : 

www.nolanfans.com/library/pdf/thedarkknight-screenplay.pdf

이 대본을 가지고 txt로 바꿔주면 페이지 첫 장의 대본까지 다 .txt파일로 처리된 것을 확인할 수 있습니다. 이것을 간결하게 정리하기 위해 캐릭터의 대사가 없는 부분은 직접 지워주겠습니다.

그러면 다음과 같은 형식으로 정리된 txt파일을 볼 수 있습니다.

 

캐릭터별 대사 뽑기

txt파일 읽어오기

다음은 아까 만든 txt파일을 먼저 불러오겠습니다. 파일을 불러오기 위해서 다음과 같은 코드를 작성했습니다.

text = []

character = []
with open('thedarkknight-screenplay.txt') as f:
    for line in f:
        text.append(line.replace('\n', '').replace('.', ''))

여기서 text는 txt파일에서 읽은 대사들을 저장할 리스트 마지막으로 character는 [[이름,대사]] 형식으로 저장할 리스트 입니다.

 

대사 처리하기

talk = []
for i in text:
    if i.isupper():
        name = i
        if len(talk) > 1:
            new_list = [name, talk]
            character.append(new_list)
            talk = []
    elif i == '' or (i.isupper() and i != name):
        new_list = [name, talk]
        character.append(new_list)
        talk = []
    else:
        # print(talk)
        talk.append(i)

 

1. 먼저 캐릭터들의 대사를 정리해줄 talk 리스트를 만들었습니다. 차례대로 설명하자면 먼저 text에 있는 원소 하나 하나를 i로 지정했습니다. 

2. 여기서 캐릭터의 특징은 이름이 전부 대문자로 설정되어 있습니다. 그래서 만약 대문자로 되어 있으면 name을 i로 지정해 주었습니다.

 

3. 캐릭터들의 이름을 뽑아내는 과정에서 if len(talk) > 1: 부분이 있는데 이 부분은 대사별로 마지막 리스트에 ''로 처리되어 있는데 만약 이 부분이 없으면 다음 캐릭터로 넘어가면서 대사를 리스트에 못 들어가는 것을 방지합니다. 

 

4. elif i == '' or (i.isupper() and i != name): 이 부분도 마찬가지로 만약 대사가 ''이거나 캐릭터인데 이름이 다를경우 대사로 추가해 줍니다.

5. 만약 이것에 해당하지 않으면 캐릭터가 한 대사에 전부 추가해주겠습니다. 

 

잘 출력 하는지 확인하기

 

다음은 캐릭터 별로 대사가 잘 저장 되어 있는지 확인하겠습니다. 

print(character)을 통해 확인하겠습니다.

 

그러면 다음과 같이 [캐릭터, [대사]] 이런형식으로 저장된 것을 확인할 수 있습니다. 여기서 CREDITS와 같이 캐릭터가 아닌데도 저장된 것이 있는데 저희는 어차피 지정된 캐릭터가 말한 대사만 뽑을 것이기 때문에 넘어 가도록 하겠습니다.

 

원하는 캐릭터 대사 뽑아내기

joker_text = [i[1] for i in character if i[0] == "THE JOKER"]
print(joker_text)

여기서 리스트 컴프리헨션을 통해 조커가 말한 대사를 joker_text로 뽑아냈는데 여기서 i[0](캐릭터 이름) == "원하는 캐릭터이름" 이런식으로 지정하면 지정한 캐릭터가 한 대사를 뽑아낸 것을 확인할 수 있습니다. 한번 출력한 값을 확인하겠습니다.

 

 

그러면 다음과 같이 조커가 한 행동이나 대사가 출력된 것을 확인할 수 있습니다. 만약에 원하는 캐릭터가 있으면 THE JOKER대신 다양한 이름을 넣어서 확인할 수 있습니다. 

댓글