문서의 각 단락이 어느 리비전에서 마지막으로 수정되었는지 확인할 수 있습니다. 왼쪽의 정보 칩을 통해 작성자와 수정 시점을 파악하세요.

토큰화 | |
정의 | 어휘 토큰화 (lexical tokenization)는 "어휘 분석기(lexer)" 프로그램에 의해 정의된 범주에 속하는 (의미론적 또는 구문론적으로) 의미 있는 어휘 토큰으로 텍스트를 변환하는 과정이다. |
관련 분야 | 자연어 처리 프로그래밍 언어 |
수행 프로그램 | 토크나이저 스캐너 |
주요 용도 | 컴파일러 프론트엔드 프리티프린터 린터 |
대형 언어 모델(LLM) 토큰화와의 차이점 | 어휘 토큰화는 일반적으로 어휘 문법을 기반으로 하는 반면, LLM 토크나이저는 일반적으로 확률 기반이다. LLM 토크나이저는 토큰을 숫자 값으로 변환하는 두 번째 단계를 수행한다. |
상세 정보 | |
자연어 처리에서의 범주 | 명사 동사 형용사 구두점 |
프로그래밍 언어에서의 범주 | 식별자 연산자 그룹화 기호 자료형 언어 키워드 |
어휘 분석 과정 | 스캐닝: 입력 문자열을 어휘소(구문 단위)로 분할하고 토큰 클래스로 분류 평가: 어휘소를 처리된 값으로 변환 |
어휘 분석기 생성기 | Lex 또는 파생 도구 |
관련 개념 | 어휘 문법 단어 경계 (언어학) 단어 경계 (컴퓨팅) |

토큰화는 텍스트를 의미 있는 단위인 토큰으로 분해하는 과정이다. 이는 자연어 처리와 프로그래밍 언어 처리의 기초가 되는 핵심적인 전처리 작업이다. 어휘 분석기 또는 토크나이저라고 불리는 프로그램이 이 작업을 수행하며, 입력된 원시 텍스트 문자열을 사전에 정의된 규칙에 따라 식별자, 키워드, 연산자, 리터럴 등의 토큰 클래스로 변환한다.
토큰화는 특히 컴파일러의 프론트엔드에서 첫 번째 단계를 구성한다. 소스 코드가 어휘 분석기에 의해 토큰 시퀀스로 변환된 후, 이는 구문 분석기로 전달되어 프로그램의 구조를 파악하는 데 사용된다. 이 과정은 프리티프린터나 린터와 같은 다른 소프트웨어 개발 도구에서도 활용된다.
최근 대형 언어 모델의 등장으로 토큰화에 대한 관심이 높아졌다. 그러나 전통적인 어휘 토큰화가 규칙 기반의 어휘 문법에 의존하는 반면, LLM의 토크나이저는 통계적 패턴을 학습하는 확률 기반 방식을 주로 사용한다는 점에서 차이가 있다. 또한 LLM 토크나이저는 토큰을 임베딩 등의 후속 처리를 위해 숫자 값으로 변환하는 추가 단계를 수행한다.
토큰화의 정확도는 이후의 모든 자연어 이해 작업의 성능에 직접적인 영향을 미친다. 따라서 단어 경계가 모호한 언어나 특수한 표현을 처리할 때는 보다 정교한 어휘 분석 기법이 요구된다.

어휘 토큰화는 텍스트나 소스 코드와 같은 입력 문자열을 의미 있는 기본 단위인 토큰으로 분해하는 과정이다. 이 과정은 어휘 분석기 또는 토크나이저라고 불리는 프로그램에 의해 수행되며, 컴파일러의 프론트엔드 처리에서 첫 번째 단계를 구성한다. 어휘 분석기는 입력을 스캔하여 어휘소라고 하는 문자 시퀀스를 식별하고, 이를 미리 정의된 토큰 클래스로 분류한다.
자연어 처리에서는 이러한 토큰 클래스에 명사, 동사, 형용사, 구두점 등이 포함된다. 프로그래밍 언어 처리에서는 식별자, 연산자, 키워드, 리터럴, 구분자 등이 주요 토큰 클래스에 해당한다. 예를 들어, x = 42 + y;라는 코드는 식별자(x), 할당 연산자(=), 숫자 리터럴(42), 덧셈 연산자(+), 식별자(y), 구분자(;)와 같은 토큰 시퀀스로 변환된다.
이 변환 과정은 일반적으로 정규 표현식이나 유한 상태 기계를 기반으로 한 규칙에 따라 이루어진다. 어휘 토큰화의 결과물인 토큰 스트림은 이후 구문 분석기에 전달되어 추상 구문 트리를 생성하는 등 더 높은 수준의 분석을 위한 기초 자료가 된다.
어휘 토큰화 과정에서 생성되는 기본 단위는 토큰과 어휘소이다. 이 두 개념은 밀접하게 연관되어 있지만 정확히 동일하지는 않다.
어휘소는 입력 텍스트에서 추출된 원본 문자 시퀀스 그 자체를 가리킨다. 예를 들어, 소스 코드에서 "price", "123", "+"와 같은 문자열 조각이 어휘소에 해당한다. 반면 토큰은 이러한 어휘소에 의미 있는 범주, 즉 토큰 클래스를 부여한 결과물이다. 토큰은 일반적으로 (토큰 이름, 토큰 값)의 쌍으로 표현되며, 토큰 값은 원본 어휘소가 될 수 있다. 따라서 "price"라는 어휘소는 (IDENTIFIER, "price")라는 토큰이 되고, "123"은 (LITERAL, "123")이라는 토큰이 된다.
토큰 클래스는 프로그래밍 언어에서는 식별자, 키워드, 연산자, 리터럴, 구분자 등으로 구분된다. 자연어 처리에서는 명사, 동사, 형용사, 구두점 등 품사 태그에 해당하는 범주를 사용한다. 어휘 분석기의 핵심 역할은 입력 문자열을 스캔하여 어휘소를 식별하고, 미리 정의된 규칙(예: 정규 표현식)에 따라 각 어휘소를 적절한 토큰 클래스로 분류하는 것이다.
이 과정에서 공백이나 주석과 같은 요소는 토큰으로 생성되지 않고 버려질 수 있다. 그러나 들여쓰기로 블록 구조를 정의하는 파이썬과 같은 언어에서는 공백이 의미를 가지며, 어휘 분석기가 INDENT나 DEDENT 같은 특수 토큰을 생성하기도 한다.
어휘 토큰화 과정에서 생성된 토큰들은 토큰 클래스라는 범주로 분류된다. 토큰 클래스는 프로그래밍 언어의 경우 식별자, 키워드, 연산자, 구분자, 리터럴 등으로 구분된다. 자연어 처리에서는 명사, 동사, 형용사, 구두점 등에 해당하는 품사가 토큰 클래스의 역할을 한다. 각 클래스는 언어의 어휘 문법에 의해 정의되며, 토크나이저는 입력된 문자열을 스캔하여 어휘소를 이 클래스들 중 하나로 할당한다.
예를 들어, C 언어 코드 result = sum + 10;을 토큰화하면 result와 sum은 식별자 클래스, =와 +는 연산자 클래스, 10은 리터럴 클래스, ;는 구분자 클래스에 속하는 토큰들이 생성된다. 토큰 클래스는 이후 구문 분석 단계에서 추상 구문 트리를 구성하는 기본 단위가 된다.
토큰 클래스 할당은 단순한 문자열 분류를 넘어선다. 예를 들어, 동일한 문자 시퀀스라도 문맥에 따라 다른 클래스가 될 수 있다. C 언어에서 int는 자료형 키워드로 사용될 때는 키워드 클래스이지만, 변수명으로 사용된다면 식별자 클래스가 된다. 이러한 모호성 해결은 때로 의미 분석 단계의 정보를 필요로 하기도 한다.

규칙 기반 토크나이저는 미리 정의된 규칙 집합에 따라 입력 텍스트를 토큰으로 분할하는 프로그램이다. 이는 어휘 분석기의 핵심 구성 요소로, 컴파일러 프론트엔드의 첫 번째 단계를 담당한다. 토크나이저는 스캐너라고도 불리며, 주로 정규 표현식이나 유한 상태 기계를 기반으로 구현된다. 이 방식은 프로그래밍 언어의 키워드, 연산자, 식별자, 리터럴 등을 명확히 구분할 수 있는 구조화된 텍스트 처리에 매우 효과적이다.
규칙 기반 토크나이저의 동작은 일반적으로 두 단계로 나뉜다. 첫 번째는 스캐닝 단계로, 입력 문자열을 어휘소라는 구문 단위로 분할하고 이를 미리 정의된 토큰 클래스(예: 식별자, 키워드, 리터럴)로 분류한다. 두 번째는 평가 단계로, 분류된 어휘소를 처리된 값으로 변환한다. 예를 들어, 숫자 리터럴 "123"을 문자열에서 정수 값으로 변환하는 작업이 이에 해당한다. 이 과정에서 공백이나 주석과 같은 불필요한 요소는 버려질 수 있다.
이러한 토크나이저는 어휘 분석기 생성기인 Lex나 flex 같은 도구를 사용하여 자동 생성되는 경우가 많다. 개발자는 정규 표현식으로 각 토큰의 패턴을 정의하고, 해당 패턴이 일치할 때 수행할 동작(예: 토큰 타입 반환)을 지정하면 된다. 이는 수작업으로 유한 상태 기계를 코딩하는 것보다 빠른 개발과 유지보수를 가능하게 한다. 그러나 매우 복잡한 문맥을 처리하거나 최고의 성능이 요구되는 경우에는 수동으로 최적화된 토크나이저를 작성하기도 한다.
규칙 기반 접근법의 주요 장점은 결정론적이고 예측 가능한 동작이다. 동일한 입력에 대해 항상 동일한 토큰 시퀀스를 출력한다. 그러나 이 방법은 자연어에서 흔히 발생하는 단어 경계 모호성(예: "New York-based"의 분할)이나 스크립티오 콘티누아로 작성된 언어를 처리하는 데는 한계가 있다. 이러한 복잡한 경우에는 규칙에 예외를 추가하거나, 확률 기반 모델을 활용하는 등 보다 정교한 접근이 필요할 수 있다.
전통적인 규칙 기반 토크나이저와 달리, 대형 언어 모델(LLM)에서 사용되는 토크나이저는 일반적으로 확률 기반 방식을 채택한다. 이 방식은 사전에 정의된 고정된 규칙이나 정규 표현식에 의존하기보다는, 대량의 텍스트 데이터를 학습하여 단어나 하위 단위(subword)가 토큰으로 분리될 확률을 기반으로 토큰화를 수행한다. 핵심 목표는 제한된 어휘(vocabulary) 크기 내에서 다양한 단어를 효율적으로 표현하면서도 희귀 단어나 신조어를 처리할 수 있는 유연성을 확보하는 것이다.
가장 대표적인 확률 기반 토크나이저 알고리즘으로는 BPE(Byte Pair Encoding)와 그 변형인 WordPiece, SentencePiece 등이 있다. BPE는 처음에 빈번하게 등장하는 바이트(또는 문자) 쌍을 하나의 토큰으로 병합하는 방식으로 어휘를 구축한다. WordPiece는 BPE와 유사하지만, 병합할 쌍을 선택할 때 빈도수 대신 가능도(likelihood)를 증가시키는 정도를 기준으로 삼는 차이가 있다. 이러한 하위 단어 토큰화(subword tokenization) 방식은 '학습한다'는 표현처럼, 주어진 말뭉치(corpus)에 대해 통계적 분석을 통해 최적의 토큰 집합(어휘 사전)을 생성하는 과정을 포함한다.
이렇게 생성된 토크나이저는 입력 텍스트를 토큰 시퀀스로 분해할 뿐만 아니라, 어휘 토큰화와의 주요 차이점인 두 번째 단계, 즉 각 토큰을 모델이 처리할 수 있는 숫자 값(토큰 ID)으로 변환하는 작업도 수행한다. 따라서 LLM 토크나이저의 출력은 규칙 기반 어휘 분석기의 출력(토큰 유형과 값)과 형태가 다르며, 주로 임베딩 레이어에 입력될 정수 인덱스의 시퀀스가 된다. 이 접근법은 오픈AI의 GPT 시리즈나 구글의 BERT 등 현대 대형 언어 모델의 핵심 전처리 구성 요소로 자리 잡았다.
어휘 분석기, 즉 렉서는 일반적으로 두 단계의 구조로 설계된다. 첫 번째 단계는 스캐너이며, 두 번째 단계는 평가자이다.
스캐너는 입력 문자열을 어휘소라고 하는 구문 단위로 분할하고 이를 토큰 클래스로 분류하는 역할을 한다. 이 과정은 주로 정규 표현식이나 유한 상태 기계를 기반으로 구현된다. 스캐너는 최대한 긴 문자열을 하나의 어휘소로 인식하는 최장 일치 규칙을 따르며, 입력 문자를 순차적으로 읽어 허용된 문자 집합에 속하지 않는 문자가 나타날 때까지 하나의 토큰으로 묶는다. 예를 들어, 프로그래밍 언어에서 123abc를 읽을 때, 숫자로 시작하면 스캐너는 숫자 토큰을 구성하기 위해 숫자가 아닌 문자 'a'가 나타날 때까지 '123'을 하나의 어휘소로 식별한다.
평가자는 스캐너가 식별한 어휘소의 실제 값을 처리하는 단계이다. 토큰은 토큰 이름(유형)과 선택적 토큰 값으로 구성된다. 평가자는 어휘소의 문자들을 검토하여 이 값을 생성한다. 예를 들어, 어휘소 "123"에 대해 평가자는 이를 정수 리터럴 토큰으로 분류하고, 그 값으로 숫자 123을 생성할 수 있다. 반면, 괄호나 키워드 같은 토큰은 값이 없을 수 있어 평가자는 토큰 이름만을 출력한다. 또한, 평가자는 공백이나 주석과 같이 이후 처리 단계에서 필요 없는 토큰을 버리는 역할도 수행할 수 있다.
이러한 두 단계 구조는 컴파일러의 프론트엔드에서 효율적으로 작동하도록 한다. 스캐너가 복잡한 값을 해석하는 부담을 덜고, 평가자가 의미 있는 토큰 값 생산에 집중하게 함으로써 모듈화와 유지보수성을 높인다. 많은 현대의 어휘 분석기는 Lex나 flex 같은 어휘 분석기 생성기를 사용해 이러한 구조의 코드를 자동으로 생성한다.

자연어 처리에서 토큰화는 텍스트 데이터를 처리 가능한 단위로 분해하는 핵심적인 전처리 과정이다. 이 과정은 원시 텍스트 문자열을 의미 있는 작은 조각인 토큰으로 나누며, 이 토큰들은 일반적으로 단어, 구두점, 숫자 등이 된다. 자연어 처리를 위한 토큰화는 프로그래밍 언어를 위한 어휘 분석과 기본 목적은 유사하지만, 자연어의 불규칙성과 복잡성으로 인해 고유한 도전 과제를 안고 있다.
자연어 토큰화의 주요 접근 방식은 규칙 기반 방법과 확률 기반 방법으로 나눌 수 있다. 규칙 기반 토크나이저는 공백이나 구두점과 같은 미리 정의된 구분자를 기준으로 텍스트를 분할하는 간단한 휴리스틱에 의존한다. 그러나 이러한 방법은 "New York-based"와 같은 하이픈 연결어나 "we're"와 같은 축약형을 처리하는 데 한계가 있다. 더 정교한 규칙 기반 시스템은 사전 조회나 정규 표현식을 활용하여 이러한 예외 사항을 처리한다. 반면, 현대의 대형 언어 모델은 주로 바이트 페어 인코딩과 같은 확률 기반 토크나이저를 사용한다. 이 방법은 말뭉치 통계를 학습하여 자주 함께 나타나는 문자 시퀀스를 하나의 토큰으로 결합하며, 어휘소의 경계를 사전에 고정적으로 정의하지 않는다는 점에서 규칙 기반 어휘 토큰화와 차별점을 가진다.
토큰화의 정확도는 이후의 품사 태깅, 구문 분석, 개체명 인식 등 모든 자연어 처리 작업의 성능에 직접적인 영향을 미친다. 특히 중국어, 태국어와 같이 단어 사이에 공백이 없는 언어나, 한국어와 같은 교착어에서는 단어 경계를 결정하는 것이 매우 복잡한 과제이다. 이러한 언어에서는 형태소 분석이 토큰화 과정과 밀접하게 연관되어 있으며, 보다 정교한 언어학적 지식이나 기계 학습 모델의 도움이 필요하다. 효과적인 토큰화는 텍스트의 의미 구조를 보존하면서도 정보 검색, 기계 번역, 감정 분석과 같은 다운스트림 응용 분야에 적합한 입력을 제공하는 것을 목표로 한다.
프로그래밍 언어 처리에서 토큰화는 컴파일러나 인터프리터의 프론트엔드에서 수행되는 첫 번째 핵심 단계이다. 소스 코드는 원시 문자들의 연속일 뿐이며, 어휘 분석기(Lexer) 또는 스캐너(Scanner)라 불리는 프로그램이 이 문자 스트림을 읽어 의미 있는 최소 단위인 토큰(Token)으로 분해한다. 이 과정을 통해 if, while 같은 키워드, total 같은 식별자, +, = 같은 연산자, 숫자 리터럴, 그리고 괄호나 세미콜론 같은 구분자들이 인식된다.
컴파일러의 어휘 분석기는 일반적으로 정규 표현식과 유한 상태 기계(FSM)를 기반으로 한 규칙 기반 방식을 사용한다. 이는 대형 언어 모델에서 사용되는 확률 기반 토크나이저와 구별되는 특징이다. 어휘 분석기는 토큰의 유형(토큰 클래스)과 그 값을 구문 분석기(파서)에 전달하며, 공백이나 주석과 같이 프로그램 실행에는 필요 없는 요소는 제거한다. 이 단계에서 올바르지 않은 토큰(예: 잘못된 문자로 시작하는 식별자)이 발견되면 구문 오류를 보고한다.
이러한 토큰화는 린터(Linter)나 코드 포맷터(프리티프린터)와 같은 다른 프로그래밍 언어 도구에서도 광범위하게 활용된다. 또한, 파이썬처럼 들여쓰기로 블록 구조를 정의하는 언어에서는 어휘 분석기가 들여쓰기 수준을 관리하며 INDENT, DEDENT 같은 특수 토큰을 생성하여 구문 분석을 보조하는 복잡한 역할도 수행한다.
대형 언어 모델은 어휘 토큰화와 밀접한 관련이 있지만, 몇 가지 중요한 차이점이 존재한다. 전통적인 어휘 분석기가 명확한 어휘 문법과 규칙에 기반하여 토큰을 분류한다면, 대형 언어 모델의 토크나이저는 주로 확률 기반 방식으로 작동한다. 이는 인공지능 모델이 방대한 텍스트 데이터를 학습하여 단어나 부분 단어의 출현 패턴과 통계적 관계를 바탕으로 토큰을 결정한다는 의미이다.
대형 언어 모델의 토큰화 과정에는 일반적으로 두 단계가 포함된다. 첫 번째는 입력 텍스트를 의미 있는 단위로 분할하는 토큰화 단계이며, 두 번째는 각 토큰을 모델이 처리할 수 있는 고유한 숫자 값(임베딩 또는 토큰 ID)으로 변환하는 단계이다. 이러한 숫자 표현은 신경망이 텍스트의 의미와 구조를 이해하고 생성하는 데 필수적이다. 이 접근법은 자연어 처리의 복잡성, 특히 단어 경계가 모호하거나 교착어와 같은 언어를 다룰 때 유연성을 제공한다.
대형 언어 모델의 성능은 사용된 토크나이저의 효율성과 정교함에 크게 의존한다. 토크나이저는 모델의 문맥 이해 길이, 계산 효율성, 그리고 희귀 단어나 신조어 처리 능력에 직접적인 영향을 미친다. 따라서 토큰화는 단순한 전처리 단계를 넘어, 머신러닝 모델 설계의 핵심 요소로 자리 잡았다.

어휘 분석기 생성기는 어휘 분석기를 자동으로 생성하는 도구이다. 이는 어휘 분석기를 수작업으로 코딩하는 대신, 사용자가 정의한 규칙이나 사양을 입력받아 해당 규칙에 맞는 어휘 분석기 소스 코드를 출력한다. 이러한 도구는 컴파일러나 인터프리터와 같은 언어 처리 도구를 개발할 때 널리 사용된다.
가장 대표적인 예는 유닉스 환경에서 개발된 Lex이다. Lex는 사용자가 정규 표현식과 해당 표현식이 매치되었을 때 수행할 C 언어 코드 조각을 정의한 스펙 파일을 입력받아, 어휘 분석기 역할을 하는 C 소스 코드를 생성한다. 이렇게 생성된 코드는 보통 Yacc나 Bison 같은 파서 생성기와 함께 사용되어 완전한 컴파일러 프론트엔드를 구성한다. Lex의 오픈 소스 재구현인 Flex도 널리 쓰인다.
어휘 분석기 생성기의 주요 장점은 개발 속도와 유지보수성이다. 언어의 어휘 규칙이 변경되면, 생성기의 입력 스펙 파일만 수정하면 새로운 어휘 분석기를 쉽게 재생성할 수 있다. 또한, 정규 표현식을 사용한 선언적 방식의 스펙은 수동으로 상태 전이를 코딩하는 것보다 직관적이고 오류 가능성이 낮다. 그러나 생성된 코드의 성능이나 유연성이 모든 상황에 최적이지는 않을 수 있어, 고성능이 요구되거나 특수한 처리가 필요한 경우에는 여전히 수작업으로 어휘 분석기를 구현하기도 한다.
어휘 분석기를 자동 생성 도구 없이 직접 프로그래밍하는 것을 수작업 구현이라고 한다. 이는 일반적으로 특정 프로그래밍 언어의 문법을 위한 간단한 어휘 분석기를 만들거나, 성능 최적화가 극도로 중요한 상황, 또는 어휘 분석기 생성기가 제공하지 않는 특수한 기능이 필요할 때 사용된다. 수작업 구현의 핵심은 입력 문자열을 순차적으로 읽어 토큰을 식별하는 알고리즘을 직접 설계하고 코딩하는 것이다.
가장 일반적인 수작업 구현 방식은 유한 상태 기계를 코드로 표현하는 것이다. 개발자는 각 토큰 클래스(예: 식별자, 숫자 리터럴, 연산자)를 인식하는 상태 전이 로직을 직접 작성한다. 예를 들어, 식별자를 인식하기 위해 첫 문자가 알파벳 또는 밑줄인지 확인한 후, 알파벳이나 숫자가 아닌 문자가 나올 때까지 문자를 계속 읽는 루프를 구현할 수 있다. 이 방식은 정규 표현식을 사용하는 자동 생성 도구에 비해 더 세밀한 제어와 최적화가 가능하다는 장점이 있다.
수작업 구현은 특히 토큰의 종류가 많지 않거나 문법이 단순한 도메인 특화 언어를 처리할 때 실용적이다. 또한, Go 언어의 세미콜론 삽입이나 파이썬의 오프사이드 룰처럼 표준 어휘 분석기 생성기로 처리하기 어려운 복잡한 구문 구조를 직접 처리해야 할 때도 선택된다. 그러나 언어 사양이 자주 변경되거나 토큰 규칙이 복잡해지면 유지보수 비용이 자동 생성 방식에 비해 높아질 수 있다.

단어 경계 문제는 어휘 토큰화 과정에서 가장 기본적이면서도 복잡한 장애물 중 하나이다. 토크나이저는 입력 텍스트를 의미 있는 단위, 즉 토큰으로 분할해야 하는데, 이때 '단어'라는 개념을 명확히 정의하고 그 경계를 식별하는 것이 간단하지 않다. 특히 공백이나 구두점과 같은 명확한 분리자를 사용하는 언어(예: 영어나 대부분의 프로그래밍 언어)에서는 비교적 단순한 규칙(예: 공백에서 분할)으로도 토큰화가 가능하다. 그러나 이러한 접근 방식은 하이픈으로 연결된 복합어(예: 'New York-based'), 축약형, 이모티콘, URL과 같은 구조에서는 제대로 작동하지 않을 수 있다.
더 큰 도전은 단어 사이에 공백을 사용하지 않는 언어에서 발생한다. 중국어나 태국어와 같이 스크립티오 콘티누아 방식으로 작성되는 언어는 텍스트에 명시적인 단어 경계가 존재하지 않는다. 또한, 교착어인 한국어의 경우 어간에 다양한 조사나 어미가 결합되어 하나의 띄어쓰기 단위를 형성하므로, 이를 더 작은 의미 단위로 분리하는 작업은 추가적인 형태소 분석이 필요하여 토큰화를 복잡하게 만든다. 이러한 문제를 해결하기 위해 더 정교한 휴리스틱 방법, 사전 조회, 또는 언어 모델을 활용한 접근 방식이 연구되고 개발된다.
일반적인 어휘 분석은 문맥 자유 문법에 기반하여 설계된다. 이는 토큰을 식별하는 데 현재 처리 중인 문자 시퀀스 외의 다른 정보가 필요하지 않음을 의미한다. 이러한 방식은 구현을 단순하고 효율적으로 만든다. 그러나 특정 언어나 요구사항에서는 토큰의 의미나 범주를 결정하기 위해 주변 문맥 정보를 참조해야 하는 경우가 있다. 이를 문맥 의존 어휘 분석이라고 한다.
대표적인 예로 파이썬 프로그래밍 언어의 들여쓰기 규칙(오프사이드 룰)이 있다. 파이썬에서는 들여쓰기 깊이가 블록 구조를 정의한다. 어휘 분석기는 이전 줄의 들여쓰기 수준을 기억하는 상태를 유지해야 하며, 들여쓰기가 증가하면 INDENT 토큰을, 감소하면 DEDENT 토큰을 생성한다. 이는 중괄호를 사용하는 언어의 { 및 } 토큰에 해당한다. 토큰 생성 여부가 이전 문맥(들여쓰기 스택)에 의존하므로, 이는 문맥 의존적인 처리에 해당한다.
또 다른 사례는 C 언어의 typedef 이름 문제이다. C 언어에서 typedef로 정의된 식별자와 일반 변수명은 어휘 형태가 동일하지만, 구문 분석에서 서로 다른 역할을 한다. 따라서 어휘 분석기 단계에서 이 문자 시퀀스가 어떤 토큰 클래스에 속하는지 결정할 수 없다. 이 경우, 어휘 분석기는 심볼 테이블과 같은 의미 분석기의 정보를 참조하여 토큰 종류를 결정해야 한다. 이는 어휘 분석 단계가 이후의 의미 분석 단계에 의존하게 만드는 복잡한 상호작용을 요구한다.
이러한 문맥 의존성은 어휘 분석기의 설계를 복잡하게 만들지만, 대부분의 경우 그 복잡성을 어휘 분석기 내부에 캡슐화하여 구문 분석기나 이후 단계에는 투명하게 만드는 것을 목표로 한다.
어휘 분석기의 성능은 전체 컴파일러나 언어 처리 도구의 효율성에 직접적인 영향을 미친다. 어휘 분석은 입력 소스 코드를 처음으로 읽고 처리하는 단계이므로, 이 과정이 빠르고 효율적이어야 이후의 구문 분석 및 의미 분석 단계가 원활하게 진행될 수 있다. 성능 최적화는 특히 대규모 코드베이스를 처리하거나 실시간으로 코드를 분석해야 하는 통합 개발 환경이나 린터 같은 도구에서 중요하게 고려된다.
성능을 높이는 일반적인 방법으로는 정규 표현식을 효율적으로 컴파일한 유한 상태 기계를 사용하는 것이 있다. 전통적인 lex나 flex 같은 생성기는 테이블 기반 접근 방식을 사용하지만, re2c와 같은 더 최신의 도구는 직접 코딩된 접근 방식을 생성하여 goto 문을 통해 상태를 전환함으로써 2~3배 빠른 성능을 낼 수 있다. 수작업으로 어휘 분석기를 작성하는 것도 가능하지만, 현대의 생성기 도구가 생성하는 최적화된 코드의 성능을 넘어서기는 어렵다.
성능에 영향을 미치는 또 다른 요소는 토큰의 종류와 어휘소를 식별하는 규칙의 복잡성이다. 간단한 토큰은 빠르게 식별할 수 있지만, 문맥 의존 어휘 분석이 필요한 경우(예: C 언어의 typedef 이름 처리)나 오프사이드 룰을 구현해야 하는 경우에는 추가적인 상태 관리와 메모리가 필요하여 성능이 저하될 수 있다. 따라서 언어 설계 시 어휘 문법을 단순하고 문맥 자유 문법에 가깝게 유지하는 것이 성능 향상에 도움이 된다.

