이번 글에서는 프로그래머스 인공지능 데브코스의 2주차 강의에 대한 정리입니다.
기본적인 파이썬의 자료구조와 알고리즘을 학습한 후에, 이번 주에는 크롤링 (스크래핑)과 함께 기초 수학에 대해 배웁니다.
인공지능을 잘 활용하기 위해서 가장 처음으로 필요한 것은 아마 데이터 수집 과정이라고 할 수 있을 것입니다.
데이터 수집 방법은 다양하게 있겠지만, 스스로 필요한 데이터를 수집하는 크롤링은 배워두면 매우 유용할 것 같습니다.
1. HTTP 요청 주고 받기 - requests
Jupyter Lab 시작하기
- Interactive한 python 코드 작성 / 공유를 위한 개발 도구
- Jupyterlab을 pip 명령어를 통해서 install
- Code cell (명령 모드), Markdown cell (입력 모드)
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
28
29
30
31
32
33
34
35
36
### jupyterlab install
pip install jupyterlab
### 마크다운 문법
# 1. Header
# Hello world
## Hello world
### Hello world
# 2. Italic
*Hello world*
_Hello world_
# 3. Bold
**Hello world***
__Hello world__
# 4. Strikethrough (취소선)
~Hello world~
# 5. Unordered List
- Hello
- world
* Hello
* world
# 6. Ordered List
1. Hello
2. world
# 7. Code
`Hello world`
# 8. Code Block
```Hello world```
인터넷 사용자 간의 약속, HTTP
- 두 컴퓨터를 연결하는 네트워크 (Network)의 탄생
- 이 네트워크를 묶어서 근거리 지역 네트워크 (Local Area Network, LAN) 탄생
- 범지구적으로 연결된 네트워크인 인터넷 (Inter Network, Internet) 탄생
- 인터넷에서 정보를 교환할 수 있는 환경인 www (World Wide Web) 탄생
즉, 인터넷은 여러 컴퓨터끼리 네트워크를 연결한 것. 웹은 인터넷 상에서 정보를 교환하기 위한 시스템
- 웹에서 정보를 주고 받는 방법
- 정보를 요청하는 컴퓨터를 클라이언트 (Client), 정보를 제공하는 컴퓨터를 서버 (Server)
- 클라이언트가 서버에게 정보를 요청
- 요청에 대해서 서버가 작업을 수행
- 수행한 작업의 결과를 클라이언트에게 응답
- HTTP (Hypertext Transfer Protocol)의 구조
- 웹 상에서 정보를 주고 받기 위한 약속
- 클라이언트에서 서버로 정보를 요청하는 것을 HTTP 요청 (Request)
- 요청된 정보에 대해 서버가 클라이언트에게 응답하는 것을 HTTP 응답 (Response)
- HTTP로 정보 요청하기
- GET / HTTP 1.1
- HOST: www.programmers.com
- User-Agent: Mozilla/5.0
- HTTP / 1.1 200 OK
웹페이지와 HTML
- 웹 속에 있는 문서 하나는 웹 페이지, 웹 페이지의 모음은 웹 사이트
- 웹 브라우저는 HTML 요청을 보내고, HTTP 응답에 담긴 HTML 문서를 보기 쉬운 형태로 화면을 그려주는 역할
웹 페이지는 HTML 이라는 형식으로 되어 있고, 웹 브라우저는 HTTP 요청을 보내고, 응답받은 HTML 코드를 렌더링
- HTML (HyperText Markup Language) 구조
- HTML 코드는 Head (문서의 정보 - 제목, 언어 등)와 Body (문서의 내용 - 글, 이미지, 동영상 등)로 나뉨
- HTML은 여러 태그(Tag)로 감싼 요소(Element)의 집합으로 이뤄짐
- 태그로 묶어서 글의 형식을 지정할 수 있음
- 태그는 그에 맞는 속성 (attribute)을 갖을 수도 있음
나의 첫 HTTP 통신 코드
requests
는 python을 이용해서 간단히 HTTP 통신을 진행할 수 있는 라이브러리- 정보를 달라고 요청하기, GET
- 정보를 갱신하는 것을 요청하기, POST
1
2
### requests install
pip install requests
윤리적으로 웹 스크래핑, 크롤링 진행하기
- 웹 크롤링, 웹 스크래핑의 차이는?
- 웹 크롤링은 크롤러 (Crawler)를 이용해서 웹 페이지의 정보를 인덱싱하는 것에 초점
- 웹 스크래핑은 웹 페이지들로부터 우리가 원하는 정보를 추출하는 것에 초점
- 올바르게 HTTP 요청하기
- 웹 크롤링, 웹 스크래핑을 통해 어떤 목적을 달성하고자 하는가? (저작권 이슈)
- 내 웹 크롤링, 웹 스크래핑이 서버에 영향을 미치지는 않는가?
- 로봇 배제 프로토콜 (Robots Exclusion Standard, REP): 크롤러들은 이 규칙을 지키면서 크롤링을 진행
robots.txt
를 가져오는 방법은 웹 페이지 주소에/robots.txt
를 붙이면 됨www.naver.com/robots.txt
www.programmers.com/robots.txt
2. 똑똑한 HTML 분석기 - BeautifulSoup4
웹 브라우저가 HTML을 다루는 방법
- Document Object Model (DOM)
- 문서를 렌더링하는 가장 최초의 단계
- 브라우저의 렌더링 엔진은 웹 문서를 로드한 후에 파싱을 진행
- DOM의 목적
- DOM: Document, html, head, body, style, ul, li …
- 각 노드를 객체로 생각하면 문서를 더욱 편리하게 관리할 수 있음
- DOM Tree를 순회해서 특정 원소를 추가할 수 있음 / 찾을 수 있음
- 브라우저는 왜 HTML을 DOM으로 바꿀까?
- 원하는 요소를 동적으로 변경해줄 수 있음
- 원하는 요소를 쉽게 찾을 수 있음
- 브라우저는 HTML을 파싱해서 DOM을 생성하므로, 이를 바탕으로 요소를 찾을 수 있음
- 따라서 파이썬으로 HTML을 분석하는 HTML Parser가 필요함!
HTML을 분석해주는 BeautifulSoup
- BeautifulSoup Documentation
- 크롬 브라우저의 개발자 도구를 이용하면, HTML 코드를 확인할 수 있음
HTML의 Locator로 원하는 요소 찾기
tagname
: 태그의 이름id
: 하나의 고유 태그를 가리키는 라벨class
: 여러 태그를 묶는 라벨
3. 웹 브라우저 자동화 - Selenium
동적 웹 페이지와의 만남
- 정적 웹 사이트와 동적 웹 사이트
- HTML 내용이 고정된 정적 (Static) 웹 사이트
- HTML 내용이 변하는 동적 (Dynamic) 웹 사이트 - 인스타그램 등
- 정적 웹 사이트는 HTML 문서가 완전하게 응답됨
- 동적 웹 사이트는 응답 후 HTML이 렌더링 될 때까지 지연시간이 존재
- 웹 브라우저에서는 자바스크립트라는 프로그래밍 언어가 동작하며,
비동기 처리
로 필요한 데이터를 채움 동기 처리
: 요청에 따른 응답을 기다리는 것 -> 렌더링이 마무리 되어야만 데이터 처리가 됨비동기 처리
: 요청에 따른 응답을 기다리지 않음 -> 렌더링과 데이터 처리가 같이 이뤄지게 됨- 따라서 비동기 처리가 된 경우에, 상황에 따라 데이터가 완전하지 않는 경우가 발생할 수 있음
- 웹 브라우저와 파이썬의 만남
- 웹 브라우저를 자동화하는 라이브러리
Selenium
- 응답 후 시간을 지연시킬 수 있음
- UI와 상호작용이 가능함
- 웹 브라우저를 자동화하는 라이브러리
- 동적 웹 사이트는 응답 후 바로 정보를 추출하기 어려움
- 다양한 키보드 입력과 마우스 클릭 등의 상호작용이 필요함
- 이를 해결하기 위해 웹 브라우저를 Selenium을 이용하여 파이썬으로 조작하는 전략을 취함
브라우저를 자동화하기, Selenium
- Selenium은 파이썬을 이용하여 웹 브라우저를 조작할 수 있는 자동화 프레임워크
Wait and Call
- Selenium은 동적 웹 사이트에 대한 지원을 진행하기 위해 명시적 (Explicit) / 암묵적 (Implicit) 기다림이 있음
- 명시적 기다림 (Explicit wait): 다 로딩이 될 때까지 지정한 시간 동안 기다리기 (다 로딩이 될 때까지 5초 동안 기다려)
- 암묵적 기다림 (Implicit wait): 특정 요소에 대한 제약을 통한 기다리기 (이 태그를 가져올 수 있을떄까지 기다려)
마우스 및 키보드 이벤트 처리하기
4. 시각화로 결과 요약하기 - Seaborn
시각화 라이브러리, Seaborn
- scraping의 결과가 너무 분산되어 있으므로, 시각화로 표현해보도록 함!
- matplotlib을 기반으로 하는 시각화 패키지, Seaborn
- 다양한 그래프를 고수준에서 쉽게 그릴 수 있음
뭉게뭉게 단어구름, Wordcloud
- 자연어 문장에서 키워드를 추출하여 해당 키워드의 빈도 수를 측정
- 앞에서 전처리한 정보와 Wordcloud 라이브러리를 바탕으로 워드클라우드 생성
5. 인공지능 수학
선형시스템 (Linear system)
- 선형시스템의 표현: Ax = b, 연립일차방정식의 대수적 표현
- 선형대수 (Linear algebra)의 목표
- 어떤 연립일차방정식 즉, 선형 시스템 문제라도 정형적인 방법으로 표현하고 해결하는 방법을 배우는 것
- 선형시스템의 구성 요소: 선형방정식 (Linear equations)
- 선형시스템은 3개의 방정식으로 구성
- 선형시스템은 우리가 알아내려는 3개의 미지수 (unknown, variable) x, y, z를 가지고 있음
- 즉, 3개의 Linear equations과 3개의 variables로 구성된 연립일차방정식은 다음과 같이 표현
- 3 * 3 linear system = 식의 개수 * 미지수의 개수 linear system
- 3x + y + z = 4
- x - 2y - z = 1
- x + y + z = 2
- m * n 선형시스템의 대수적 표현 (Ax = b 형태)
- 선형시스템의 unknowns (미지수)를 모아서 column vector (열 벡터) x 로 표현
- 선형시스템의 선형방정식에 대해 다음을 수행
- coefficients (계수)를 모아서 A의 row vector (행 벡터)로 표현
- constant (상수)를 모아서 b에 표현
- 식은 행이고, 행은 식 (linear equations <-> row)
- m은 linear equation (선형방정식)의 개수, n은 unknown (미지수)의 개수
- A는 m * n 행렬, x는 n 벡터, b는 m 벡터
가우스 소거법
- 선형시스템의 해
- a의 역수 (inverse)가 존재하지 않는 경우, a가 특이 (singular)하다고 함
- 해가 있으면 선형시스템이 consistent 하다고 정의
- 해가 없으면 선형시스템이 inconsistent 하다고 정의
- 해가 하나인 경우: 3x = 6
- 해가 없는 경우: 0x = 6
- 해가 여러 개인 경우: 0x = 0
- 가우스 소거법 (Gauss elimination)
- 가우스 소거법은 임의의 m * n 선형시스템의 해를 구하는 가장 대표적인 방식
- 가우스 소거법은 다음의 두 단계로 수행됨
- 전방 소거법 (Forward elimination): 주어진 선형시스템을 아래로 갈수록 더 단순한 형태로 변형
- 후방 대임법 (Back-substitution): 아래에서부터 위로 미지수를 실제값으로 대체
- 소거법에 쓰이는 기본행연산 (Elementary Row Operations, EROs)
- Replace (치환): j번째 행을 기준 행인 i번째 행을 m배 하여 빼서 업데이트
- Interchange (교환): j번째 행과 i번째 행의 위치를 서로 바꿈
- Scaling (스케일링): j번째 행을 s배 스케일링
- 전방 소거법의 가치
- 주어진 선형시스템을 가장 풀기 쉬운 꼴로 변형
- 주어진 선형시스템의 rank를 알려줌
- 선형시스템이 해가 있는지 (consistent) 또는 없는지 (inconsistent) 알려줌
LU 분해
- 행렬분해 (Matrix decomposition)
- LU 분해 (LU decomposition): 가우스 소거법의 전방소거법을 행렬로 코드화 한 것
- L: Lower triangular matrix (하삼각행렬)
- 행렬 A를 전방 소거하는데 쓰인 replacement와 scaling에 대한 EROs를 기록해 둔 행렬
- U: Upper triangular matrix (상삼각행렬)
- 행렬 A를 전방 소거한 후 남은 upper triangular matrix (상삼각행렬)
- P: 행렬 A를 전방 소거하는데 쓰인 interchange에 대한 EROs를 기록해둔 행렬 (옵션)
- Ax = b => (LU)x = b => L (Ux) = b => Ly = b (단, Ux = y)
- Forward-substitution (전방 대치법)으로 y 구하기
- Back-substitution (후방 대치법)으로 x 구하기
- LU 분해가 가우스 소거법의 전방 소거법과 거의 같다고 할 수 있음
- L: Lower triangular matrix (하삼각행렬)
- QR 분해 (QR decomposition)
- 특이값 분해 (Singular Value Decomposition, SVD)
- LU 분해 (LU decomposition): 가우스 소거법의 전방소거법을 행렬로 코드화 한 것
- LU 분해를 활용하는 이유
- 수치적 안정성: 선형시스템의 해를 역행렬을 통해 구하는 것보다 PLU 분해를 이용하는 것이 수치적으로 안정적
- b가 자주 업데이트 되는 경우: 행렬 A를 미리 PLU로 분해해두면, b가 업데이트 될때마다 x를 바로 계산 가능
행렬연산과 선형조합
- 행렬 (Matrix)은 직사각형 구조에 숫자들을 담아놓은 구조
- 각 숫자들은 행렬의 요소 (Entry)라고 정의
- 하나의 행이나 열을 가지는 행렬은 각각 행 벡터 (row vector), 열 벡터 (column vector)라고 정의
- 일반적으로 벡터라고 하면, 열 벡터의 형태라고 생각
- 1 * 1 행렬은 스칼라 (scalar)와 동일
- m * n 행렬에 대한 전치 행렬 (Transpose Matrix)은 n * m 행렬의 형태를 갖음
- 행렬의 모든 요소가 0이면, 해당 행렬을 영 행렬 (Zero Matrix) 라고 하고, O라고 표기
- 영 행렬은 숫자의 -과 같은 존재로 행렬 합에 대한 항등원 역할
- 행과 열의 개수가 모두 n인 정사각형 모양의 행렬을 n차 정방 행렬 (Square Matrix) 이라고 정의
주대각선 (Main diagonal)이 1이고, 나머지 요소는 0인 n차 정방행렬을 항등행렬 (Identity Matrix) 이라고 정의
- 행렬의 곱에서 반드시 숙지해야 할 사항
- 행렬 C의 각 요소 C_ij는 A의 i번째 행 벡터와 B의 j번째 열 벡터의 내적 (inner product)
- 따라서 두 행렬의 곱 AB에 대해 A의 열 개수와 B의 행 개수는 일치해야 함
- AB와 BA는 일반적으로 일치하지 않음 (행과 열을 뽑아오는 방법이 다르기 때문)
- 행렬의 곱은 병렬 처리 (parallel processing)를 통해서 가속 할 수 있음
- 스칼라 -> 벡터 -> 행렬 -> 텐서
- 스칼라는 숫자 하나로 구성됨
- 이 스칼라를 벡터로 표현하면 1개의 구성 요소로 이뤄진 1-벡터
- 이 스칼라를 행렬로 표현하면 1개의 구성 요소로 이뤄진 1 * 1 행렬
- 벡터는 여러 숫자가 일열로 늘어선 구조
- 이 벡터를 행렬로 표현하면, 다양한 모양의 행렬로 표현 가능
- 행렬은 사각형 구조에 여러 숫자가 행과 열로 늘어선 구조
- 텐서는 스칼라, 벡터, 행렬을 아루르는 개념
- 숫자가 늘어설 수 있는 방향이 k개면, k-텐서라고 정의
- 0-텐서: 스칼라
- 1-텐서: 벡터
- 2-텐서: 행렬
- 스칼라는 숫자 하나로 구성됨
- 분할 행렬 (Partitioned Matrix): 추상적 구조로 행렬 연산 수행
- 행렬을 조각 단위로 분할한 것으로 생각할 수 있음
- 행렬은 부분 행렬 (submatrix)로 이뤄진 직사각형 구조로 확장해서 생각할 수 있음
- 행렬을 구조적으로 보는 방법을 분할 행렬 또는 블록 행렬이라고 함
- 분할 행렬로 행렬의 곱 이해하기
- 두 행렬의 곱 AB = C를 matrix-column vector product로 볼 수 있음
- 두 행렬의 곱 AB = C를 row vector-matrix product로도 볼 수 있음
- 선형 조합 (Linear Combination)
- 행렬은 열 벡터의 리스트
- 각 열 벡터는 m-벡터이므로, m * n 행렬은 m-벡터가 n개 있다고 해석 가능
- Ax = b는 행렬 A가 가지고 있는 열 벡터의 선형 조합
- 선형대수에서는 이처럼 벡터들에 대한 가중치 합을 특히 선형 조합 (linear combination) 이라고 정의
- 행렬 A의 열 벡터를 가중치 합으로 선형 조합 => 벡터 b를 만들 수 있는 가중치 조합이 존재하면 Ax = b의 해 존재
- 그 해는 가중치 x_i로 구성된 x라고 할 수 있음
- 열 벡터들에 대한 가능한 모든 선형 조합의 결과를 모아 집합으로 만든 것을 column space (열 공간)이라고 정의
좌표계 변환 (Change of Basis)
- 벡터의 물리적 표현: 벡터 v를 화살표로 표현
- v의 크기: 화살표의 길이
- v의 방향: 화살표의 방향
- 벡터의 수학적 표현: 벡터 v를 화살표로 표현
- 좌표계를 도입한 후, 벡터의 시작점을 원점에 맞추고, 끝점의 위치를 벡터 v의 수학적 표현으로 정의
- v의 크기: 화살표의 길이를 계산
- v의 방향: 화살표의 방향을 벡터로 표현
선형 변환 (Linear Transformation)
- 함수의 입력이 n-벡터이고, 출력이 m-벡터인 함수 T가 있다고 가정
- 이와 같이 함수의 입출력이 벡터인 함수를 변환 (Transformation) 이라고 함
이때, n = m인 경우에 해당 변환을 연산자 (Operator) 라고 함
- 행렬 변환 (Matrix Transformation)
- m * n 행렬 A에 대해 Ax는 n-벡터를 입력으로 받아, m-벡터를 출력으로 내는 변환 Ax라고 볼 수 있음
- 이 변환은 행렬이 정의하기 때문에 행렬 변환 (Matrix Transformation) 이라고 함
- 그런데 행렬 변환은 선형 함수 성질을 모두 만족하기 때문에 선형 변환 (Linear Transformation) 임
6. 2주차 돌아보기
- 기간: 2022. 09. 26 ~ 2022. 10. 01
이번 주차에서는 웹 스크래핑과 기초 수학에 대해 학습했는데, 옛날에 배웠던 내용들을 다시 복습하는 계기가 되었다. 난이도 측면에서는 아직은 까다롭거나 하는 부분은 없어서 잘 따라가고 있는 것 같다. 개인적으로는, 이미 알고 있는 부분들에 대해서는 시간을 조금 아껴서 사용하는 것도 고려해보면 좋을 것 같다.
특별히 이번 주에는 개인적으로 큰 일이 있었던 한 주였는데, 그 이유는 첫 퇴사를 했던 주차였기 때문이다. 대학 졸업하기도 전부터 결정된 첫 회사에서 데이터 사이언티스트부터 백엔드 엔지니어까지 스스로 엄청 잘했다고 이야기하는 것은 어려울 것 같지만, 나름 많은 것들을 경험하고 배울 수 있는 기회가 됐던 것 같다. 회사에서 많은 좋은 사람들을 만날 수 있어서 부족한 내 모습도 볼 수 있었고, 누군가에게는 배우고 싶은 모습을, 누군가에게는 배우고 싶지 않은 모습들도 함께 보면서 학습할 수 있었던 것 같다.
퇴사를 결정하면서, 이번 주에 유난히 현재 그리고 과거의 회사 동료 분들과 회식 자리를 많이 가지게 되었는데, 옛날 생각도 많이 나면서 앞으로의 시간들을 어떻게 보내야 할지 나름의 동기부여를 갖게 되는 시간이었다. 전 회사에서 스스로 느꼈던 개인의 한계와 배움의 한계 속에서 나의 가치를 스스로가 증명할 수 있는 온전한 실력을 갖추고 싶다. 부족하겠지만, 대신 교만하지 않고 겸손하게 실력을 갈고 닦고 싶다. 나에게 주어진 지금 이 시간을 소중히 사용하자.
출처: 프로그래머스 인공지능 데브코스 4기 2주차 강의 -> 강의 내용 정리 깃허브 링크