목록전체 글 (315)
rueki
한국어는 다른 언어보다 다음 언어를 예측하기가 힘들다. 언어 모델에서는 토큰화가 필수적인데, 한국어는 토큰화부터 까다로운 사항이 많기때문이다. 영어는 문장의 구조가 확실해서 어순이 중요하지만, 한국어는 어순이 중요하지가 않다. ① 나는 운동을 합니다 체육관에서. ② 나는 체육관에서 운동을 합니다. ③ 체육관에서 운동을 합니다. ④ 나는 운동을 체육관에서 합니다. 위의 예시를 보면 주어를 생략하든, 문장 순서를 바꾸든 ,의미가 전부 통한다. 그래서 확률에 기반한 언어모델이 제대로 예측하기는 힘들 것이다. 그리고 한국어는 교착어이다. 띄어쓰기 단위로 토큰화를 할 경우에, 발생가능한 단어의 수가 몇 배로 늘어나게 되는데 조사때문이다. 그 -> 그는, 그를, 그가, 그의... '그'라는 하나의 단어가 다양한 단..

N-gram 언어 모델은 카운트에 기반한 SLM의 일종이다. 그러나 차이점은 일부 단어만 고려하는 접근 방법으로써, 일부 단어를 몇 개 보느냐를 결정해야 한다. 이에 대한 변수를 n이라고 일컫는다. SLM에서 훈련 코퍼스에 확률을 계산하고 싶은 문장이나 단어가 없을 수 있다. 그래서 확률을 계산하고 싶은 문장이 길어질수록 갖고있는 코퍼스에서 그 문장이 존재하지 않을 수 있다. 마르코프의 가정을 사용해서 카운트를 해보자 P(is|An adorable little boy)≈ P(is|little boy) is라는 단어가 An adorable little boy 다음에 나올 확률을 임의로 little boy 뒤에 나오게, 즉, 앞 단어 중 전체가 아니라 임의의 개수만 포함해서 Count를 해보자는 것이다. 그..

앞의 글에서 언급했듯이 조건부 확률은 다음 언어의 예측에 있어서 중요하다. p(B|A)=P(A,B)/P(A) P(A,B)=P(A)P(B|A) P(A,B,C,D)=P(A)P(B|A)P(C|A,B)P(D|A,B,C) -> 연쇄 법칙 => P(x1,x2,x3...xn)=P(x1)P(x2|x1)P(x3|x1,x2)...P(xn|x1...xn−1) 쉽게 말하자면 x1과 x2가 있는데 그 다음 단어 x3의 확률을 알려면 x1과 x2가 조건으로 일어났을 때 x3의 조건부 확률을 구하면 되는 것이다. 전체 문장의 확률은 각 단어들이 이전 단어가 주어졌을 때 다음 단어로 등장할 확률의 곱으로 구성된다. An adorable little boy is spreading smiles 라는 문장이 있을 때, 쉽게 말해서, 전체..

본문은 https://wikidocs.net/21668 을 참고하여 작성한 글입니다. 언어 모델은 자연어 생성의 기반으로, 단어의 시퀀스의 확률을 예측하는 모델이다. 음성 인식, 기계 번역, OCR, 검색어 자동 완성 등과 같은 것은 전부 언어 모델을 통해 이루어진다. 만드는 방법으로는 아래와 같다. 1) 통계를 이용한 방법 2) 인공 신경망을 이용한 방법 언어 모델은 문장의 확률을 예측하는 일이다. 예측에 앞서, 단어들이 주어졌을 때 다음 단어가 나올 확률을 예측해야 한다. 그래서 문장의 확률은 왜 예측해야 할까? 예를 들어서 한 번 살펴보자 a. 기계번역(Machine Translation) P(나는 버스를 탔다) > P(나는 버스를 태운다) :언어 모델은 좌측의 문장의 확률이 더 높다고 판단 b. ..
본문은 https://wikidocs.net/22647 참고해서 작성한 글입니다. 원-핫 인코딩은 문자를 숫자로 바꾸는 기법 중 하나이며, 단어를 표현하는 가장 기본적인 방법이다. 원-핫 인코딩을 하기 앞서 단어집합을 만들어야하는데, 단어 집합은 서로 다른 단어들의 집합으로서, 중복값이 ㅇ없어야 한다. 단어집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식이다. 1) 각 단어에 고유 인덱스 부여(정수 인코딩) 2) 표현하고자 하는 단어의 인덱스 위치에 1을 부여, 나머지 위치에는 0을 부여 한국어 문장에 원-핫 인코딩 진행을 해보자 from konlpy.tag import Okt okt = Okt() token =..

필요한 변수는 R, 테스트케이스, 문자열 S가 되겠다. 첫 째줄에 테스트 케이스 수 입력하고 그 다음 줄부터는 출력이 반복되어야하는 수와 문자열을 입력해야한다. ABC -> AAABBBCCC가 나오기 위해서 문자열에서 한 문자당 문자열의 갯수만큼 반복해서 출력해야 한다. 그래서 처음for문으로 변수 입력받고, 그 다음에 문자열 갯수만큼의 범위로 for문을 돌려 출력하게끔하는데, 반복 출력되야하는 횟수가 있으니 안에 for문을 한 번 더 써서 출력을 한다. #include #include using namespace std; int main(){ int N;//테스트 케이스 int R; string str; cin>>N; for(int i=0;i>R; cin>>str; for(int j =0;j
본문은 https://wikidocs.net/31766 를 참고해서 작성한 글입니다. 컴퓨터는 텍스트보다는 숫자를 처리하기가 더 쉽다. 그래서 텍스트를 숫자로 바꾸는 것이 필요하며, 중요하다. 바꾸기 전에, 먼저 고유 숫자로 매핑시키는 작업이 필요할 때가 있다. 1000개의 단어가 있으면, 각 단어에 0부터 999까지 인덱스 번호를 부여하는 것이다. 인덱스 부여 기준은 보통 단어에 대한 빈도수로 정렬한 뒤에 부여한다. from nltk.tokenize import sent_tokenize text = "A barber is a person. a barber is good person. a barber is huge person. he Knew A Secret! The Secret He Kept is hu..
본문은 https://wikidocs.net/22592 를 참고해서 작성한 글입니다. 머신 러닝을 이용한 자연어 처리의 목표는 기계가 사람만큼, 또는 사람 이상의 성능을 내길 기대하는 것이다. 그러나 기계에게 모든 단어를 다 알려주고 원하는 결과를 기대하기에는 무리이다. 그래서 단어 분리는 기계가 아직 배운적 없는 단어라도 배운 것처럼 대처할 수 있도록 도와주는 방법이다. 기계 번역 등, 주요 전처리로 사용되고 있다. 기계가 알고있는 단어들의 집합을 Vocabulary(단어 집합)이라고 한다. 기계가 못 배운 단어들은 OOV(Out Of Vocabulary) 또는 UNK(Unknwon word)라고 한다. 왜 단어 분리를 하는가? 단어분리(Subword Segmentation)는 단어를 여러 단어로 분리..