알고리즘/[ 개념 ]

[ 개념 ] 01. N-gram과 두 점 사이의 거리 구하기

kim.svadoz 2020. 8. 14. 10:17
728x90
반응형

> 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;
}
728x90
반응형