🚀 What I Studied/NLP

[NLP] 텍스트 처리

박낑깡이 2022. 10. 24. 03:45

본격적인 텍스트 처리를 하기에 앞서 무엇을 단어로써 셀 것인지를 결정해야 한다.

 

🎯 Corpus

A compute-readable collection of text or speech
즉, Corpus컴퓨터가 읽을 수 있는 텍스트나 연설의 말뭉치를 의미한다.

 

예시 1) 문서

Brown corpusBrown 대학 (Kucera and Francis) 에서 1963-1964 동안 수집한 신문소설논픽션논문 등 다양한 장르의 영어 문서를 500건으로부터 추출한 a million-word collection

 

He stepped out into the hall, was delighted to encounter a water brother.

- 문장 부호 제외 : 13단어, 문장 부호 포함 : 15단어

- 문장의 부호들은 문맥을 이어주고, 문장 혹은 단어들을 나누는 기준선이 되기도 하며, 문장 자체의 의미를 바꿔버리기도 한다.

그렇기 때문에 품사(POS : Part of Speech)태깅, parsing, 또는 연설 분석 과정에서 떄로 문장 부호들을 단어로 처리하기도 한다.

 

vs

 

예시 2)  구어

Switchvoard corpus : 1990 년대에 수집된 (by Godfrey et al.) 미국 전화 대화 내용

- 평균 6분 가량의 2430 대화

- 총 240 시간의 음성 + 300 만개의 단어

- 구어 (spoken language)는 문장 부호가 없다.

 

 

I do uh main- mainly business data processing

- 문장(sentences)라고도 하고, 발화 (utterance)라고도 한다.

- 발화 (utterance)의 특징

  • Two disfluencies

1.  Fragment

위의 문장을 예시로 살펴보면, 반복하는 행위에서 나온 'main-' 과 같이 완결되지 않은 단어(broken-off 단어)를 Fragment라고 부른다.

 

2. Filler (Filled pause)

'uh' 또는 'um' 과 같이 무의미한 채움, 즉 문장 자체의 의미와 무관한 것들을 의미한다.

하지만, 'uh'나 'um'과 같은 disfluency 는 연설 분석을 하는데 있어서 단어들을 예측하는데 실질적인 도움이 되기도 한다.

왜냐하면 이러한 소리는 보통 연설자가 주장이나 자신의 생각을 재시작하려는 신호로 쓰이기 때문이다.

 

 

 

🎯 Words

- 단어의 처리는 기본적으로 단어의 같음과 다름으로 구분된다.

  • Capitalization

ex) They 와 they는 같은 단어일까?

- 문장의 첫 부분에 등장하는 단어와 중간 부분에 등장하는 단어의 발음 차이는 없을까?

 

  • catd와 cats는 같은 기본형(lemma)을 공유

- lemma는 동일한 줄기(stem)와 동일한 품사(POS), 동일한 의미를 공유하는 lexical form의 집합을 의미

 

  •  cat와 cats는 다른 어형 (wordform)으로 표현

- 어형 (굴절형)은 어형이 굴절된 (inflected) 혹은 비롯된 (derived) 형태

 

- 영어의 경우 wordform을 고려하는 것만으로도 충분하지만, 한국어, 아랍어와 같이 형태적으로 복잡한 언어의 경우 lemmatization이 단순하지 않으므로 wordform만 고려해서는 안된다.

 

 

🎯 Corpus 내의 단어

  • Types

- Corpus 내의 distinct words (elements)의 개수

- Vocabulary에 담겨있는 구별되는 단어들

- Vocabulary V가 주어졌을 때, types의 크기는 |V| 

- Herdan's Law

이 때, N은 token 의 개수

 

  • Tokens

- Corpus 내의 word(= instance)의 개수

 

 

 

🎯 Text normalization

* Text에 대한 자연어 처리를 하기 전 모든 text들은 normalize(정규화) 되어야 한다.

 

이는 보통 3가지의 단계로 이루어진다.

1. Segmenting / Tokenizing words from running text

: 텍스트로부터 단어들을 토큰화, 구분화

 

2. Normalizing word formats

: 단어들의 형태 모두 일반화

 

3. Segmenting sentences in running text

: 텍스트에서 문장들을 모두 구분화

 

- 문장 (sentence) : 텍스트 처리의 기본 정보 단위

- 토큰 (token) : 문장에 등장하는 단어를 자른 (segmenting) 후, 일부 정제하여 만든 처리의 최소 단위

즉, 의미를 가지는 최소 단위로 형태소(morpheme)가 의미를 가지는 최소 단위로 볼 수 있다.

 

 

 

🎯 Word tokenization

* 텍스트로부터 단어를 잘라내는 작업

 

1) 띄어쓰기 단위로 토큰을 구분

예외 : 여러 단어로 된 단어가 단일 의미를 지니는 경우

ex) New York

-> 따라서 Tokenization은 name, data, organization을 검사하는 Named entity recognition(NER)과 밀접하게 관계

 

2) 쉼표 / 따옴표 / 마침표 / 느낌표 등 punctuation 을 토큰의 구분자 (delimiter)로 사용

예외 1. 문장 부호가 의미를 지니는 경우

ex) m.p.h, Ph.D, AT&T, cap'n

 

예외 2. 특수 기호와 함께 의미를 지니는 경우

ex) $45.55, 01/02/22

 

예외 3. 접어(clitic)와 함께 의미를 지니는 경우

ex) what're, I'homme 

 

 

  • Penn Treebank Tokenization

- word tokenization의 표준 중 하나

- Treebank 라는 유명 corpora를 사용 (from Linguistic Data Consortium)

- Regular expressions에 기반한 deterministic algorithm을 컴파일한 Finite state automata로 Natural Language Toolkit(NLTK)에 구현된다.

- 이렇게 분류된 token들은 normalized를 거쳐 같은 의미를 가진 다양한 형태의 단어들이 하나의 정규화된 형태를 가지게 된다.

ex) US query -> USA query도 검색 가능

 

 

Word Tokenization issues

  • 다양한 variation (혹은 예외) 처리

- 소유격 vs 인용 vs 접어

ex) The book's cover vs 'The other class' vs they're 

 

  • 언어의 문제

1) 중국어의 segmentation

- 띄어쓰기로 의미 구분 하지 않음

- 실용적으로, 중국어는 단어가 아닌 문자(character)가 적절한 의미 수준을 반영

2) 일본어와 태국어

- 문자 하나가 의미를 반영하기에 너무 작은 단위이므로 word segmentation 고려

 

3) 프랑스어

L ? L’ ? Le ?

ex) l’ensemble 과 un ensemble 이 매치되도록 하는 과정이 필요

 

4) 독일어

- 단일 단어를 분해하는 과정이 필요

ex) Lebensversicherungsgesellschaftsangestellter : 생명 보험 회사 직원

 

이처럼 언어에 따라, 언어의 활용에 따라 token을 정규 단위화 하기는 어렵다.

-> token을 단어나 문장 단위로 정의하지 않고, token의 크기를 자동으로 결정하도록 하는 기법

 

  • Subword tokens

: 하나의 단어는 작은 단위의 의미있는 여러 subword(+가방) 조합으로 구성되는 경우가 많으므로, 하나의 단어를 여러 subword 분리해서 단어를 인코딩/임베딩 하겠다는 의도의 전처리 작업.

ex) unlikeliest -> {un-, likely, -est}

 

  • words compounds

ex) New York Times -> {New York Times}

 

 

BPE (Byte-Pair Encoding) : 서브월드 분리 알고리즘 = 기존의 단어를 분리

- Text compression 분야의 방법로으로부터 기인

- 문자의 빈발 쌍 (frequent pairs)을 반복적으로 합병하는 알고리즘

- End-of-word 를 표현하는 부호 : _

- 가장 빈번한 부호 쌈 ('A', 'B')을 찾아서 하나의 부호호 병합 ('AB')

 

예시 1)

문자열 aaabdaaabac 가 주어졌을 때 BPE 과정

aaabdaaabac

1. 가장 많이 등장하는 문자 쌍인 'aa'를 Z로 치환

ZabdZabac
Z=aa

2.  치환한 문자열에서 가장 많이 등장하고 있는 바이트의 쌍 'ab'를 'Y'로 치환

ZYdZYac
Y=ab
Z=aa

3. 가장 많이 등장하고 있는 바이트의 쌍 'ZY'를 'X'로 치환

XdXac
X=ZY
Y=ab
Z=aa

4. 더 이상 병합할 바이트의 쌍은 없으므로 BPE는 위의 결과를 최종 결과로 하여 종료

 

 

예시 2) 

dictionary 가 주어졌을 때 BPE 과정

# dictionary
l o w  : 5
l o w e r  : 2
n e w e s t : 6
w i d e s t : 3
dictionary를 참고한 초기 단어 집합 (vocabulary)
# vocabulary
l, o, w, e, r, n, w, s, t, i, d

- BPE의 특징은 알고리즘의 동작을 몇 회 반복(iteration)할 것인지를 사용자가 결정

- 즉, 10회 수행을 가정하면 가장 빈도수가 높은 유니그램의 쌍을 하나의 유니그램으로 통합하는 과정을 총 10회 반복

 

ex)

1회 : 위의 딕셔너리에서 빈도수 9로 가장 높은 (e,s)의 쌍을 es로 통합

# dictionary update!
l o w : 5,
l o w e r : 2,
n e w es t : 6,
w i d es t : 3
# vocabulary update!
l, o, w, e, r, n, w, s, t, i, d, es

2회 : 빈도수가 9로 가장 높은 (es, t)의 쌍을 est로 통합

# dictionary update!
l o w : 5,
l o w e r : 2,
n e w est : 6,
w i d est : 3
# vocabulary update!
l, o, w, e, r, n, w, s, t, i, d, es, est

결과

# dictionary update!
low : 5,
low e r : 2,
newest : 6,
widest : 3
# vocabulary update!

l, o, w, e, r, n, w, s, t, i, d, es, est, lo, low, ne, new, newest, wi, wid, widest

ex)

string : intention
dictionary : ["in", "tent", "intent", "##tent", "##tention", "##tion", "#ion" ]
result : ["intent", "##ion"]

 

 

🎯 Word normalization

- 단어나 토큰을 표준화된 단일형으로 만드는 것

- 정보 검색 등 분야에서는 정규화된 형태의 단어가 필요 : 단어/단어 간의 매치 -> 질의어 / 인덱스 간의 매치

 

  • Case folding

- 소문자로 단일화

/소문자를 구분하여 의미를 파악하는 것이 중요한 분야 (sentiment analysis, information extraction, machine translation 에서는 case folding 을 하지 않는 경우가 많다.

 

  • Lemmatization

- 활용 형태의 표면적 차이를 가지는 단어들에 대해서 같은 어근(root)을 가지는지에 대해 판단하는 작업

ex) am, are, is 는 같은 lemma를 가진다. -> be

He is reading detective stories -> He be read detective story

 

- lemmatization은 단어의 형태학적 분석(morphological parsing)과 밀접한 관계를 가지고 있다.

- 즉, lemmatization은 형태소 (morphemes) 라는 의미를 지니는 최소단위로부터 단어 (word) 를 구축해 가는 과정

- morpheme은 두가지 class로 구분된다.

- stems : 단어의 중심, morpheme으로써 단어의 중요 의미를 전달

- affixes : 다양한 형태로써 추가적 의미를 더해주는 역할

 

 

  • Stemming

- 단어의 접사를 떼어내는 간단한 형태소 분석

- 유도되거나 반영된 단어를 중심어의 형태로 간소화

ex) "fishing","fished","fish",and"fisher"“fish”

 

 

 

🎯Sentence Segmentation

- 텍스트를 문장의 단위로 분리 (주로 규칙 기반 like decision tress)

- 구두점 (punctuation)으로 구분

- 빈번하게 사용되는 약어 사전을 구축 (hand = built or machine-learned) 사후 처리함

 

 

 🎯 Minimum edit distance

- 가능한 모든 편집의 순차 적용 (경로)으로부터 최단 경로를 찾는 문제

- Edit distance는 문자열의 유사성을 알려주는 하나의 척도이다. 일반적으로 두 문자열 사이의 minimum edit distance는 하나의 문자열에서 다른 문자열로 변환되기 위한 필요한 operation의 최소 개수를 의미

- 편집 연산의 종류 : 삽입 (insertion), 삭제 (deletion), 대체 (substitution)

ex) Intention과 execution 간의 minimum edit distance

d : deletion
s : substitution
i : insertion
* : alignment를 위한 공백

- INTENTION이라는 단어 EXECUTION이라는 단어로 변환되기 위해서는 1개의 Deletion, 1개의 Insertion, 그리고 3개의 Substitution이 필요하다.

Substitution은 변환시키려는 문자열을 지우고 그리고 입력해야하므로 총 2개의 operation으로 취급한다.

즉 총 8개 (1 + 1 + 3*2)의 operation이 필요하므로 여기서 Levenshtein distance는 8이 된다.

 

 

Minimum edit distance algorithm

- Dynamic programming 기반의 알고리즘

- 다양한 작은 문제를 해결하는 해를 활용하여 (combining) 큰 문제의 해를 도출

= Bottom-up solution

ex) intention 에서 execution까지의 경로가 최적(부분)경로라면, 최종해는 이 경로를 포함해야만 최적해가 만족

- Tabular computation 이라고도 함

 

 

🎯 Distance measuring in language

- Edit distance는 언어 의미에 대한 고려를 배제한 문자열 데이터 처리

- 문자(text) 데이터와 언어(language) 데이터를 비교한다.

ex)

p(“Today is Wednesday”) = 0.001

p(“Today Wednesday is”) = 0.0000000000001

 

 

 

🎯텍스트 처리 전체 과정

text normalization -> word tokenization -> word normalization -> Sentence segmentation -> Minimunm edit distance

-> Distance measuring in language