본문 바로가기

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

이론

자연어와 자연어처리란? , Natural Language, NLP Natural Language Processing (feat. 정형데이터와 비정형데이터): 데이터수집 - 데이터 정제 - 문장 분리 - 토큰화 - 형태소 분석 - 벡터화 - 모델학습 - 모델평가


정형 데이터: 표, 필드값이 명확함, 숫자/문자 구분 가능, Excel, Python, SQL

비정형 데이터: 텍스트기반, 이미지기반, 음성, 영상기반

자연데이터는 구조가 없고 형태가 다양하고 분석이 어렵지만 중요함. 

언어벌 문법/구조 차이가 있어 분석 방식이 달라진다.

영어는 단어/띄어쓰기 중심이나 일본어와 중국어는 구조/표현 방식이 상이하다.

언어마다 문장 형식 어순이 달라 분석시 구조고려가 필요하다. 

시대/세대에 따라 표현이 변화하고 유행어와 소멸어가 존재하며 관용적 표현, 문맥 감정에 따라 의미가 달라진다 .

숫자 데이터와 다르게 시각화에 어려움이 있다. 워드 클라우드로 단어의등장 빈도/비중을 글자 크기로 표시할 수 있다.

 

자연어

Natural Language 사람이 실제 생활에서 사용하는 언어. 

데이터의 구성요소: 글, 단락, 문장, 단어, 구/형태소.

데이터포맷:  대화, 연설문, 소설, 시..

분석시 고려요소: 화자정보, 톤 어조

고유특징: 데이터/표현 다양성, 특징성요소(중의성, 오탈자, 이모티콘, 문맥 의존성), 형태소/구문/의미 단위.

text = "안녕하세요. 저는 자연어처리를 공부하고 있습니다."

# 공백 기준으로 분리
words = text.split()

print(words)
['안녕하세요.', '저는', '자연어처리를', '공부하고', '있습니다.']

 


자연어처리 NLP Natural Language Processing

컴퓨터가 인간의 언어를 이해하고 처리할 수 있도록 만드는 기술

자연어 데이터 전처리시 전처리가 잘못되면 이후 분석 결과가 모두 잘못됨. 분석 품질의 기반.

특수기호의 처리. 단순히 모두 제거하는것이 아닌 긍정표현, 부정표현과 같은 감정정보를 끌어내야한다. 

번역시스템,챗봇, 음성비서, 검색 엔진, 감성분석, 문서분류, LLM

import re

text = "오늘 기분 최고!!! 😄😄"

# 한글, 영문, 숫자, 공백만 남기기
result = re.sub(r'[^가-힣a-zA-Z0-9\s]', '', text)

print(result)
오늘 기분 최고

 

 

 

데이터수집 - 데이터 정제 - 문장 분리 - 토큰화 - 형태소 분석 - 벡터화 - 모델학습 - 모델평가.

 

 

 

 - 데이터수집  : 뉴스, 블록, 책, 논문, 웹사이트, 위키문서 등의 다양한 출처에서 텍스트를 수집한다.

import requests
from bs4 import BeautifulSoup

url = "https://news.naver.com"

response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

print(soup.title.text)

 

 

 - 데이터 정제: <html> 안녕하세요, 광고문구, 특수문자, 중복문장, 깨진문자 등의 불필요한 정보 제거

import re

text = """
<html>
안녕하세요!!!
광고문의 ☎ 010-1234-5678
</html>
"""

# HTML 태그 제거
text = re.sub(r'<.*?>', '', text)

# 전화번호 제거
text = re.sub(r'\d{3}-\d{4}-\d{4}', '', text)

# 특수문자 제거
text = re.sub(r'[^\w\s가-힣]', '', text)

print(text)

 

 

 - 문장 분리: 문서를 문장 단위로 나눈다. ( sent_tokenize)

from nltk.tokenize import sent_tokenize

text = """
오늘 날씨가 좋다.
나는 학교에 갔다.
친구와 공부했다.
"""

sentences = sent_tokenize(text)

for s in sentences:
    print(s)

 

 

 

 - 토큰화(KoNLPy, NLTK): 문장을 작은 단위로 분리한다. 구두점, Apostrophe를 제외하거나 줄임말등을 원래형태로 복원을 고려한다. &sk 화폐단위의 경우의 특수문자등이 있을 수 있으나 무조건 제거하지않는다. 예외처리.

from nltk.tokenize import word_tokenize

sentence = "I can't study NLP today."

tokens = word_tokenize(sentence)

print(tokens)
from konlpy.tag import Okt

okt = Okt()

sentence = "자연어처리는 정말 재미있습니다."

tokens = okt.morphs(sentence)

print(tokens)

 

 

 

 - 형태소 분석: 학생(명사), 등(접비사), 이(조사), 공부(명사), 한다(동사) 토큰을 더욱 세부적으로 분석 (okt.pos)

from konlpy.tag import Okt

okt = Okt()

sentence = "학생들이 공부한다."

result = okt.pos(sentence)

print(result)

[
 ('학생', 'Noun'),
 ('들', 'Suffix'),
 ('이', 'Josa'),
 ('공부', 'Noun'),
 ('한다', 'Verb'),
 ('.', 'Punctuation')
]

 

 

 - 벡터화: 텍스트를 숫자형태로 변환한다. CountVectorizer, TfidfVectorizer

from sklearn.feature_extraction.text import CountVectorizer

documents = [
    "나는 사과를 좋아한다",
    "나는 바나나를 좋아한다"
]

vectorizer = CountVectorizer()

X = vectorizer.fit_transform(documents)

print(vectorizer.get_feature_names_out())
print(X.toarray())
from sklearn.feature_extraction.text import TfidfVectorizer

documents = [
    "사과 사과 바나나",
    "사과 포도"
]

vectorizer = TfidfVectorizer()

X = vectorizer.fit_transform(documents)

print(X.toarray())

 

 

 - 모델학습: 학습데이터를 구축해 학습.

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

texts = [
    "정말 좋다",
    "최고의 영화",
    "너무 싫다",
    "최악의 경험"
]

labels = [1, 1, 0, 0]

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(texts)

model = MultinomialNB()
model.fit(X, labels)
test = ["정말 최고다"]

test_vector = vectorizer.transform(test)

result = model.predict(test_vector)

print(result)

 

 - 모델평가.

from sklearn.metrics import accuracy_score

y_true = [1, 0, 1, 0]
y_pred = [1, 0, 0, 0]

accuracy = accuracy_score(y_true, y_pred)

print("정확도:", accuracy)