비정형 데이터 중 가장 많이 언급되는 것이 텍스트 데이터입니다. 일반적으로 전처리 코드는 영어를 중심으로 되어 있어서, 한글만을 위한 전처리 도구는 조금 공수를 들여야 하는 경우가 많습니다. 오픈 소스 라이브러리 자료들도 많이 올라와 있지만, 영어보단 활성화되진 않았습니다. 한국어는 영어처럼 띄어쓰기를 기준으로 관사와 명사, 형용사를 분리할 수 없는 독특한 구조를 가진 글자라서 처리할 때 좀 더 까다롭지 않을까란 생각을 합니다
한국어 전처리는 다음과 같은 과정들을 거친다고 생각합니다.
1. 텍스트 데이터 수집
2. 텍스트 cleaning 과정
- 필요없는 텍스트 제거
-불필요한 html 태그 제외
- 문장부호 제거
- 맞춤법 체크
- 띄어쓰기
- 반복되는 문자 정규화
3. 불용어 제거
4. 품사 Tagging
이 이외에도 텍스트 데이터 유형에 따라 과정이 다를 거라고 생각합니다.
1. 텍스트 데이터 수집
현재 보유하는 도메인 데이터, 크롤링 데이터 등으로 데이터를 수집합니다. 그런데 크롤링의 경우 경우에 따라 금지하는 사이트 등도 있어서 주의해서 사용하면 좋습니다.
일단 위키피디아 텍스트 데이터를 가지고 분석을 해보려고 합니다
!pip install wikipedia-api
import wikipediaapi
wiki_pedia = wikipediaapi.Wikipedia(
language='ko',
extract_format=wikipediaapi.ExtractFormat.WIKI)
wiki_data = wiki_pedia.page("인공지능")
data = wiki_data.text
인공지능과 관련한 텍스트 데이터를 데이터로 만들었습니다.
2. 전처리 과정
cleaning 과정으로 하단에 있는 문구들을 삭제하고, 불필요한 문장부호 등을 삭제합니다. 이럴 때 정규표현식을 많이 씁니다.
- 필요없는 문자 삭제
예를 들어 문장괄호나 한자는 삭제해주려고 할 때, 정규표현식을 써서 삭제합니다.
cleaned_content = re.sub('[^가-힣a-zA-Z0-9\s]'," ",data) # 한글, 영어, 숫자만 빼고 모두 삭제
- 문장부호 정리
경우에 따라서, 문장부호 중에서 특정 문장부호가 아닌 것만 제거하기 위해서는 다음과 같이 쓸 수 있고,
# ,.?!와 문자+숫자+_(\w)와 공백(\s) 처리
re.sub('[^,.?!\w\s]',' ', data)
- html 태그 제거
html 해시태그를 제거한다면 다음과 같이 짤 수 있습니다
re.sub(r"<[^>]+>\s+(?=<)|<[^>]+>", " ", data)
- 띄어쓰기
띄어쓰기는 라이브러리 중 PyKoSpacing을 활용해서 사용할 수 있지만...
# library install
!pip install git+https://github.com/haven-jeon/PyKoSpacing.git
# library 호출
from pykospacing import Spacing
# 사용
spacing = Spacing()
text_spacing_1 = spacing(text_1)
위키피디아는 띄어쓰기는 별로 큰 문제가 없는 것 같아서 pykospacing은 넘어가고 정규표현식으로 해결합니다.
# 문장의 맨 앞에 있는 text 제외
re.sub(r"^\s+", '', text)
# 문장의 맨 뒤에 있는 text 제외
re.sub(r'\s+$', '', text)
# 띄어쓰기 2개 이상일 경우 1개로
re.sub(r'\s+', ' ', text)
와 같이 정규표현식을 짭니다.
- 맞춤법
이 부분도 원문 자체가 띄어쓰기나 맞춤법이 잘 되어 있는 경우에는 굳이 할 필요는 없지만,
주로 Py-Hanspell 라이브러리를 사용할 때도 있습니다
# 설치
!pip install git+https://github.com/ssut/py-hanspell.git
# --- 불러오기 ------
from hanspell import spell_checker
spell_checker.check(text_1)
# --- test code ------
test_result = spell_checker.check('아버지가방에 들어가신다. 아버지 가방에 들어가신다.')
test_result.as_dict()['checked']
- 반복되는 문자 정리
!pip install soynlp
# --- 필요한 경우 ----
from soynlp.normalizer import *
print(repeat_normalize('반복반복반복반복', num_repeats=1))
- 문장/문단 나누기
kss 라이브러리가 있습니다.
!pip install kss
import kss
# ---- Test Code -------
s = "이 문장은 테스트 코드입니다. 이 문단은 전부 테스트 코드. 어제 어린왕자 프랑스 영화를 봤지. ost가 좋았어."
for sent in kss.split_sentences(s):
print(sent)
이미 위키피디아 데이터는 \n 으로 문단이 구분되어 있어서 굳이... 이럴 필요는 없었습니다.
preprcessed_text = []
for text in cleaned_content.split("\n"):
text = re.sub(r"^\s+", "", text)
text = re.sub(r"\s+$", "", text)
text = re.sub(r"\s+", " ", text)
if text:
preprcessed_text.append(text)
이런식으로 문장을 나눠서 리스트에 담아주고, 리스트 끝 부분은 다시 수정해 줍니다
- 그 외의 텍스트 처리
끝 부분은 필요가 없어서 버리고 데이터를 만들어줍니다
data = preprcessed_text[:202]
그 외에도 외래어 처리 loanwords 등도 처리할 수 있습니다. 영어가 많은 경우에 말이죠.
3. 불용어 처리
제외할 불용어를 선정합니다. 한국어 불용어의 경우에는 https://www.ranks.nl/stopwords/korean 여기에서 참조해서 볼 수 있습니다.
stop_words = ["음", "그게", "모르겠다", "...", "모름", "없음"]
list이면 not in stop_words 로 짜서 해당 단어를 삭제해줍니다.
dictionary인 경우에는
stop_words = {
"음" : "<NAN>",
"..." : "<NAN>",
"모르겠다" : "모름",
"모르겠음" : "모름",
}
이런 식으로 매칭시켜서 해당 텍스트 등을 통일을 시켜줄 수도 있습니다.
4. 품사 태깅
품사 태깅에서 어근 동일화 stemming 를 해줄 수 있습니다.
한국어의 경우 끝나는 문장이. 하였습니다. 하였다. 했습니다. -> 하다. 로 수정하는 작업을 어근 동일화라고 부릅니다. stem=True로 설정하면 이런 문장을 통일할 수 있죠. 이 때 라이브러리는 konlp 중에 okt 를 사용했습니다.
okt_tagger.pos(test_string, stem=True)
한국어 품사 태깅하는 라이브러리는
Konlpy를 설치하면 Okt, Hannanum, Kkma 가 있고,
그 외에 Mecab, Khaiii 라이브러리 등이 있습니다.
Konlpy 라이브러리는 이곳저곳에서 소개가 되어 있어서...
okt는 트위터에서 한국어 처리 라이브러리를 만들었고, Hannanum은 카이스트 SWRC연구소에서 개발했고, Kkma는 서울대학교 연구실에서 개발한 것으로 알고 있습니다.
from konlpy.tag import Okt
def okt_library_pos(string_text):
'''해당 라이브러리 함수 예시입니다. '''
okt_tagger = Okt()
words = okt_tagger.pos(string_text) #stem=True 어근 형태
okt_words = []
okt_pos = []
for word in words:
if word[1] in ['Noun']:
if len(word[0]) > 1 and word[0] not in ['없음', '없다', '모름', '모른다', '모르다']:
okt_words.append(word[0])
okt_pos.append(word[1])
return okt_words, okt_pos
이런 식으로 불용어 처리와 한 글자 단어 처리까지 한 번에 할 수도 있습니다.
Hannanum, 꼬꼬마 라이브러리도 konlpy 호출할 때 호출해서 사용할 수 있습니다.
- khaiii 라이브러리 colab에 설치하는 법
khaiii는 python 형태로 개발된 건 아니라서... colab에 설치하는 법이랑 mecab은 맥에서 돌아가는데 이것도 colab에서 활용할 수 있는 방법을 적고 포스팅을 끝내겠습니다.
# khaiii
!git clone https://github.com/kakao/khaiii.git
# cmake
!pip install cmake
# build하기
!mkdir build
# 빌드한 위치를 꼭 확인하세요~
!cd build && cmake /content/khaiii
# make all
!cd /content/build/ && make all
# make resource
!cd /content/build/ && make resource
# make install
!cd /content/build && make install
# make package_python
!cd /content/build && make package_python
# install 마무리
!pip install /content/build/package_python
이제 테스트 합니다.
# ---- 라이브러리가 잘 불러와 지는지 test 용 코드 ----
from khaiii import KhaiiiApi
api = KhaiiiApi()
for word in api.analyze("안녕하세요. 모르는것을알게되어서"):
print(word)
라이브러리 불러오기 완료
- Mecab library 를 colab에 설치하는 방법
우선 install dependencies...
%%bash
apt-get update
apt-get install g++ openjdk-8-jdk python-dev python3-dev
pip3 install JPype1
pip3 install konlpy
자바도 필요
%env JAVA_HOME "/usr/lib/jvm/java-8-openjdk-amd64"
%%bash
bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)
pip3 install /tmp/mecab-python-0.996
이제 테스트
# ------ 여기에서 에러나면 새로운 런타임으로 연결하기 ------
mecab = Mecab()
sentence = "안녕하세요. 테스트 용 텍스트입니다. 랄랄라라랄랄라."
temp_X = mecab.morphs(sentence)
temp_X
하면 리스트 형태로 해당 구문의 morphs를 반환받을 수 있습니다.
끝.
'NLP-writing' 카테고리의 다른 글
텍스트 유사도-벡터 유사도 (0) | 2023.06.04 |
---|---|
텍스트 분류 (0) | 2023.05.21 |
미적분 - 경사 하강법(gradient descent) (0) | 2023.04.27 |
Linear Algebra 선형대수학 with NLP (0) | 2023.04.09 |
3. Probability - 베이지안Bayesian (0) | 2023.03.26 |