

text 전처리는 NLP 작업에서 가장 먼저 수행되는 중요한 단계.
text 전처리를 통해 데이터를 분석 및 처리하기 쉬운 형태로 바꿀 수 있음
이때 핵심적으로 사용되는 도구가 Regular Expression(정규 표현식)
정규 표현식은 특정 텍스트 패턴을 정의하는 형식 언어이다. 이를 통해 방대한 텍스트 데이터에서 특정한 패턴을 쉽게 추출하거나 변경할 수 있다.
단어 "happy"와 관련된 다양한 형태("Happy", "happily", "happiness", "hapy") 등
happy 가 쓰일 수 있는 모든 경우 생각할 필요가.. 있음..

논리합, 범위, 부정 → 3개의 컴포넌트를 이용
[ ] 안에 문자 중 하나를 선택 (논리적 OR)[a-z])[^a-z])5개 모두 컴포넌트라고 보면 됨

가장 작은 단위는 한 캐릭터,
캐릭터 별로 매칭을 한다… 캐릭터가 한 유닛
(string 이 아니라 character base)

캐럿이 괄호 안에 있는지(negation),, 그냥 맨 앞에 나왔는지(앵커),, 아니면 둘 다 아닐때(문자그대로 해석)...

h 나 H 하나가 있으면 되는..

* : 0번혹은 그 이상의 information 을 담고 있는 것
. : wildcard 어떤 문자라도
+ : 무조건 한 번 이상의
? : 0 번 혹은 1번 둘 중 하나
{m} 이상
{m, n} m 이상 n 이하
(abc) : 캐릭터 그룹핑

happy* : 0번 또는 그 이상
.appy : 앞에 붙은 건 아무것도 상관 없어
happy+ : 한번또는 그 이상
happy? : 0 Or 1

Happy가 맨 앞인 경우만.
.$ : 뒤에만


In iterating through possible solutions to avoid failures, we were trying to
fix two types of errors:
- Matching strings that we should not have matched (there, then, other)
- False Positive (Type I)
- 잡으면 안된는데 잡은 경우
- Not matching things that we should have matched (The)
- False Negative (Type II)
- 잡아야 했는데 잡지 못한 것

accuracy
precision -> FP 를 직접적으로 분석할 수 있는 지표 -> precision 을 높이기
coverage
recall -> FN을 낮추기 -> recall 을 낮추기
f1 score가 제일 중요

Finite State Automata(FSA)는 정규 언어(Regular Language)를 표현하기 위한 유한 상태 기계이다. 정규 표현식으로 표현 가능한 모든 패턴은 FSA로 표현할 수 있으며, 다양한 NLP 응용 분야에서 활용된다.
정규식,, 단순한 문법표현 -> 계산 모델로 만들어서 -> 컴퓨터가 이해하기 쉽도록 짜는 알고리즘이 필요

FSA는 일련의 상태(state)와 상태 간 전이(transition)를 통해 입력 문자열이 특정 패턴과 일치하는지 판단한다.
계산 모델인데 가장 큰 특징이 regular language 를 만들어내는 것.
- FSA를 정의하는 기본 요소
- 상태(State) 집합
- 입력 문자 집합 (알파벳)
- 시작 상태
- 최종 상태(수락 상태)
- 상태 간의 전이(Transition)
이 계산 모델을 가지고 알고리즘을 짜는 것

정규식을 표현하는 오토마타 -> 계산모델을 알고리즘화 -> 모델 만들기

패턴매칭에 사용할 수 있음

FSA는 입력 문자열의 각 문자를 순서대로 읽으면서 현재 상태에서 가능한 다음 상태로 이동한다. 입력 문자열이 끝났을 때 현재 상태가 수락 상태(final state)라면 그 문자열은 해당 FSA가 정의한 언어에 속한다고 본다.

5개의 state
진한 동그라미 q4: final state
q0: start state
b, a, a, !: 조건
FSA만 주어져도 어떤 regex를 가지고 만든거지?

-> baa까지는 괜찮음 그러나 아직 final state 아님..

-> baab 부터 state 조건을 만족 못 함...
-> 결국 reject
기호로 나타낼 수 있음
상태 전이 테이블은 FSA의 동작을 쉽게 구현하고 확인하기 위해 사용된다. 테이블 형태로 상태 간의 전이를 표현하여 입력 문자열 처리 과정을 효율적으로 수행할 수 있다.

테이블 형태로 정리
-> 모델링 하는 과정이 수월
-> 구체적인 구현 방법

테이블로 관리하면 인지가 쉽다..

테이블 값을 매핑해서 다음 state, transition 값을 가져올 수 있음
input index를 옮겨 가면서... 구현 가능...
결정적 FSA는 각 상태에서 다음 상태로의 전이가 항상 유일하게 결정된다.
비결정적 FSA는 특정 상태에서 여러 상태로의 전이가 가능한 경우를 말한다.
비결정적 FSA도 결정적 FSA로 변환하여 처리 가능하지만, 경우에 따라 복잡성이 증가할 수 있다.
차이점은 한가지 transition 에 대해서 여러 state (path) 로 갈 수 있는지 없는지로 구분
결정적이냐, 비결정적이냐..

둘다 non-deterministic

non deterministic 은 deterministic 보다 searching 하는데 더 높은 logical flow.. 비용이 많이 듦..
쉽게하는 방법?
- 다 결정성으로 바꿀 수 있음
- 모든 non deterministic 은 deterministic으로 변형 가능
- 바로 계산하지 말고, deterministic으로 바꾼다음 적용
- 아니면 그래프 적용 (DFS, BFS) 으로 계산

탐색을 용이하게 하기 위해서 반드시 가정해야 하는 부분
만약에 fsa 가 소화할 수 있는 정규언어라면 한가지 path 는 무조건 fsa에 존재해야한다..
FSA가 어떤 언어가 accept 이 된다면 accept이 안되는 단어도 있음
이런 가정을 하고 만들고 탐색해야 데드락 같은 에러가 생기지 않음

accept인지 reject 인지 아닌지 판별할 때 유의할 점

Finite State Transducer(FST)는 입력 문자 집합을 출력 문자 집합으로 매핑하는 유한 상태 기계이다. FST는 입력과 출력이 있는 FSA의 확장된 형태로, NLP에서 형태소 분석 등에 널리 쓰인다.
transition 에서 확장이 됨
어떤 문자를 generate하고 매칭하는데 집중했는데
FST는 두개의 input(sequence)이 있는데 이 두개가 매핑이 되는지를 확인하는...
문자열 매핑에 쓰이는 모델
FST는 다음과 같은 구성 요소를 갖는다.

aa를 줬을 대 b가 매핑될 수 있어?
b가 a와 매핑이 돼? 그러면 이동 q1에서 조건 확인..
aa:b
입력으로 연속된 두 개의 'a' ('aa')를 받으면 출력으로 'b'를 내보내고 상태는 다시 q0에 머무른다.
b:a
입력 'b'를 받으면 출력 'a'를 내보내며, 상태는 q1으로 전이
a:ba
입력 'a'를 받으면 출력 'ba'를 내보내고 상태는 q1으로 전이

두개의 string 매핑
-> final input alphabet 과 output alphabet 이 다를 수 있음

- Composition:
- 두개의 finite Transducer 를 합칠 수 있음
- Inversion:
- FST를 역으로 변환하여 입력과 출력을 바꿀 수 있다.
- 예를 들어 영어-한국어 번역기를 FST로 구현했다면,
이를 역으로 변환하여 한국어-영어 번역기도 쉽게 구현 가능하다.

다른점?
FSA에서는 non -> deterministic인데
FST에서는 모든 non deterministic을 deterministi으로의 변환할 수 없음..

형태소 분석(Morphological Parsing)은 단어를 형태소(morpheme) 단위로 나누는 작업
FST는 형태소 분석에서 어근(stem)과 접사(affix)를 효과적으로 분석하여
NLP 시스템이 단어의 의미와 문법적 특징을 올바르게 파악할 수 있도록 도와준다.
FST 기반의 형태소 분석 시스템은 입력된 단어를 정확한 형태소와 문법적 특징으로 매핑할 수 있다. 예를 들어, "cats"를 입력하면 "cat +N +PL"이라는 형태소 분석 결과를 출력할 수 있다.

신조어 이해에 유용
Instagrammable -> instagram + able
느좋... -> 느낌 + 좋은...
한국어는 형태소 분석이 필수적...
llm의 token level 로 많이 분석함

원하는 FST 에서의 output -> 형태소 분석한 결과값
input 에 대한 결과를 알고 싶은 것

동사에 대해서 형태소 분석을 하는 trasducer..
reg-verb-stem -> past participant -> q3
q0(merging) -> reg-verb-stem -> q2 -> present participant(~ing) -> q3
merging 이 merge라는 걸 알아야 하나?

명사에 대한 형태소 분석기
정의되어있는 finite transducer가 있고
이것 통해서 cats 가 복수형이라는 결과를 알아내는 것
foxex -> f:f 변환, o:o 변환 x:x 변환
fox + ^s#... (PL)
x 다음에 복수형이 es로 붙었는데,, ^s# 로 오면 e는 어디로?
es 가 결국 s의 의미...?
모든 state 에서 rule-based로 미리 규칙을 지정해놓고 진행할 수도 있음
