본문 바로가기

혼자서꿍시렁

내가 재밌게 본 영화를 남들도 재미 있어 할까?

나는 대중과 취향이 같은 인간일까? 궁금했습니다. 즉, 내가 재밌게 본 영화가 다른 이에게도 재미있는 영화가 맞을지 그렇지 않을지에 대해서 말입니다. 그것을 어떻게 확인할 수 있을까를 생각하다 아래와 같이 머리를 짜내어 봤습니다.



< 이 글은 빅 혹은, 스몰 (혹은, 초스몰) 
데이터를 다루기 위한 전초단계부터 중, 후반의 단계에서 닥칠 상상해 볼 수 있는 문제들을 기술합니다. 즉, 왜 기존의 데이터들이 디지털 세상으로 이전되기까지 많은 시간이 걸리는지 혹은, 이미 디지털화되어 있는 데이터에 대해서도 새로운 인사이트로 인해 다른 방식으로 다루어지기까지 많은 시간이 필요한지에 대한 이유를 담고 있기도 합니다. 이쪽 계통과 좀 먼 분야에 계신 분들은 가끔씩 나오는 프로그램 코드의 이해를 건너 뛰고 읽어나가셔도 좋을것 같습니다 >



오래전부터 저는 관람한 영화에 대해 개인적인 평가와 점수를 기록하고 있었습니다. 마침, 영화 정보 사이트 'IMDB'나 '영화진흥위원회'등에서는 영화 정보를 공개하고 있습니다. 그래서 저는 제가 영화에 부여한 점수들과 신뢰 있는 웹사이트 등에서 제공하는 영화들의 평점 혹은, 누적관객수에 대한 상관관계를 조사하고 싶었습니다.




 

나름 아래와 같은 환경을 만들어 관람한 영화들의 점수와 평을 꾸준히 입력하고 있었습니다. 그리하여 모여진 영화 정보는 위에서 보인 많은 영화티켓의 수처럼 극장에서 본 것들과 그렇지 않은 것들을 포함하여 약 1750개 정도가 되었습니다.(물론, 기억에서 빠진 것들은 아직도 기록을 못하고 있습니다ㅠㅠ) 반평생 살면서 1750개의 영화를 본 것이죠.ㅎ


 

 


그리고, 제가 모아 놓은 이 영화 데이터를 좀 더 편히 다룰 수 있도록 DB에서 뽑아내고 다듬기로 결정했습니다.



DB에 쌓인 내가 본 영화정보들



즉, 아래와 같은 방법이 진행될 수 있도록 말입니다.



방법


데이터를 반자동 수준에서 쉽게 다룰 수 있도록 '파이선' 등의 도구로 간단한 유틸리티 성 프로그램을 작성한다. 해당, 프로그램은 아래와 같은 일을 한다.


1. 내 영화 정보 하나를 꺼내어 해당 영화의 제목으로 영화 정보 서비스의 오픈 API를 이용해 검색 시도


2. 검색된 결과가 1개 나올 경우 *해당 영화의 제목과 평점 혹은, 누적관객수 그리고 내 점수*를 '확인된_리스트.txt' 파일에 기록


3. 검색된 결과가 2개 이상 나올 경우, 그중에 맞는 영화를 직접 확인하고 선택하기 위해 '확인이_필요한_리스트.txt' 파일에 검색된 데이터를 기록


4. 3 항목의 '확인이_필요한_리스트.txt' 파일을 직접 눈으로 확인하고 선택해서 제목을 수정한 영화들은 1 항목부터 다시 가공 작업을 시도해서 '확인된 리스트.txt' 파일에 기록


5. 검색된 결과가 없을 경우 '누락_리스트.txt'에 기록


헌데, 영화 순위 정보를 얻을 데이터 서비스의 선택에서 아래와 같이 난감한 문제에 봉착해 버렸습니다.



A. IMDB에서 제공하는 영화 정보


- 영어 기반 (내가 기록한 영화 제목과 다름)

- 평점이 누락된 데이터가 다수



그 유명한 '식스센스'도 평점이 없다


B. 영화진흥위원회


- 오픈 API에서는 영화 제목을 기준으로 평점이나 누적관객수 정보를 검색할 수 없음






C. MovieLens


- 영어 기반 (내가 기록한 영화 제목과 다름)

- 공개된 영화의 수에 제한이 있음

 


D. 왓챠 (Watcha)


- 내가 기록한 영화 제목과 다름

- 오픈 API를 제공하지 않음




이렇게 되면, 반자동화를 위한 프로그램 작업에 아래와 같은 문제가 생기게 됩니다.


1. 내가 입력해 놓은 영화의 제목과 서비스에서 제공하는 제목은 일치하지 않는 것들이 많다.

(예 - 나:식스센스, 서비스: Sixth Sense)


2. 서비스에서 제공하는 영화 정보 중에서 누락된 것도 존재한다.


3. 오픈 API를 지원받지 못한다.



그러다가 영화진흥위원회 사이트에서 아래와 같은 서비스를 발견하였습니다.





네, 결국 문제를 절충할 밖에 없게 되었습니다. 오픈 API를 쓰지 못하니 제공해주는 엑셀 파일을 내려받아 이용하게끔 아래와 같이 방법을 다시 세워 보았습니다.


또 다른 방법


1. 엑셀 파일에 있는 (500개)영화에 대해서 작업을 시작하자


2. 엑셀에서 작업을 해도 되겠으나 이왕 시작한 거 파이선으로 끝을 보자


3. 엑셀 파일에 있는 500개의 영화들 중에서 내가 점수를 매긴 영화들의 목록을 A라고 정한다.

(엑셀 파일에 있는 영화들 중에서 내가 보지 않은 영화에 대한 샘플링은 포기하자)


4. A목록이 가지고 있는 내 점수들의 합을 B라고 정한다.


5. 그간 내가 점수를 매겼던 방식-즉, 영화당 평점은 5점이 만점이다.


6. 'A목록이 가지고 있는 데이터의 수 x 5'를 C라고 정한 후, C를 만점으로 가정한다.


7. 이에, C와 B의 차이가 적을수록 대중(?)과 나의 영화 취향이 비슷하며 차이가 클수록 취향이 다르다고 볼 수 있다.






위의 방법대로 진행을 하기 위해 우선, 영화진흥위원회에서 받은 역대 박스오피스 자료를 다운로드 한 후 엑셀에서 아래와 같이 열어 보았습니다. 어떤 것들은 매출액이 입력되어 있고 또 어떤 것들은 서울을 기준으로 한 관객수 혹은, 스크린수만 기록되어 있기도 합니다.





뭐, 계획에 의하면 저는 그저 이 500개의 영화들이 대부분의 사람들이 가장 재미있게 본 것들이라 가정하고 제가 어떤 점수들을 이들에게 줬는지만 잘 뽑아내면 되는 것이겠죠? 그렇기에, 저는 여러 항목들 중 오로지 영화 제목만 있으면 됩니다 ㅋ


그리고 대충, 엑셀을 훑어보니 예상했던 문제가 아래와 같이 보이기 시작합니다.





네, 안타깝게도 저는 영화 제목을 위와 같이 기록해 놓지 않았습니다. 즉, 아래처럼 입력해 놓았더군요.





뭐 어쩔 수 없습니다. 이러한 이유로 인해 직접 손으로 골라내는 (반자동) 작업을 일부 데이터에 대해 반드시 진행할 수밖에 없습니다 ㅠ.ㅠ (얼마만큼 존재하느냐가 문제이겠죠? T^T)


자, 이제 본격적으로 파이선에서 데이터를 다룰 준비를 해 보겠습니다. 파이선에서 엑셀의 데이터를 다루는 예제도 많이 있으나 좀 더 익숙한 TEXT 파일을 다루는 방법을 선택했습니다. 그냥, 영화진흥위원회 데이터의 제목만 선택해서 노트패드에 붙여 넣기를 하면 아래와 같이 다루기 편한 TEXT 파일을 얻을 수 있으니까요.





노트패드에서 만든 파일의 이름을 "best_500.txt"로 정하고 저장했습니다. 그리고, 제가 본 영화들의 목록을 DB에서 엑셀 파일로 EXPORT 하여 아래와 같이 자료를 얻었습니다. 





이번에는 영화 제목과 점수만을 골라내어 제목과 점수 사이를 "|"구분자로 구분하게 한 후 "my_data.txt" 파일로 저장을... 하고자 하였으나!






엑셀은 쉼표나 탭으로 영화의 제목과 점수를 분리한 TEXT 파일로 저장이 가능할 뿐입니다. 제가 작성해 놓은 영화 제목에는 좌측 위의 이미지와 같이 이미 쉼표를 포함시킨 것들도 있기에 탭으로 분리한 TEXT 파일로 저장을 하였습니다. 헌데, 이게 어쩐 일일까요? ㅠㅠ





생성된 "my_data.txt"파일을 열어 보았더니 "구름의 저편, 약속의 장소"는 다른 제목들과는 다르게 큰따옴표가 붙어 있고, 바로 위에 있는 "에일리언 vs 프레데터 2"는 점수와 제목 사이에 탭이 포함되지 않았습니다. 이러면 문제가 커지지요. 흑, 엑셀이 왜 이럴까요.ㅠㅠ


결국, 아래와 같은 꼼수로 진행합니다. 즉, 제목과 점수 사이에 제목이나 점수를 입력할 때 사용하지 않은 "|" 문자를 삽입합니다.





그런 후, TEXT 파일로 저장을 했습니다. 그리고, 갑자기 생겨나는 큰따옴표는 그냥, 노트패드의 '바꾸기'기능을 이용해서 없애 버렸습니다. 즉, 아래와 같이 말입니다.





자, 이제 두개의 파일이 준비되었습니다. 즉, 박스오피스 500개의 영화 제목이 담긴 "best_500.txt" 파일과 제가 평가한 영화 제목 그리고 점수가 담긴 "my_data.txt"파일입니다. 이 두 파일을 파이선에서 잘 읽어 들일 수 있는지 확인해 보는 코드를 아래와 같이 작성해서 테스트해 보았습니다.


f = open("best_500.txt", 'r')
best_list = f.readlines()
f.close()

f = open("my_data.txt", 'r')
my_list = f.readlines()
f.close()

for line in best_list:
    print(line)

for line in my_list:
    print(line)


실행결과:






네, 잘 읽어서 잘 출력하고 있습니다. (읽어 들인 목록의 수라던가 뭐 이런 거를 출력해야 그럴싸할 텐데 ... 패쓰 ㅋㅋ) 이제, 아래와 같은 행동을 하는 파이선 코드를 작성할 차례입니다.


1. "best_500.txt"파일의 내용이 담긴 best_list 리스트에서 영화 제목을 1개를 뽑아 current_title 변수에 담아 둔다


2. "my_data.txt"파일의 내용이 담긴 my_list 리스트에서 데이터 1개를 뽑아 mydata 변수에 담아 둔다


3. mydata 변수를 "|"로 구분 지어 영화 제목과 점수를 얻은 후 각각을 title 변수와 score 변수에 담아 둔다


4. current_title 변수의 내용이 title 변수의 내용과 동일할 경우 "checked_list.txt"에 title 변수의 내용과 score 변수의 내용을 기록한다


5. 2번 항목부터 4번 항목까지의 행동을 반복하다가 my_list 리스트의 끝에 다다르면

- "checked_list.txt"에 아무런 기록을 한적이 없다면 "need_check_list.txt"에 해당 데이터를 기록한다

- 1번 항목부터 다시 수행한다


6. best_list 리스트에서 모든 영화 제목을 뽑아 확인했다면 수행을 종료한다



네, 말 그대로 알고리즘과 프로그램의 순서도를 짬뽕시켜 간단하게 작성해 보았습니다 ㅎ 이해의 큰 줄기를 보는 데에는 무리가 없을 것이라 믿겠습니다.(움하하) 그리고, 위의 내용을 아래와 같이 파이선 코드로 작성하였습니다.

 

# -*- coding: cp949 -*-

import re

f_checked = open("checked_list.txt", 'w')
f_need_check = open("need_check_list.txt", 'w')

f = open("best_500.txt", 'r')
best_list = f.readlines()
f.close()

f = open("my_data.txt", 'r')
my_list = f.readlines()
f.close()

for current_title in best_list:
	current_title = current_title.strip()
	data_included = False	

	for myline in my_list:				
		myline = myline.replace("\t","")
		mydata = re.split(r'\|', myline)

		title = mydata[0].strip() ## 제목
		score = mydata[1].strip() ## 점수

		if current_title == title:
			f_checked.write(title + "|" + score + "\n")
			data_included = True

	if data_included == False:		
		f_need_check.write(current_title + "\n")

f_checked.close()
f_need_check.close()


위의 코드를 수행한 결과, 아래와 같이 두개의 파일이 생성되고 내용이 채워졌습니다.







"need_check_list.txt" 파일을 열어 라인수를 확인하였더니 302 였습니다. >.< 네, 예상을 하셨겠지만, 참 다양한 형태로 영화의 제목들은 일치하지 않고 있었습니다. 네, 500개의 영화들 중 제가 보지 않은 영화의 수가 302가 아니라, 아래와 같은 영화 제목의 불일치로 인해 '302'개 데이터의 대부분을 자리 잡고 있었습니다.


 

내가 입력해 놓은 제목

박스오피스의 제목 

1

아바타 3D

아바타

2

베테랑 (Veteran, 2015) 

베테랑

3

광해 - 왕이 된 남자

광해, 왕이 된 남자

4

디 워

디워

5

맘마미아

맘마미아!

6

위플래시

위플래쉬

7

원스 어폰 어 타임

원스어폰어타임

 


어쩔 수 없는 상황일까요? 그런 것 같습니다. ㅜㅜ 즉, "아바타 3D"와 "아바타"는 같은 영화가 맞느냐? 혹은, "원스 어폰 어 타임"과 "원스어폰어타임"은 같은 영화가 맞느냐? 를 가지고 302개의 데이터에서 일치하는 데이터를 골라내어야 하는 상황인 겁니다. 이렇게 골라내는 작업에 대해 낙심하기를 얼른! 그만두고 "엔터" 혹은, "n"이나 "N"만으로도 작업을 진행할 수 있도록 아래와 같이 코드를 작성해 보았습니다.

# -*- coding: cp949 -*-

import re

f_checked = open("checked_list.txt", 'w')
f_need_check = open("need_check_list.txt", 'w')

f = open("best_500.txt", 'r')
best_list = f.readlines()
f.close()

f = open("my_data.txt", 'r')
my_list = f.readlines()
f.close()

for current_title in best_list:
	current_title = current_title.strip()
	data_included = False	

	for myline in my_list:				
		myline = myline.replace("\t","")
		mydata = re.split(r'\|', myline)

		title = mydata[0].strip() ## 제목
		score = mydata[1].strip() ## 점수

		if current_title == title:
			f_checked.write(title + "|" + score + "\n")
			data_included = True

		elif current_title.find(title) >= 0:
			yesno = input(current_title + " vs " + title + " ?")

			if yesno == "y" or yesno == "Y":
				data_included = True
				f_checked.write(title + "|" + score + "\n")			

		elif title.find(current_title) >= 0:
			yesno = input(current_title + " vs " + title + " ?")

			if yesno == "y" or yesno == "Y":
				data_included = True
				f_checked.write(title + "|" + score + "\n")
			
		else:
			continue
		

	if data_included == False:		
		f_need_check.write(current_title + "\n")

f_checked.close()
f_need_check.close()

상기의 코드를 수행하면 프로그램은 아래와 같이 두 개의 제목을 들이밀며 사용자에게 묻습니다. 두 개의 영화가 같은 것일 경우 'y'나 'Y'를 그렇지 않으면 엔터나 그 외의 문자를 입력하고 넘기면 됩니다. 네, 사람의 손에 의한 입력이 반드시 필요한 반자동 환경인 겁니다. ㅠ.ㅠ

그리고, 위 코드에는 한 가지 기능이 더 추가되어 있습니다. 즉, 어느 한쪽의 제목이 다른 한쪽의 제목에 포함될 경우에도 두 개의 영화가 동일한 지 여부를 묻도록 되어 있습니다. 이 방법에 대해서는 조금 더 지나가서 자세히 설명드리도록 하겠습니다.



실행결과:





헌데, 또 다른 문제가 생겼습니다. 이 작업을 몇 시간 동안 할 수 없는 노릇이고 또, 잘못된 알고리즘 덕에 했던 행동을 또 하고 있는 것이었던 것이었던 것입니다 >.< 예를 들어 보겠습니다.


저 코드에 의하면 'best_list'의 '스파이'가 'my_list'의 '스파이'가 맞는지 확인을 한 이후에도 31번째 라인의 아래와 같은 내용에 의해 'best_list'의 '스파이더맨'이 '스파이'가 맞는지 또 물어보게 됩니다. 

elif current_title.find(title) >= 0:

그러다 보면 위의 이미지처럼 '타워'와 '스타워즈', '바람'과 '바람과 함께 사라지다'등의 제목을 가진 데이터에 대해서도 반복해서 물어보는 경우가 많아져 결국 지치게 될 겁니다.ㅠ.ㅠ 이에, 좀 알아서 해결하거나 한 번 확인을 했던 데이터는 다시 묻지 않도록 여러 조치를 취해 보았습니다. 아래와 같이 말입니다. 


 

내가 입력해 놓은 제목

박스오피스의 제목 

 대응 방안

1

아바타 3D

아바타

 좌측의 제목에 우측의 제목이 포함되어 있는가-를 확인

2

베테랑 (Veteran, 2015) 

베테랑

 상기 내용과 동일

3

광해 - 왕이 된 남자

광해, 왕이 된 남자

 ',', '-', ':' 등의 특수 문자는 모두 ','로 수정

4

디 워

디워

 (띄어쓰기 등의) 공백 없애기

5

맘마미아

맘마미아!

 우측의 제목에 좌측의 제목이 포함되어 있는가-를 확인

6

위플래시

위플래쉬

 떠오르지 않음

7

원스 어폰 어 타임

원스어폰어타임

 (띄어쓰기 등의) 공백 없애기

 8

스파이더맨 

 스파이

 '스파이'가 확인이 되었던 제목이면 기억을 해두고 다시 묻지 말자

 


위의 방안들 중 몇 개를 반영하여 아래와 같이 코드를 작성해 보았습니다.

* 참고로, '(띄어쓰기 등의) 공백 없애기'와 '특수문자 변경 '방안은 이 글을 끝까지 작성한 후에 떠올린 아이디어라 아래 코드에는 반영되어 있지 않습니다


# -*- coding: cp949 -*-

import re

f_checked = open("checked_list.txt", 'w')
f_need_check = open("need_check_list.txt", 'w')

f = open("best_500.txt", 'r')
best_list = f.readlines()
f.close()

f = open("my_data.txt", 'r')
my_list = f.readlines()
f.close()

best_list = sorted(best_list, key=len) ## 제목의 길이 순으로 정렬
my_list = sorted(my_list, key=len) ## 제목의 길이 순으로 정렬

my_list_checked_index = [] ## 체크가 된 데이터를 기억 하기 위한 공간

for current_title in best_list:				
	data_included = False	
	current_title = current_title.strip()

	my_index = 0

	for myline in my_list:		
		if my_list_checked_index.count(my_index) > 0: ## 확실하게 체크가 된 데이터는 건너 뛰자
			my_index = my_index + 1		
			continue

		myline = myline.replace("\t","")
		mydata = re.split(r'\|', myline)

		title = mydata[0].strip() ## 제목
		score = mydata[1].strip() ## 점수
		
		if current_title == title:
			my_list_checked_index.append(my_index) ## 체크가 된 데이터는 기억해 놓자
			f_checked.write(title + "|" + score + "\n")
			data_included = True
			break ## 체크가 되었으면 my_list의 나머지 항목들 확인할 필요가 없으니 빠져나가자
				
		elif current_title.find(title) >= 0:
			yesno = input(current_title + " vs " + title + " ?")

			if yesno == "y" or yesno == "Y":
				data_included = True
				my_list_checked_index.append(my_index) ## 체크가 된 데이터는 기억해 놓자
				f_checked.write(title + "|" + score + "\n")			
				break ## 체크가 되었으면 my_list의 나머지 데이터를 확인할 필요가 없으니 빠져나가자

		elif title.find(current_title) >= 0:
			yesno = input(current_title + " vs " + title + " ?")

			if yesno == "y" or yesno == "Y":
				data_included = True
				my_list_checked_index.append(my_index) ## 체크가 된 데이터는 기억해 놓자
				f_checked.write(title + "|" + score + "\n")
				break ## 체크가 되었으면 my_list의 나머지 데이터는 확인할 필요가 없으니 빠져나가자
			
		my_index = my_index + 1
				

	if data_included == False:		
		f_need_check.write(current_title + "\n")


f_checked.close()
f_need_check.close()

이제야 프로그램이 쓸만하게 돌아가는 듯합니다. 하하하


실행결과:






네, 한 4 ~ 5분 정도 열심히 'y' 혹은, '엔터'를 눌렀더니 'checked_list.txt'와 'need_check_list.txt'파일이 채워졌습니다. 그 후, 'need_check_list.txt' 파일에서 제가 봤던 거진 100개 이상의 영화들을 다시 걸러 'checked_list.txt' 파일에 직접(손으로) 옮겼네요. 헉헉...ㅠ.ㅠ 다행스럽게도 보았던 영화임에도 누락되어 있던 것들을 챙기기도 했습니다. 그리하여 최종적으로 'checked_list.txt'파일을 완성하였고 500개의 박스오피스 영화들 중에서 제가 본 게 359개임을 알 수 있었습니다. 이, 'checked_list.txt'파일에 기록된 359개의 영화 점수를 이용해서 아래와 같이 대중과 저와의 "영화 취향 일치율"을 계산하는 코드를 작성하였습니다.


# -*- coding: cp949 -*-

import re

f = open("checked_list.txt", 'r')
checked_list = f.readlines()
f.close()

count = len(checked_list)
perfect_score = count * 5

total_score = 0


for current_line in checked_list:					
	myline = current_line.replace("\t","")
	mydata = re.split(r'\|', myline)

	title = mydata[0].strip() ## 제목
	score = mydata[1].strip() ## 점수

	total_score = total_score + int(score) 


sync_ratio = (total_score * 100) / perfect_score
		
print("만점: " + str(perfect_score) + " / 내점수: " + str(total_score))
print("나와 대중간의 영화취향 일치율: " + str(sync_ratio) + "%")	


그리고 아래는 실행한 결과입니다.



실행결과:






보시는 것처럼 359(A) 개의 영화 모두에 5점을 곱한 점수 1795(C)를 만점으로 가정하고 해당 359개에 대한 제 점수의 합 1433(B)을 가지고 두 점수의 비율을 계산했습니다.


79.83286908077994 %


즉, 대중과 저의 영화 취향에 대한 일치율은 위의 값이라는 말과 같은 거죠. (이 값을 구하기 위해 무슨 짓을 한 것인지 >.<)


물론, 이 계산 방식에는 문제가 있을 수 있습니다. 가령, 500개의 영화들 중 누락된 141개- 즉, 제가 보지 않은 것에 대해서는 각 영화마다 0점을 부여해야 되나 싶기도 합니다. (뿐만 아니라, 관객이 많은 영화가 '재미있는' 것이 아니었을 수도 있습니다. 초, 중, 고딩때 끌려가서 단체 관람했던 영화들을 떠올려 보면 말입니다.)


위의 과정을 마치고 나서야 떠 올랐던 방법 2개를 더 적용해 볼까 싶었으나 우선, 아래와 같이 써 놓기만 하겠습니다. (힘들어서...)


* 제목이 가지고 있는 공백(띄어쓰기)들을 모두 없앤다

-  '디 워'와 '디워' 혹은, '원스 어폰 어 타임' 과 '원스어폰어타임'의 차이를 극뽀옥 할 수 있게 됩니다


* 제목이 가지고 있는 특수 문자들은 모두 ', '(콤마)로 대체한다

-  '광해, 왕이 된 남자'와 '광해 - 왕이 된 남자'의 차이를 극뽀옥 할 수 있게 됩니다

  


Lessons learned

1. 가지고 있는 자료에서 다른 자료의  비교대상이 되거나 될 항목의 데이터는 보통 일치하지 않을 수 있다(않는다) 

예) 디워 - 디 워, 식스센스 - Sixth sense


2. 자료가 쓸만해지려면 사람의 손을 직접 거쳐야 할 수 있다(한다)

예) 

a. 공백을 제거하면 수동으로 매칭 시켰던 작업이 줄어들 수 있다는 생각을 얻기 위해 자료를 직접 눈으로 보며 훑었다

b. need_checked_list.txt 파일을 열어서 실제로 보았으나 제대로 비교되지 못해 기록되어 있는 영화의 제목과 점수를 직접 checked_list.txt로  옮겨 담아야 했다 


3. 시행착오를 통해 자료의 가공 속도를 높이기 위한 여러 깨알 같은 방안을 찾을 수 있다(찾는다)

(이를, 이쪽 세상에서는 '휴리스틱' 방식이라 한다)


예) 아래의 방법들을 통해 제목의 비교 행위를 줄이거나 속도를 높일 수 있었다

a. 제목의 길이 순으로 자료를 정렬 해 놓는다

b. 제목이 가지고 있는 공백(띄어쓰기)들을 없앤다 

c. 제목들이 가지고 있는 특수 문자를 가능한 만큼 일치시킨다

d. 비교가 완료된 제목들은 기록해 놓고 다시 비교하지 않는다

e. 비교가 완료되면 나머지 데이터들의 비교를 건너뛰고 다음 비교대상을 선택해서 진행한다 


4. 시행착오를 통해 찾은 좋은 방법을 반영하는데 드는 시간은 직접 손으로 자료를 처리하는 시간보다 더 걸릴 수 있다 (물론, 스몰데이터에 한해서?) 이에, 항상 ROI(Return On Investment)를 염두에 두어야 한다.


5. '파이선'을 처음 사용해 보았다. '루비'나 '펄'등에서 느낄 수 있던 최초 학습에 대한 부담(방법은 구글에 다 있더라), 코드 작성, 실행에 대한 가벼움이 극에 달한다. 다만, 유니코드 데이터를 다룰 때는 좀 복잡한 문제를 겪을 수 있다.