사전 어휘
개념

어휘

gabury1고친 사람 github-actions[bot]

어휘는 시스템이 알아보는 낱말이 무엇무엇인지 정해 줍니다. 목록에 없는 낱말은 그 시스템에게 없는 말과 같습니다. 검색에서는 문서들에 나온 낱말을 한 번씩만 모은 목록을 가리킵니다. 언어 모델에서는 글을 쪼갤 조각마다 번호를 붙여 둔 목록을 가리킵니다.

쉽고 빠른 이해

무슨 일을 하는 물건인가 — 시스템이 알아보는 낱말의 목록입니다. 문서에 「사과」「배」「사과」가 나오면 어휘는 「사과」와 「배」 둘입니다.

왜 이렇게 하나 — 글을 낱말로 다루려면 어떤 낱말이 있는지부터 알아야 합니다. 검색 엔진은 이 목록에서 낱말을 찾아 그 낱말이 든 문서로 건너갑니다. 언어 모델은 이 목록의 번호로 글을 숫자로 바꿔 받습니다.

어떻게 도나

  1. 글을 조각으로 쪼갭니다
  2. 같은 조각은 한 번만 남깁니다
  3. 검색은 문서가 들어올 때마다 새 낱말을 더합니다. 언어 모델은 학습 전에 목록을 정해 두고 바꾸지 않습니다

대가 — 목록에 없는 낱말은 찾을 수도 읽을 수도 없습니다. 목록을 크게 잡으면 메모리를 더 씁니다. 모델이 익힐 것도 늘어납니다.

상세

이 절은 먼저 어휘가 무엇을 세는지를 짧은 문장 하나로 봅니다. 그다음 이 말을 가장 많이 쓰는 두 곳인 검색과 언어 모델에서 어휘가 어떻게 만들어지고 무엇을 정하는지 봅니다.

외국어를 처음 배울 때 단어장을 한 권 만듭니다. 단어장에 적어 둔 낱말은 뜻을 찾을 수 있습니다. 적지 않은 낱말은 찾을 길이 없습니다. 시스템에게는 어휘가 이 단어장입니다.

어휘가 세는 것

일상어에서 어휘는 한 사람이나 한 언어가 쓰는 낱말 전체를 뜻합니다. 기술 용어로서의 어휘도 뜻이 같습니다. 주인이 사람이 아니라 시스템이라는 점만 다릅니다. 한 시스템이 구별하는 낱말을 한 번씩만 모은 목록이 그 시스템의 어휘입니다.

어휘를 알려면 먼저 토큰을 알아야 합니다. 글을 낱말 같은 조각으로 쪼개면 그 조각 하나하나가 토큰입니다.

토큰은 글에 나온 한 번 한 번을 셉니다. 어휘는 서로 다른 종류만 셉니다. 같은 낱말이 열 번 나오면 토큰은 열 개입니다. 어휘에는 한 번만 오릅니다.

어휘에 든 종류의 수를 어휘 크기라고 부릅니다. 그 시스템이 낱말을 몇 가지로 구별하는지를 보여 주는 수입니다.

아래 영어 문장 하나로 토큰 수와 어휘 크기를 견주면 이렇습니다. 오른쪽 주석이 센 결과입니다.

the cat saw the dog
토큰 수    5   // the 가 두 번
어휘 크기  4   // the 는 한 번만

같은 글이라도 토큰 수와 어휘 크기는 이렇게 다릅니다. 아래 두 소절에서 보듯 어휘에 무엇을 넣고 크기를 얼마로 잡느냐가 시스템의 성격을 가릅니다.

검색의 어휘

검색 엔진은 글을 낱말로 찾아 주는 시스템입니다. 문서가 들어오면 먼저 토큰으로 쪼갭니다. 이렇게 쪼개는 일을 토큰화라고 합니다.

분석기가 쪼갠 토큰의 모양을 다듬습니다. Run 을 run 으로 바꾸는 식입니다. 분석기는 토큰화와 다듬는 단계를 한데 묶은 부품입니다. 다듬는 단계는 아래 표에서 하나씩 봅니다.

다듬어진 낱말은 역색인에 적힙니다. 역색인은 낱말마다 그 낱말이 든 문서 번호를 적어 둔 찾아보기 표입니다. 한 줄의 왼쪽에 낱말이, 오른쪽에 문서 번호들이 놓입니다.

역색인의 왼쪽 칸에 오른 낱말을 모은 목록이 용어 사전입니다. 이 용어 사전이 곧 검색 엔진의 어휘입니다.

검색어도 같은 분석기를 지난 뒤 용어 사전에서 찾습니다. 찾은 낱말의 줄을 따라가면 문서 번호가 나옵니다. 용어 사전에 없는 낱말로 찾으면 결과가 0건입니다.

검색의 어휘는 문서가 들어올 때마다 자랍니다. 새 문서에 처음 보는 낱말이 있으면 용어 사전에 한 줄이 늘어납니다. 어휘가 클수록 용어 사전도 커져 메모리를 더 씁니다.

분석기를 어떻게 꾸리느냐가 어휘의 크기와 모양을 정합니다. 다듬는 단계 하나하나가 서로 다른 종류를 한 종류로 합치기 때문입니다. 흔히 쓰는 단계는 셋입니다.

단계 하는 일
소문자로 바꾸기 Run 과 run 을 한 낱말로 본다
어간 추출 낱말 끝의 변화를 잘라 뿌리만 남긴다
불용어 빼기 the 처럼 흔해서 찾는 데 도움이 안 되는 낱말을 버린다

표의 세 단계를 차례로 거치면 낱말 다섯 종류가 한 종류로 줄어듭니다. 그림의 칸마다 그 단계를 지난 뒤 남은 종류를 적었습니다.

flowchart TD
    A["넣은 낱말 · Run · run · runs · running · the · 다섯 종류"]
    A --> B["소문자로 바꾼 뒤 · run · runs · running · the · 네 종류"]
    B --> C["어간 추출 뒤 · run · the · 두 종류"]
    C --> D["불용어를 뺀 뒤 · run · 한 종류"]

어휘가 줄면 「runs」로 찾아도 「running」이 든 문서가 걸립니다. 둘이 같은 「run」이 되었기 때문입니다. 대신 둘을 가려 찾을 방법은 사라집니다.

한국어는 낱말 끝에 조사가 붙습니다. 그래서 형태소 분석으로 조사를 떼어 냅니다. 그래야 「한강을」과 「한강에서」가 어휘에서 한 낱말 「한강」으로 모입니다.

분석기로 모양을 맞춰도 못 메우는 틈이 남습니다. 찾는 사람은 「자동차」라고 치는데 문서에는 「승용차」라고 적혀 있을 수 있습니다. 두 낱말은 어휘에서 서로 다른 종류라 만나지 못합니다. 이 어긋남을 어휘 불일치라고 부릅니다.

언어 모델의 어휘

언어 모델은 글을 받아 다음에 올 글을 이어 쓰는 모델입니다. 모델은 숫자로만 계산합니다. 그래서 글을 받기 전에 조각으로 쪼갭니다. 그리고 조각마다 번호로 바꿉니다.

이 일을 맡는 부품이 토크나이저입니다. 토크나이저는 조각과 번호의 짝을 적은 표를 들고 있습니다. 이 표가 언어 모델의 어휘입니다.

아래는 낱말 하나가 번호로 바뀌는 모습입니다. 쪼갠 모양과 번호는 설명을 위해 지어낸 것입니다.

unhappiness
un · happi · ness  // 조각 셋
412 · 9031 · 2210  // 어휘의 번호

언어 모델의 어휘는 학습 전에 정하고 그 뒤로 바꾸지 않습니다. 모델은 어휘의 번호마다 그 조각의 뜻을 숫자 묶음으로 익힙니다. 이 숫자 묶음이 임베딩입니다. 어휘를 나중에 바꾸면 이미 익힌 번호와 뜻이 어긋납니다.

어휘에 없는 낱말을 미등록어라고 부릅니다. 영어로는 OOV(Out-Of-Vocabulary, 어휘 밖 낱말)라고 줄여 씁니다. 낱말을 통째로 한 조각으로 두면 신조어나 오타가 전부 미등록어가 됩니다.

미등록어를 줄이려고 낱말보다 작은 조각을 씁니다. 이런 조각을 서브워드라고 부릅니다. 자주 나오는 낱말은 한 조각으로 둡니다. 드문 낱말은 여러 조각으로 나눕니다. 처음 보는 낱말도 아는 조각들로 쪼개면 번호로 바꿀 수 있습니다.

서브워드 어휘를 만드는 방법 가운데 하나가 바이트 쌍 인코딩입니다. 글자(또는 바이트) 하나하나에서 시작해 자주 붙어 나오는 쌍을 한 조각으로 합칩니다. 이 합치기를 정한 어휘 크기에 닿을 때까지 되풀이합니다.

어휘 크기를 정하는 일은 둘 사이에서 고르는 일입니다. 크게 잡을수록 같은 글이 적은 토큰으로 줄어듭니다. 대신 모델이 익혀야 할 번호가 늘어납니다. 번호마다 임베딩을 하나씩 익혀야 하니 모델이 커집니다.

어휘가 클 때 어휘가 작을 때
같은 글의 토큰 수 적다 많다
모델이 익힐 번호 많다 적다
드문 낱말 한 조각으로 들어갈 때가 많다 여러 조각으로 쪼개진다

모델이 한 번에 받을 수 있는 글 길이는 토큰 수로 셉니다. 그래서 토큰 수가 적으면 같은 한도 안에 더 긴 글을 넣을 수 있습니다.

검색과 언어 모델이 어휘를 다루는 방식

두 곳 모두 서로 다른 조각을 모은 목록을 어휘라고 부릅니다. 차이는 둘입니다. 목록을 언제 정하느냐와 없는 낱말을 만나면 어떻게 하느냐입니다.

검색 언어 모델
어휘에 드는 조각 분석기를 지난 낱말 서브워드 조각
정하는 때 문서가 들어올 때마다 자란다 학습 전에 정하고 고정한다
어휘를 담는 곳 역색인의 용어 사전 토크나이저의 번호 표
없는 낱말을 만나면 찾아도 0건이다 아는 조각으로 쪼개 받는다

마지막 줄이 두 쪽의 성격을 가장 크게 가릅니다. 검색은 어휘에 없는 낱말로는 문서를 못 찾습니다. 언어 모델은 처음 보는 낱말도 조각으로 쪼개 받습니다.

이름이 겹치는 어휘 분석

컴파일러에는 어휘 분석이라는 단계가 있습니다. 소스 코드를 예약어와 이름과 연산자 같은 토큰으로 쪼개는 단계입니다. 이 이름의 「어휘」는 「낱말 단위의」라는 꾸밈말입니다.

어휘 분석은 낱말 목록을 모으는 일이 아닙니다. 소스 코드 한 줄을 토큰의 줄로 바꿀 뿐입니다. 컴파일러가 알아보는 예약어 목록은 따로 정해져 있습니다.

관련 항목

어휘를 이루는 조각의 단위

토큰 · 서브워드 · 형태소 · n-gram · 어휘소 · 표제어

어휘를 만들기 전에 거치는 처리 단계

토큰화 · 분석기 · 형태소 분석 · 어간 추출 · 표제어 추출 · 불용어 · 유니코드 정규화 · 대소문자 정규화

검색 엔진이 어휘를 담고 쓰는 구조

역색인 · 용어 사전 · 딕셔너리 · 포스팅 리스트 · 문서 빈도 · 역문서 빈도 · TF-IDF · BM25

언어 모델이 어휘로 글을 받는 장치

토크나이저 · 바이트 쌍 인코딩 · WordPiece · SentencePiece · 특수 토큰 · 임베딩 · 컨텍스트 창 · 언어 모델

어휘가 모자라서 생기는 문제

미등록어 · 어휘 불일치 · 동의어 사전 · 질의 확장 · 시맨틱 검색

이 낱말을 쓰는 상위 분야

검색 · 자연어 처리 · 전문 검색 · 검색 엔진

이름이 겹치는 컴파일러 용어

어휘 분석 · 렉서 · 예약어 · 컴파일러

다른 이름: vocabulary · vocab · 어휘 집합 · 단어 집합 · 렉시콘 · lexicon