이 중 텍스트 분석은 머신러닝, 언어 이해, 통계 등을 활용해 모델을 수립하고 정보를 추출해 비즈니스 인텔리전스(Business Intelligence)나 예측 분석 등의 분석 작업을 주로 수행한다.
문서가 특정 분류 또는 카테고리에 속하는 것을 예측하는 기법을 통칭한다.
ex) 특정 신문기사 내용이 연애/정치/사회/문화 중 어떤 카테고리에 속하는지 자동으로 분류, 스팸메일 검출 프로그램 ->지도학습을 적용한다
텍스트에서 나타나는 감정/판단/믿음/의견/기분 등의 주관적인 요소를 분석하는 기법을 총칭한다. 소셜 미디어 감정분석, 영화나 제품에 대한 긍정 또는 리뷰, 여론조사 의견분석 등의 다양한 영역에서 활용된다. 지도학습 방법 뿐만 아니라 비지도 학습을 이용해 적용할 수 있다. -> 정확히 말하면 비지도 학습이라기보다 감성 딕셔너리가 있다. 주로 이걸 사용한다.

https://textom.co.kr/home/sub/view.php?id=report&no=34
텍스트 내에서 중요한 주제나 중심 사상을 추출하는 기법이다. 대표적으로 토픽모델링이 있다.

https://wikidocs.net/72820
비슷한 유형의 문서에 대해 군집화를 수행하는 기법을 말한다. 텍스트 분류를 비지도 학습으로 수행하는 방법의 일환으로 사용될 수 있다. 유사도 측정 역시 문서들 간의 유사도를 측정해 비슷한 문서끼리 모을 수 있는 방법이다.

텍스트 분석 머신러닝 수행 프로세스
text 문서 -> 데이터 사전 가공(벡터화 하기 쉽게 가공) 후 feature vectorization 수행 -> feature vectorization or word2vec -> feature 기반의 데이터셋 제공 -> ML 학습/예측/평가
파이썬 기반의 NLP, 텍스트 분석 패키지가 이미 존재한다. 이것들은 텍스트 분석에 필요한 많은 사전 작업을 해준다.
파이썬의 가장 대표적인 NLP패키지이다. 방대한 데이터 세트와 서브 모듈을 가지고 있으며 NLP의 거의 모든 영역을 커버하고 있다. 많은 NLP 패키지가 NLTK의 영향을 받아 작성되고 있다. 수행속도 측면에서 아쉬운 부분이 있어서 실제 대량의 데이터 기반에서는 제대로 활용되지 못하고 있다.
NLTK는 학술적인 패키지이다. 지금은 딥러닝쓰기 시작해서 많이 쓰이지는 않는데 예전에는 자주 사용했다. nltk는 패키지가 커서 따로 다운해야한다. 다운로드를 받으면 corpus(말뭉치)라는 패키지가 있다. 여기에는 굉장히 많은 연구용 말뭉치가 있다.
토픽 모델링 분야에서 가장 두각을 나타내는 패키지이다. 오래전부터 토픽모델링을 쉽게 구현할 수 있는 기능을 제공해 왔으며, Word2Vec 구현 등의 다양한 기능도 제공한다. SapCy와 함께 가장 많이 사용되는 NLP패키지이다.
뛰어난 수행 성능으로 최근 가장 주목을 받는 NLP 패키지이다. 많은 NLP 애플리케이션에서 SpaCy를 사용하는 사례가 늘고 있다.
feature vectorization 하기 전에 하는것들이다. 지금 소개하는 것 외에도 다양한 방법이 있지만 우선 간단한 방법부터 소개하려한다.
클렌징(Cleansing): 텍스트에서 분석에 오히려 방해가 되는 불필요한 문자, 기호 등을 사전에 제거하는 작업이다. 예를 들어 HTML, XML 태그나 특정 기호 등을 사전에 제거한다. 아래는 월간 데이콘에서 사용한 클렌징에 대한 코드이다.
import re
def preprocess_text(text):
# URL 제거
text = re.sub(r'http\S+|www\S+|https\S+', '', text, flags=re.MULTILINE)
# 해시태그 제거
text = re.sub(r'#\w+', '', text)
# 멘션 제거
text = re.sub(r'@\w+', '', text)
# 이모지 제거
text = text.encode('ascii', 'ignore').decode('ascii')
# 공백 및 특수문자 제거
text = re.sub(r'\s+', ' ', text).strip()
# 숫자 제거
text = re.sub(r'\d+', '', text)
return text.lower()
토큰화(Tokenization): 문장 토큰화, 단어 토큰화, n-gram
필터링/ 스톱워드 제거/철자 수정: 불필요한 단어나 분석에 큰 의미가 없는 단어 (a, the ,is will 등) 그리고 잘못된 철자 수정
from nltk import sent_tokenize
import nltk
nltk.download('punkt')
text_sample = """The sky is clear today, and the sunlight is warm.
The dog is playfully running around in the park.
I'm thinking about ordering chicken for dinner tonight."""
sentences = sent_tokenize(text=text_sample)
print(type(sentences),len(sentences))
print(sentences)
[output]
<class 'list'> 3
['The sky is clear today, and the sunlight is warm.', 'The dog is playfully running around in the park.', "I'm thinking about ordering chicken for dinner tonight."]
만약 한 문장에서 각 단어들을 토큰화하고 싶으면 text_sample에 한 문장만 적으면 된다.
Stemming/ Lemmatization: 어근(단어 원형)추출
Lemmatization이 stemming보다 정교하고 의미론적 기반에서 단어 원형을 찾아준다
lemmatize()를 사용하면 뒤에 품사를 꼭 넣어줘야한다. 실행시간도 lemma가 더 걸린다
#Stemming 사용예제
from nltk.stem import LancasterStemmer
stemmer = LancasterStemmer()
print(stemmer.stem('working'),stemmer.stem('works'),stemmer.stem('worked'))
print(stemmer.stem('happier'),stemmer.stem('happiest'))
#output
#work work work
#happy happiest
#Lemmatization 사용예제
from nltk.stem import WordNetLemmatizer
lemma = WordNetLemmatizer()
print(lemma.lemmatize('amusing','v'),lemma.lemmatize('amuses','v'),lemma.lemmatize('amused','v'))
print(lemma.lemmatize('happier','a'),lemma.lemmatize('happiest','a'))
#output
#amuse amuse amuse
#happy happy
N-gram
문장을 개별 단어 별로 하나씩 토큰화 할 경우 문맥적인 의미는 무시될 수 밖에 없다. 이러한 문제를 조금이라도 해결해보고자 도입된 것이 n-gram이다.
n-gram은 연속된 n개의 단어를 하나의 토큰화 단위로 분리해 내는 것이다. n개 단어 크기 윈도우를 만들어 문장의 처음부터 오른쪽으로 움직이면서 토큰화를 수행한다. 예를들어 ngrams를 2로 설정하면 같이 연속적으로 2개의 단어들을 순차적으로 이동하면서 단어들을 토큰화한다. 아래코드를 참고하자
from nltk import ngrams
sentence = "The sky is clear today, and the sunlight is warm."
words = word_tokenize(sentence)
all_ngrams = ngrams(words, 2)
ngrams = [ngram for ngram in all_ngrams]
print(ngrams)
output
[('The', 'sky'), ('sky', 'is'), ('is', 'clear'), ('clear', 'today'), ('today', ','), (',', 'and'), ('and', 'the'), ('the', 'sunlight'), ('sunlight', 'is'), ('is', 'warm'), ('warm', '.')]
ngrams(words,3)으로 하면 3개 단위로 나뉜다.
stopwords(불용어)
문장에서 자주 등장하지만 큰의미가 없는 단어를 의미한다. 예를들어 I, my, me, over, 조사, 접미사 같은 단어들은 자주 등장하지만 분석에 도움이 되지는 않는다. 따라서 이를 제거할 필요성이 있다. NLTK에서는 위와 같은 100여개 이상의 영어 단어들을 불용어로 패키지 내에서 미리 정의되어있고 직접 추가할 수도 있다.
import nltk
nltk.download('stopwords')
print(nltk.corpus.stopwords.words('english')[:40])
output
['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're", "you've", "you'll", "you'd", 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', "she's", 'her', 'hers', 'herself', 'it', "it's", 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this']
이를 이용해 for문으로 제거하면 된다.
이번 포스팅을 통해 텍스트 분석에 사용되는 NLP의 분야(텍스트분류, 감성분석, 텍스트 요약, 텍스트군집화 및 유사도 측정 등등)와 몇가지 전처리 방법에 대해 알았다. 이제 NLP에 대해 첫걸음을 내딛은 것이다!
다음 장에서는 텍스트 피처 벡터화 유형 중 하나인 BOW와 DTM이라고 불리는 문서 단어 행렬(Document Term Matrix)에 대해 알아보겠다.