반응형
> N-gram
- 빅데이터 분석, 검색 엔진에서 많이 쓰인다. 구글은 책들을 스캔해서 N-gram viewer를 만들었는데 사람들의 언어 패턴을 시대별로 분석하기도 함.
- N-gram은 문자열에서 N개의 연속된 요소를 추출하는 방법. 만약 "hello"라는 문자열을 2-gram으로 추출하면
- He, el, ll, lo
- 글자 단위 N-gram( 2gram )
#include <stdio.h>
#include <string.h>
int main(){
char text[30] = "Hello";
int length;
length = strlen(text);
for (int i=0; i<length; i++){
printf("%c%c\n", text[i], text[i+1]); // 현재 문자와 그 다음 문자 출력
}
return 0;
}
- 단어 단위 N-gram( 2gram )
#define _CRT_SECURE_NO_WARNINGS // strtok 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h>
int main(){
char text[100] = "this is c language";
char *tokens[30] = { NULL, }; // 자른 문자열의 포인터를 보관활 배열, NULL로 초기화
int count = 0;
char *ptr = strtok(text, " "); // " " 공백 문자를 기준으로 문자열을 자름, 포인터 반환
while(ptr != NULL){ // 자른 문자열이 나오지 않을 때까지 반복
token[count] = ptr; // 문자열을 자른 뒤 메모리 주소를 포인터 배열에 저장
count++;
ptr = strtok(NULL, " "); // 다음 문자열을 잘라서 포인터를 반환
}
// 2-gram이므로 배열의 마지막에서 요소 한 개 앞까지만 반복함
for(int i=0; i<count-1; i++){
printf("%s %s\n", tokens[i], tokens[i+1]);
}
return 0;
}
N-gram의활용
4-gram을 쓰면 picked, picks, picking에서 pick만 추출하여 단어의 빈도를 세는 데 이용된다. 이런 특성 때문에 검색엔진, 빅데이터, 법언어학 분야에서 주로 활용된다. 해리포터의 작가 조앤 롤링은 가명으로 <더 쿠쿠스 콜링>이라는 소설을 출간한 적이 있는데 그 작가가 조앤롤링 이라는 것을 밝혀내는데 N-gram을 비롯한 다양한 기법이 동원되었다. 즉, 사람마다 사용하는 문장에 패턴이 있는것. 그래서 같은 의미라 하더라도 사람마다 단어 선택이 다르다는 것을 통계적으로 분석해낸 사례이다.
> 두 점 사이 거리 구하기
#include <stdio.h>
#include <math.h> // sqrt함수
struct Point2D{
int x;
int y;
};
int main(){
struct Point2D p1;
struct Point2D p2;
p1.x = 30;
p1.y = 20;
p2.x = 60;
p2.y = 50;
int a = p2.x - p1.x;
int b = p2.y - p1.y;
double c = sqrt((a * a) + (b * b));
printf("%f\n", c);
return 0;
}
반응형
'알고리즘 > [ 개념 ]' 카테고리의 다른 글
[ 개념 ] 05. N-Queens(Back Traking) (0) | 2020.08.27 |
---|---|
[ 개념 ] 04. Locality 관점에서 Quick Sort가 Merge Sort보다 빠른 이유 (0) | 2020.08.14 |
[ 개념 ] 03. Tail Call Recursion (0) | 2020.08.14 |
[ 개념 ] 02. 이진트리에 관하여 (0) | 2020.08.14 |
[ 개념 ] 00. 회문판별 (0) | 2020.08.14 |