Yeon's 개발블로그

지식을 전파하는 개발자가 되고싶습니다.

분류 전체보기 83

6. 단어 임베딩

1. 차원축소 높은 차원에서 자연어를 벡터로 추출하는 과정에서 희소성 문제가 많이 나타난다. 따라서 낮은 차원으로 정보를 효율적으로 표현하는 차원축소가 필요하다. 대표적인 차원축소의 방법으로는 주성분 분석(Principal Component Analysis)이 있다. 고차원에서의 데이터를 임의의 평면에 투사했을때 투사한 점들간의 사이가 최대한 멀어야 하며, 투사될때 원래 벡터와 투산된 점의 거리가 최소가 되어야 한다는 조건을 지키며 낮은차원으로 압축하게 된다. 하지만 투사하는 순간 거리가 생기므로, 정보의 손실이 일어날 수 밖에 없기때문에 매니폴드 가설을 통해 좀더 효과적으로 접근해야한다. 매니폴드 가설이란, 높은차원에 존재하는 데이터들의 경우에는 실제로 해당데이터들을 아우르는 낮은 차원의 매니폴드가 존..

NLP 2021.07.21

5. 자연어의 중의성을 해결하는 법

자연어가 가지는 중의성이란? 사람은 주변정보를 사용하여 숨겨진 의미를 파악하지만, 기계에게 주어지는 것은 텍스트이기 때문에 자연어 처리분야에서 중의성을 해결하는 것은 굉장히 중요한 부분이다. 형태는 같으나 뜻은 서로 다른 동형어, 한 형태의 단어가 여러 의미를 지닌 다의어의 경우에는 꼭 중의성을 해소(Word-Sense Disambiguation)하여 의미를 명확히 해야한다. 또한 의미가 같은 단어들은 동의어 집합으로 묶고, 상위어와 하위어의 단어 구조를 계층화하여 자연어처리에 유용하게 쓸 수 있다. 1. 원 핫 인코딩 (One-Hot Encoding) 단 하나의 1과 나머지의 0으로 이루어진 벡터를 이용한 표현방법을 말한다. 벡터의 차원은 전체 어휘의 개수가 되며, 보통 3만에서 10만까지의 범위를 가..

NLP 2021.07.21

4. 전처리

전처리란? 머신러닝 또는 딥러닝 학습을 위해 데이터를 사용할 때, 모델이 사용가능할 수 있는 형태로 변환하고 품질을 올리는 과정을 전처리과정이라고 한다. 자연어처리에서 자주 등장하는 코퍼스(corpus)는 한국말로 말뭉치라고도 하며, 여러 단어들로 이루어진 문장을 뜻한다. 코퍼스가 많고 오류가 없을수록 자연어처리 모델의 정확도가 높아진다. 자연어처리에서 전처리과정은 코퍼스수집-> 정제 -> 문장단위분절 -> 분절 -> 병렬코퍼스 정렬 -> 서브워드 분절 의 과정으로 이루어진다. 이제부터 하나씩 살펴보려고 한다. 1. 코퍼스 수집 공개된 데이터를 사용하거나 크롤링을 통하여 코퍼스를 수집할 수 있다. 한가지 언어로 구성된 단일언어 코퍼스는 인터넷에 널려있기 때문에 수집하기 쉽지만, 목적에 맞게 적절한 코퍼스..

NLP 2021.07.19

3. 파이토치 기초문법

파이토치란(PyTorch)? 구글이 만든 텐서플로우(Tensorflow)에 대항하여 페이스북이 만든 딥러닝 프레임워크이다. 텐서플로우와 달리 대부분의 모듈이 파이썬으로 짜여있어 코드가 깔끔하고, 넘파이(NumPy)와 의 호환성이 뛰어나다. 또한 한줄의 명령어로 역전파 알고리즘을 수행하고, 연산과 동시에 동적그래프가 생성되어 자유로운 수정이 가능하다는 장점이 있다. 1. Tensor 파이토치의 텐서는 넘파이의 배열인 ndarray와 같은 개념이다. 파이토치는 텐서를 통해 값을 저장하고 함수를 수행한다. import torch import numpy as np x=torch.Tensor([[1,2],[3,4]]) y=np.array([[1,2],[3,4]]) 위의 예제에서 파이토치와 넘파이 코드 모두 2*2..

NLP 2021.07.13

2. 자연어처리를 위한 기초수학

1. 확률변수와 확률분포 -확률변수:무작위 실험을 했을때, 특정 확률로 발생하는 결과를 수치적 값으로 표현한 변수이다. -이산확률변수: 랜덤변수는 보통 불연속적인 이산값인 경우가 많은데, 이를 이산확률변수라 한다. 이산적인 확률변수를 갖는 확률 분포로는 베르누이분포와 멀티눌리 분포가 있는데, 베르투이 분포는 0과 1의 값만 가질 수 있고, 멀티눌리 확률분포는 여러개의 이산값을 가질 수 있다. -연속확률변수: 연속적인 값을 다루는 확률변수로, 확률 질량 함수대신 확률 밀도 함수를 통해 정의할 수 있다. 정규분포라고 불리는 가우시안 분포함수가 그 예이다. -결합확률: 2개 이상의 사건이 동시에 일어날 확률을 말하며, 독립사건인 경우 두 확률의 곱으로 표현된다. P(A,B)=P(A)P(b) -조건부확률: 하나..

NLP 2021.07.13

1. 자연어 처리란?

1. 자연어 처리, NLP Natural Language Processing, 줄여서 NLP는 인공지능의 한 분야로, 컴퓨터가 사람의 언어를 이해하고 처리하는 기술을 말한다. 요약, 기계 번역, 감정분석, QA 등 많은곳에서 응용된다. 인간의 언어는 단어간의 순서가 고려되는 시퀀셜 데이터기 때문에 딥러닝 분야에서 상대적으로 나중에 발전되어 왔지만, end to end 모델로 대체되면서 빠르게 발전되어 왔다. *시퀀셜데이터(sequential data): 순차 데이터라고도 하며, 데이터의 집합 내에서 객체들이 순서를 가진 데이터이다. 순서가 변경되면 데이터가 변경된다. *end-to-end: 어떤 문제를 해결함에 있어서 여러가지 과정들을 하나의 신경망을 통해서 재배치 하는과정. 하나의 파이프라인을 하나의 ..

NLP 2021.07.13

[c++] 백준 2606: 바이러스

1) 문제 신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다. 예를 들어 7대의 컴퓨터가 과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다. 어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터..

Algorithms/BFS DFS 2021.05.12

[c++] 백준 1260: DFS와 BFS

1) 문제 그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다. 2) 입력 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다. 3) 출력 첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 ..

Algorithms/BFS DFS 2021.05.12

[c++] BFS와 DFS

BFS, DFS란? 그래프를 탐색하는 방법으로는 BFS와 DFS가 있다. BFS(Breadth-First Search)는 너비우선탐색이고, DFS(Depth-First Search)는 깊이우선탐색이다. BFS는 최대한 옆으로 넓게 이동하는 방법으로, 더이상 옆으로 갈 수 없을때 아래로 이동하기때문에 너비우선탐색으로 불린다. 루트노드와 제일 인접한 노드서부터 차례대로 탐색을 하기때문에 주로 두 노드사이의 최단경로를 찾을때 많이 사용되고 큐를 이용하여 구현된다. DFS는 최대한 아래로 이동하는 방법으로, 더이상 내려갈때가 없을때 다른 브랜치로 넘어가 탐색하기때문에 깊이우선탐색으로 불린다. 주로 미로찾기 문제, 모든 노드를 방문하고자 하는 경우에 사용되며, BFS보다는 성능이 떨어지지만 코드는 조금 간단하다...

Algorithms 2021.05.11

[c++] Binary Search, 이진탐색

이진탐색이란? 이진탐색은 이미 정렬된 배열에서, 특정한 숫자를 찾는 정렬 알고리즘이다. 찾고자하는 숫자를 배열의 중간값과 비교하여, 만약 작다면 왼쪽을 다시 탐색, 크다면 오른쪽을 다시 탐색하면서 숫자를 찾아낸다. 원하는 값을 찾아내면 탐색은 종료되며, 존재하지 않는다고 판단하여도 탐색을 종료한다. 존재하지 않는다고 판단하는 기준은 탐색할 인덱스가 없을때 이다. 구현방법은 반복문을 사용할 수도 있고, 재귀를 사용할 수도 있는데 아래의 코드는 재귀를 사용하여 구현한 것이다. 구현코드 int binarySearch(int arr[], int l, int r, int x) { if (r >= l) { int mid = l + (r - l) / 2; if (arr[mid] == x) return mid; if ..

Algorithms 2021.05.11