용어 | 내용 |
---|---|
말뭉치(Corpus) | 텍스트를 가공 · 처리 · 분석할 수 있는 형태로 모아 놓은 자료 집합 |
토큰(token) | 문장이나 코드를 분석할 때, 단어나 구문 단위로 쪼개어 나타내는 것 |
토큰화(tokenization) | 주어진 텍스트를 원하는 단위(토큰)로 나누는 작업 |
어간추출(stemming) | 단어가 활용될 때 변하지 않는 부분, 단어의 기본적인 부분을 추출(Porter 알고리즘사용) |
n-gram | n개의 연속적인 단어 나열 |
정제(Cleaning) | 특수문자, 숫자, HTML 태그 등 자연어 처리에 불필요한것들을 제거하는 과정 |
정규화(Normalization) | 같은 의미를 가진 동일한 단어를 하나로 통일시켜 표준단어로 만드는 작업 |
불용어(Stopword) | 유의미한 토큰만을 선별하기 위해서 의미가 없는 토큰을 제거하기위한 불필요한 단어 |
표제어 추출(Lemmatization) | ‘표제어’ 또는 ‘기본 사전형 단어'를 추출 |
Sentence (문장)
I love natural language processing.
Tokenization(토큰화)
단어 기준 토큰화 : [”I”, “love”, “natural”, “language”, “processing”]
[”I, “ ”, “l”, “o”, “v”, “E”]
import nltk
from nltk.tokenize import sent_tokenize, word_tokenize
# 필요한 nltk 다운로드
nltk.download('punkt') # nltk 오류시 필요한 데이터 다운로드 * 에러시 명시 되어있음
nltk.download('punkt_tab')
para = "Hello everyone. It's good to see you. Let's start our text mining Class!" # 말뭉치 courpus
word_tokenize(para) # 토큰화 단어별
>> ['Hello', 'everyone', '.', 'It', "'s", 'good', 'to', 'see', 'you', '.', 'Let', "'s", 'start', 'our', 'text', 'mining', 'Class', '!']
sent_tokenize(para) # 토큰화 문장별 tokenizae
>> ['Hello everyone.', "It's good to see you.", "Let's start our text mining Class!"]
Cleaning & Stemming (정제 및 어간추출)
● 예 : “running”, “runs”, “ran” —> “run”
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
import re
english_stops = set(stopwords.words('english')) # 중복 단어 제거
text = "Sorry, I couldn't go to movie yesterday."
text = text.lower()
text = re.sub(r'[^a-z]', ' ', text)
tokens = word_tokenize(text)
result = [token for token in tokens if token not in english_stops]
print(result)
>> ['sorry', 'go', 'movie', 'yesterday']
Encoding(인코딩)
텍스트 데이터를 머신러닝 모델이 처리할 수 있도록 숫자 형태로 변환.
주요방식:
1. One-hot encoding (원핫 인코딩)
2. Word2Vec, Glove(단어 임베딩) —> 원핫 인코딩으로 처리된 텍스트를 벡터(숫자로) 변환
3. TF-IDF (단어 빈도-역 문서 빈도, Term Frequency-Inverse Document Frequency)
단어의 빈도와 역 문서 빈도를 사용하여 단어들 마다 중요한 정도에 따라 서 가중치를 부여하는 방법
ex ) “a new car, used car, car review”
word | TF |
---|---|
a | 1/7 |
new | 1/7 |
car | 3/7 |
used | 1/7 |
review | 1/7 |
“a friend in need is a friend indeed”
word | TF |
---|---|
a | 2/8 |
friend | 2/8 |
in | 1/8 |
need | 1/8 |
is | 1/8 |
indeed | 1/8 |
import pandas as pd
from math import log
# from sklearn.feature_extraction.text import TfidfVectorizer
docs = [
'먹고 싶은 사과',
'먹고 싶은 바나나',
'길고 노란 바나나',
'저는 과일이 좋아요',
]
# 1. 단어 집합(vocabulary) 구성
vocab = list(set(w for doc in docs for w in doc.split()))
vocab.sort()
# 2. 단어 빈도(Term Frequency, TF) 계싼
def compute_tf(doc):
tf = {}
words = doc.split()
for term in vocab:
tf[term] = words.count(term) / len(words)
return tf
# 3. 역문서 빈도(Inverse Document Frequency, IDF) 계산
def compute_idf(docs):
idf = {}
N = len(docs) # 총문서의 개수
for term in vocab:
df = sum(term in doc.split() for doc in docs)
idf[term] = log(N / (df + 1 )) + 1 # 스무딩 처리 divide zero 에러 제거
return idf
# 4. TF-IDF 계산
tf_list = [compute_tf(doc) for doc in docs]
idf = compute_idf(docs)
tfidf_list = []
for tf in tf_list:
tfidf = {}
for term in vocab:
tfidf[term] = tf[term] * idf[term]
tfidf_list.append(tfidf)
df_tfidf = pd.DataFrame(tfidf_list)
print(df_tfidf.round(3))
특수 문자 | 설명 |
---|---|
. | 한개의 임의의 문자를 나타낸다. |
? | 앞의 문자가 존재할 수 도 있고, 존재하지 않을수도 있다.(문자가 0개 또는 1개) |
* | 앞의 문자가 무한개로 존재할 수도 있고, 존재하지 않을수 도 있다. (문자가 0개이상) |
+ | 앞의 문자가 최소한개이상 존재한다.(문자가 1개이상) |
^ | 뒤의 문자열로 문자열이 시작된다 |
$ | 앞의 문자열로 문자열이 끝난다. |
{숫자} | 숫자 만큼 반복 |
{숫자1, 숫자2} | 숫자1 이상 숫자2 이하만큼 반복한다. ? , * ,+ 를 이것으로 대체 가능 |
{숫자,} | 숫자 이상만큼 반복한다. |
[] | 대괄호 안의 문자들 중 한개의 문자와 매치 |
[^문자] | 해당 문자를 제외한 문자를 매치 |
l | AlB 와 같이 쓰이며 A 또는 B의 의미를 갖음 |
문자규칙 | 설명 |
---|---|
\\ | 역 슬래쉬 문자 자체를 의미함 |
\d | 모든 숫자를 의미함 [0-9] 와 동일 |
\D | 숫자를 제외한 모든 문자를 의미한다 [^0-9] 와 동일 |
\s | 공백을 의미함 [\t\n\r\f\v] 와 동일 |
\S | 공백을 제외한 문자를 의미 [^\t\n\r\f\v] 와 동일 |
\w | 문자 또는 숫자를 의미함 [a-zA-Z0-9] 와 동일 |
\W | 문자 또는 숫자가 아닌 문자를 의미함 [^a-zA-Z0-9] 와 동일 |
모듈 함수 | 설명 |
---|---|
re.compile() | 정규표현식을 컴파일 하는 함수, 파이썬에 미리 컴파일을 해놓고 사용하여 속도 측면에서 유리함 |
re.search() | 문자열 전체에 대해 정규표현식과 매치되는지 검색한다. |
re.match() | 문자열의 처음이 정규표현식과 매치되는지 검색 |
re.split() | 정규 표현식을 기준으로 문자열을 분리하여 리스트로 리턴 |
re.findall() | 문자열에 정규 표현식과 매치되는 모든 경우의 문자열을 찾아서 리스트로 리턴 만약 리턴되는 값이 없을 경우 빈 리스트로 리턴 |
re.finditer() | 문자열에서 정규 표현식과 매치되는 모든 경우의 문자열에 대한 이터레이터 객체를 리턴 ex) a= re.finditer() —> next(iter(a)) |
re.sub() | 문자열에서 정규 표현식과 일치하는 부분에 대해서 다른 문자열로 대체 |
r
은 raw string
의 의미를 가지며 역슬래쉬 \
을 탈출 문자로 보지 않고, 아무 역할도 하지 않는 평범한 문자열로 간주한다. \s
는 탈출문자에 해당하지 않기 때문에 추가적인 pattern에 넣어줘야함예시 )
print("Hello World!\n")
print(r"Hello World!\n")
>> Hello World!
>>
>> Hello World!\n
연습용 사이트(정규식표현) —> https://regexr.com/5mhou
-필수 패키지 설치
pip install nltk konlpy pandas numpy matplotlib seaborn scikit-learn torch
pip install JPype1-0.6.3-cp36-cp36m-win_amd64.whl # 설치 주소 https://github.com/jpype-project/jpype/releases * 디렉토리에 파일이 있어야 설치 가능