Car 는 자동차 클래스
car1, car2, car3 객체는 Car 클래스의 ‘인스턴스’
클래스 : 비슷한 속성을 가진 객체를 묶는 큰 틀
클래스 변수
class Car:
honk = "빵빵"
print honk
# NameError: name 'honk' is not defined
honk이라는 변수는 외부에서 호출이 안된다
클래스 안에 있는 변수는 '해당 클래스의 인스턴트’를 통해서 호출
my_car = Car()
my_car.honk
# '빵빵'
Car().honk
self는 뭔가요?
클래스 메소드의 첫 번째 인수로 self를 써 줘야지
해당 메소드를 인스턴스의 메소드로 사용 가능
쉽게 : 이 메소드를 부르는 객체가 해당 클래스의 인스턴스 인지 확인하려고
class Car:
honk = "빵빵"
def set_info(self, color, year):
self.color = color
self.year = year
def get_info(self):
print("color : %s , year: %d" %(self.color, self.year))
my_car1 = Car()
my_car1.set_info("Red", 2017)
my_car1.get_info()
#=> color : Red ,year: 2017
init 이란?
class Car:
honk = "빵빵"
def set_info(self, color, year):
self.color = color
self.year = year
def get_info(self):
print "color : %s ,year: %d" % (self.color, self.year)
my_car = Car()
my_car.set_info("Red", 2017)
my_car.get_info()
#=> color:Red, year:2017
new_car = Car()0
new_car.get_info()
# AttributeError: Car instance has no attribute 'color'
오류발생! set_info()를 안하고 get_info()를 먼저 불렀다…
클래스의 인스턴트를 생성할 때, 오류를 줄이고 싶다!
init 을 사용하자
초기화 메소드, 생성자라고 불림
인스턴스 = 클래스(변수1,변수2…)
class Car:
honk = "빵빵"
def __init__(self, color, year):
self.color = color
self.year = year
print "새로운 Car 인스턴스가 생성되었습니다."
def get_info(self):
print "color : %s ,year: %d" % (self.color, self.year)
my_car = Car("Red", 2017)
# 새로운 Car 인스턴스가 생성되었습니다.
my_Car.get_info()
# color : Red, year: 2017
새로운 인스턴스를 만들고 난 후 “새로운 Car 인스턴스가 생성되었습니다” 출력
즉 , init 메소드가 호출 되었다.
클래스 상속?
상속 : 물려받는다? 유산을 상속하다
부모의 클래스가 존재하고 그 부모 클래스를 '상속’받은 자식 클래스를 만들 수 있다.
자식클래스는 부모가 가진 메소드나 변수를 물려받아 그대로 사용 가능!
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print("이름: %s, 나이: %d" %(self.name, self.age))
class Employee(Person):
pass
em = Employee("goorm",20)
em.info()
#=> 이름: goorm, 나이: 20
Person 클래스는 init 메소드를 통해 이름, 나이를 초기값으로 받는다
info메소드를 통해 이름과 나이를 출력
Employee클래스를 보면 Person을 상속받았다
그래서 info를 동일하게 쓸 수 있다.
만약 메소드를 변형한다면?
메소드 오버라이딩이라고 부른다
class Person:
def __init__(self, name, age):
self.name =name
self.age = age
def info(self):
print "나는 부모 클래스 입니다."
class Employee(Person):
def info(self):
print "나는 자식 클래스 입니다."
per = Person("Python", 100)
per.info()
#=> "나는 부모 클래스 입니다."
em = Employee("goorm",20)
em.info()
#=> "나는 자식 클래스 입니다."
원래는 “나는 부모 클래스 입니다” 이지만
Person을 상속받아 자식클래스, 즉, Employee에서 메소드를 변형, 즉, 오버라이딩했다
따라서 "나는 자식 클래스 입니다"가 출력
예시를 하나 만들어보자
1 2 3
class 클래스명(상속클래스): def__init__(self, 매개변수): 인스턴스 속성
1 2 3 4 5 6
classKlass(object): def__init__(self, name): self.name = name
defgetName(self): return self.name
__init__은 객체 생성 후 초기화 함수이다.
객체가 생성될 때 내부의 이름공간에 속성을 할당하여 초기화 역할만 한다.
수학에서 백이란 중복 원소를 허용한 집합 multiset을 뜻한다. 원소의 순서는 고려하지 않는다. 어쩌면 중복 집합과 같다.
자연어 처리 분야에서는 백오브워즈 bag of words란
단어의 등장 순서에 관계없이 문서 내 단어의 등장 빈도를 임베딩으로 쓰는 기법
문장을 단어들로 나누고 이들을 중복집합에 넣어 임베딩으로 활용하는 것
저자가 생각한 주제가 문서에서의 단어 사용에 녹아 있을 것
주제가 비슷한 문서라면 단어 빈도 또는 단어 등장 역시 비슷하 것
빈도를 그대로 백오브워즈로 쓴다면 많이 쓰인 단어가 주제와 더 강한 관련을 맺고 있을 것
위 처럼 문장을 단어로 쪼개고 임의의 주머니에 넣고 뽑았을 때 등장하면 1 아니면 0을 반영한 것이다.
백오브워즈 임베딩은 단순하지만 정보 검색 ** Information Retrieval분야에서 많이 쓰인다.
사용자의 질의 ** query에 가장 적절한 문서를 보여줄 때 질의를 백오브워즈 임베딩으로 변환하고 질의와 검색 대상 문서 임베딩 간 코사인 유사도를 구해 유사도가 가장 높은 문서를 사용자에게 노출한다.
2.2.2 TF-IDF
단어 빈도 또는 등장 여부를 그대로 임베딩으로 쓰는 것에는 단점이 있다. 해당 단어가 많이 나왔다고 하더라도 문서의 주제를 가늠하기 어렵다. 이유는 다음과 같다. ‘을/를’, ‘이/가’ 같은 조사들이 한국어 문서에 등장한다. 이 것으로 문서의 주제를 추측하기 어렵다.
이런 단점을 보완하기 위해서 Term Frequency-Inverse Document Frequency이다.
단어-문서 행렬에 가중치를 계산해 행렬 원소를 바꾼다. 이 또한 단어 등장 순서는 고려하지 않는다.
결국 TF-IDF는 어떤 단어의 주제 예측 능력이 강할 수록 가중치가 커지고 그 반대의 경우 작아진다
어떤 단어의 TF가 높으면 TF-IDF 값 역시 커진다
단어 사용 빈도는 저자가 상정한 주제와 관련을 맺고 있을 거라는 가정에 기초한 것이다
2.2.3 Deep Averaging Network
Deep Averaging Network는 백오브워즈 가정의 뉴럴 네트워크 버전이다.
예를 들어 애비는 종이었다 라는 문장이 있다면
{애비, 종, 이, 었, 다}에 속한 단어의 임베딩을 평균을 취해 만든다. 문장 내에 어떤 단어가 쓰였는지, 쓰였다면 얼마나 많이 쓰였는지 그 빈도만을 고려한다. 문장 임베딩을 입력받아 해당 문서가 어떤 범주인지 분류 classifiation 한다.