본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

Personal/Book

파이썬 텍스트 마이닝 완벽 가이드 1부 텍스트 마이닝 기초

테스트마이닝

텍스트에서 고품질 정보를 추출하는 과정 

 

고품질 정보

패턴이나 트랜드를 통해 얻어지는것. 

 

마티 허스트가 2003년에 쓴 에세이 What is text mining? 에서는 텍스트 마이닝을 데이터 마이닝의 한 분야로 소개하며 데이터 마이닝을 대규모 데이터베이스에서 흥미로운 패턴을 찾는 방법론으로 설명한다. 물건을 구매하는 패턴, 패턴에 따라 물건을 진열하거나 쿠폰을 제시하는 사례를 든다. 텍스트 마이닝은 텍스트에 숨어있는 패턴을 이용해 사건을 예측하는 것으로 정리할 수있다. 이 패턴은 통계적 패턴 학습을 통해 답을 볼 수 있고 최근 가장 많은 주목을 받는 머신러닝이 이에 해당하나 정형적인 데이터를 대상으로 하는 방법론임으로 비정형적인 텍스트에 바로 적용할 수 없다. 이때 사용하는 것이 다양한 자연어 처리 기법. 

 

지금은 텍스트 분류 등의 작업에 딥러닝 기반의 BERT를 쓰는 것이 일반화됬다. BERT는 Transformer에 기반한 모형으로 자세한 작동원리는 이해하기 매우어려움에도 어지간한 작업에 사용될 만큼 인기가 높다. 불과 몇년전만해도 카운트기반의 문서 표현으로 문서를 분류하는 것 조차도 많은 사람들이 매우 어려워했다는 점을 감안할때 엄청나게 많은 변화. 

카운트 기반 BOW 형식은 한물간것이 아니라 책 한권정도의 분량에 대해 문서를 분류해야할때는 여전히 카운트 기반 문서표현이 BERT 와같은 최신모형보다 더 낫다는 연구결과가있따. 비교적 간단한 작업에서 학습을 위해 많으 논력을 들이지 않으면서 비교적 좋은 성과를 올리기에 적합하다. 

 

딥러닝 이전에는 컴퓨터가 문장 에 있는 단어들을 순서대로 읽어가며 내용을 이해할 수있는 방법이 없었고 최선의 방법으로 문장에 있는 단어의 갯수들을 세고 주로 사용된 단어들을 이용해 그 문장의 내용을 파악하는 것이었다.  이러한 방법은 통계만이 남지만 텍스트 마이닝의 원래 목적 텍스트 내용 기반으로 어떤 사건을 예측하는 것은 꽤나 훌륭히 가능하다. 텍스트 내용을 완전히 이해하지않더라도 단어빈도를 통해 우리가 원하는 많은 작업들을 어느정도 잘 수행할 수있다는 것. 

 

시퀀스기반의 문서표현

카운트 기반의 문서표현이 단어들의 빈도를 이용한 하나의 벡터로 단번에 문서 전체를 표현한다. 단어가 몇번 등장했는지만 표현해 단어의 순서가 사라지는것. 시퀀스 기반의 문서표현은 각단어를 벡터로 변환하고 벡터의 나열 혹은 시퀀스로 문서를 표현한다. 

 

자연어처리기법

컴퓨터를 이용해 사람의 자연어를 분석하고 처리하는 기술

https://standout.tistory.com/1822

 

자연어와 자연어처리란? , Natural Language, NLP Natural Language Processing (feat. 정형데이터와 비정형데이

정형 데이터: 표, 필드값이 명확함, 숫자/문자 구분 가능, Excel, Python, SQL비정형 데이터: 텍스트기반, 이미지기반, 음성, 영상기반자연데이터는 구조가 없고 형태가 다양하고 분석이 어렵지만 중

standout.tistory.com

 


텍스트 마이닝은 문서분류, 문서 생성, 문서요약, 질의응답, 기계번역, 토픽 모델링에 사용된다. 

 

텍스트 전처리

우리가 일반적으로 하나의 문장을 이해할때는 사용된 단어들의 순차수열로 이해하니 컴퓨터에게 어떤 문장을 이해시키고 싶다면 하나의 문자열을 단어 단위로 나눈 후에 단어리스트 형태로 변환해주어야하며 쓸모없다고 생각되는 문자는 제거해야한다. 

 

토큰화 문장 단위로 나누는것. 

text = "나는 밥을 먹었다. 오늘은 날씨가 좋다."

sentences = text.split(".")
print(sentences)
import re

text = "나는 밥을 먹었다. 오늘은 날씨가 좋다! 너도 먹었니?"

sentences = re.split(r'[.!?]', text)

print(sentences)

 

 

단어단위 토큰화

text = "I love Python"

tokens = text.split()

print(tokens)
import re

text = "I love Python! Python is great."

tokens = re.findall(r'\w+', text)

print(tokens)
import nltk
from nltk.tokenize import word_tokenize

text = "I love Python."

tokens = word_tokenize(text)

print(tokens)
import re

text = "I love Python! Python is great."

tokens = re.findall(r'\w+', text)

print(tokens)

 

노이즈제거

import re

text = "나는 밥을 먹었다!!! ㅋㅋㅋ"

tokens = re.findall(r'[가-힣]+', text)

print(tokens)

 

 

 

the, a, an, is, am... 불용어 제거

text = "I am a student and I am happy"

tokens = text.split()

stopwords = {'a', 'am', 'and', 'I'}

result = [word for word in tokens if word not in stopwords]

print(result)
from nltk.corpus import stopwords

stop_words = set(stopwords.words('english'))

tokens = ['I', 'love', 'Python', 'and', 'it', 'is', 'easy']

result = [
    word for word in tokens
    if word.lower() not in stop_words
]

print(result)

 

 

 

한국어는 KoNLPy등의 라이브러리를 사용한다. 

from konlpy.tag import Okt

okt = Okt()

text = "나는 맛있는 밥을 먹었다."

print(okt.morphs(text))

 

영어 문장 토큰화 nltk.sent_tokenize()
영어 단어 토큰화 nltk.word_tokenize()
영어 불용어 nltk.corpus.stopwords
정규표현식 토큰화 re.findall()
한국어 형태소 분석 KoNLPy
한국어 형태소 분석기 Okt, Kkma, Komoran 등

 

 

Stemming

어간추출, 단순히 단어를 잘라내기 때문에 실제 단어가 아닐 수도 있다.

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()

print(stemmer.stem("studies"))

 

 

WordNetLemmatizer
표제어 추출, 단어를 사전에서 찾을 수 있는 기본형(표제어)으로 바꾸는 것

품사 정보를 모르면 정확하게 원형을 못 찾는 경우가 많아 품사를 알려줘야한다.

from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()

print(lemmatizer.lemmatize("cats"))
print(lemmatizer.lemmatize("running"))
print(lemmatizer.lemmatize("better"))
print(lemmatizer.lemmatize("running", pos="v"))

 

 

영어일경우 품사태깅은 nltk 가 제일 편리하다.

import nltk
from nltk.tokenize import word_tokenize
from nltk import pos_tag

text = "I love Python."

tokens = word_tokenize(text)

print(tokens)
print(pos_tag(tokens))

 

 

 

한국어의 경우 대표적으로 KoNLPy 가 있다. 

from konlpy.tag import Okt

okt = Okt()

text = "나는 맛있는 밥을 먹었다."

print(okt.pos(text))

 

 

FreqDist = 단어 빈도를 세는 도구

NLP에서 빈도 그래프는 보통 각 단어가 문서에서 몇 번 등장했는지 세고, 그 결과를 그래프로 그리는 것

from nltk import FreqDist

text = "apple banana apple orange banana apple"

words = text.split()

fdist = FreqDist(words)

print(fdist)
print(fdist.most_common())
import matplotlib.pyplot as plt
from nltk import FreqDist

text = "apple banana apple orange banana apple"

words = text.split()

fdist = FreqDist(words)

fdist.plot(3)
plt.show()
from konlpy.tag import Okt
from nltk import FreqDist
import matplotlib.pyplot as plt

okt = Okt()

text = """
나는 파이썬을 공부한다.
파이썬은 재미있다.
나는 장고도 공부한다.
파이썬과 장고를 공부한다.
"""

nouns = okt.nouns(text)

fdist = FreqDist(nouns)

print(fdist.most_common())

fdist.plot(10)
plt.show()

 

 

워드클라우드

from konlpy.tag import Okt
from wordcloud import WordCloud
import matplotlib.pyplot as plt

okt = Okt()

text = """
나는 파이썬을 공부한다.
파이썬은 재미있다.
나는 장고도 공부한다.
파이썬과 장고를 공부한다.
"""

# 명사 추출
nouns = okt.nouns(text)

# 리스트 → 문자열
words = " ".join(nouns)

wordcloud = WordCloud(
    font_path="C:/Windows/Fonts/malgun.ttf",
    background_color="white",
    width=800,
    height=600
).generate(words)

plt.imshow(wordcloud)
plt.axis("off")
plt.show()