본문 바로가기
Studying/Python

[Python] 웹 크롤링 데이터 클래스를 사용해 구조화해서 접근하기

by giem 2022. 6. 6.
반응형

2022.06.06 - [Studying/Python] - [Python] 웹 크롤링 해보기( 네이버 영화리뷰 크롤링)

 

[Python] 웹 크롤링 해보기( 네이버 영화리뷰 크롤링)

이제 슬슬 기본적인 문법을 익혔으니 AI 관련 교육 내용으로 넘어가 보려고 한다. 우선 기계학습에 가장 먼저 준비해야 할 것은 데이터다! 그 방대한 데이터를 우리가 직접 만들기는 어려우므로

gm-note.tistory.com


이번 포스트에서는 위의 이전 포스트에서 크롤링한 데이터를 구조화 해보려고 한다.

 

csv파일은 이전 포스트에서 만들었으므로 그 데이터를 써보겠다.

 

구현할 클래스는 다음과 같다.

 

 - 생성자로 string타입의 파일 이름을 받아야 한다.

 

 - 대괄호로 배열처럼 indexing이 가능해야 한다.

  ( 예를 들어 dataset[0]은 첫 번째 감상평이다. )

  indexing 결과값은 (영화명, 감상평, 평점)으로 타입은 (str, str, int)이다.

 

 - len(dataset)의 형태로 데이터셋 내의 감상평 갯수를 조회할 수 있어야 한다.

 

 

그럼 우선 구현한 코드를 보겠다.

 

class RawMovieReview:
  def __init__(self, file_name="samples.csv"):	#생성자
    self._file_name = file_name
    self._data = []
    self._fd = open(self._file_name, 'r')
    lines = csv.reader(self._fd)
    next(lines)	#첫줄 넘김(헤더부분)
    for line in lines:
        self._data.append(line)

  def __getitem__(self, index):	#indexing 할 수 있도록
    return self._data[index]	
  
  def __len__(self):	#len을 사용할 수 있도록
    return len(self._data)

rv = RawMovieReview()

print(rv[5])
print(len(rv))

print("==================================")

#한줄평 10점인 리뷰 개수 영화별로 정리 
my_dict = {}

for data in range(len(rv)):
  if rv[data][1]=="10":
    if rv[data][0] in my_dict.keys():
      my_dict[rv[data][0]] +=1
    else:
      my_dict[rv[data][0]] = 1

print(dict(sorted(my_dict.items(), key=lambda item: item[1], reverse = True)))

 

여기서 이때까지 설명 안했던 것을 볼 수 있을 것이다.

 

바로 __getitem__ 과 __len__ 부분이다.

 

이 부분들은 class의 기본 메서드로 각각 indexing과 len을 담당하는 부분이다.

우리가 dataset[0] 이런식으로 호출하면 자동으로 __getitem__메서드가 호출된다.

__len__메서드도 마찬가지다.

 

그럼 마지막 for문 부분은 어떤 것인지 보자

my_dict = {}

for data in range(len(rv)):
  if rv[data][1]=="10":
    if rv[data][0] in my_dict.keys():
      my_dict[rv[data][0]] +=1
    else:
      my_dict[rv[data][0]] = 1

print(dict(sorted(my_dict.items(), key=lambda item: item[1], reverse = True)))

마지막에 해본 것은 평점이 10점인 것의 개수를 dict형식으로 만들어 본 것이다.

현재 데이터가 [영화, 평점, 감상평] 이런식으로 되어있기에 평점을 보려면 데이터의 첫 번째 부분을 보아야 한다.

이렇게 첫 번째 if는 설명이 될 것이다.

 

그 다음의 if는 [0]번째 즉 영화명이 dict안에 있는지 확인하고 있으면 count를 늘리고 없으면 추가해주는 방식이다.

dict에서 기본제공되는 keys()는 dict안의 모든 키를 표시한다.

 

그래서 만들어 지는 것은 영화명:평점10점 개수의 dictionary type이다.

 

예를 들어 샘플 내에서 쥬라기 월드의 10점인 리뷰가 100개 있고, 범죄도시의 10점인 리뷰가 80개 있다면

{ '쥬라기 월드' : 100, '범죄도시' : 80}

이런 식으로 dict가 생성된다.

 

이렇게 데이터 구조화를 완료했다.

 


 

다음 포스트에서는 이 클래스를 상속해서 평점으로 긍부정을 정해보려고 한다.

 

아직 감상평으로 긍부정을 하기에는 포스팅 내용이 많이 부족해서

 

평점이 특정 threshold이상인 것으로 분류해보려고 한다.

반응형

댓글