1) 텍스트 클리닝 (html / url / 특수 문자 제거 등)
크롤링 데이터의 경우 html tag 제거
필요하지 않은 특수문자 매핑 또는 제거
ㄱ-ㅎ/ㅏ-ㅣ 등 자음과 모음으로만 이루어진 글자들 제거
@#$%^&*() 등 puctuation(문장부호) 제거
import re
punct = "/-'?!.,#$%\'()*+-/:;<=>@[\\]^_`{|}~" + '""“”’' + '∞θ÷α•à−β∅³π‘₹´°£€\×™√²—–&'
punct_mapping = {"‘": "'", "₹": "e", "´": "'", "°": "", "€": "e", "™": "tm", "√": " sqrt ", "×": "x", "²": "2", "—": "-", "–": "-", "’": "'", "_": "-", "`": "'", '“': '"', '”': '"', '“': '"', "£": "e", '∞': 'infinity', 'θ': 'theta', '÷': '/', 'α': 'alpha', '•': '.', 'à': 'a', '−': '-', 'β': 'beta', '∅': '', '³': '3', 'π': 'pi', }
def cleaning(texts, punct, mapping):
for text in texts:
for p in mapping: # 특수부호 mapping
text = text.replace(p, mapping[p])
for p in punct: # 특수부호 제거
text = text.replace(p, '')
text = re.sub(r'<[^>]+>', '', text) # remove Html tags
text = re.sub(r''([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)'', '', text) # remove e-mail
text = re.sub(r'(http|ftp|https)://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', ' ', text) # remove URL
text = re.sub(r'\s+', ' ', text) # Remove extra space
text = re.sub('([ㄱ-ㅎㅏ-ㅣ]+)', '', text) # Remove 한글 자음, 모음
text = re.sub('[^\w\s\n]', '', text) # Remove 특수기호
return texts
2) 띄어쓰기
한국어의 경우 띄어쓰기에 따라 토큰 분리가 완전히 달라질 수 있기 때문에 띄어쓰기 검사를 제대로 해주는게 좋다.
띄어쓰기가 없는 문장으로 바꾼 다음에 띄어쓰기 라이브러리 적용한다.
pykospacing 라이브러리
100만개 뉴스로 학습된 딥러닝 모델 (CNN + GRU)
[ Installation ]
pip install git+https://github.com/haven-jeon/PyKoSpacing.git
[ Usage ]
sent = '김철수는 극중 두 인격의 사나이 이광수 역을 맡았다. 철수는 한국 유일의 태권도 전승자를 가리는 결전의 날을 앞두고 10년간 함께 훈련한 사형인 유연재(김광수 분)를 찾으러 속세로 내려온 인물이다.'
new_sent = sent.replace(" ", '') # 띄어쓰기가 없는 문장 임의로 만들기
from pykospacing import Spacing
spacing = Spacing()
kospacing_sent = spacing(new_sent)
3) 맞춤법 검사
py-hanspell 라이브러리
네이버 맞춤법 검사기를 이용한 파이썬용 한글 맞춤법 검사 라이브러리
[ Installation ]
github 에서 직접 다운 받아야 하고, 코드 수정이 필요함
py-hanspell 맞춤법 검사기 설치하기
설치하기 pip 으로 인한 설치는 버전 문제 때문인지 안된다. github 저장소를 직접 내려받은 후, 일부 코드를 수정해야 한다. git clone https://github.com/ssut/py-hanspell.git 1) URL 변경 네이버 맞춤법 검사기
pinopino.tistory.com
[ Usage ]
from hanspell import spell_checker
sent = "맞춤법 틀리면 외 않되? 쓰고싶은대로쓰면돼지 "
spelled_sent = spell_checker.check(sent)
hanspell_sent = spelled_sent.checked
print(hanspell_sent)
맞춤법 틀리면 왜 안돼? 쓰고 싶은 대로 쓰면 되지
4) Tokenizing ( Pos Tagging )
형태소 분석하기
soynlp / konlpy / kiwi / khaiii 등 다양한 라이브러리 존재
각 형태소 분석기 마다 장단점이 있기 때문에 데이터셋에 맞게 사용하는 것이 좋다.
4-1. KoNLPy
한국어 정보처리를 위한 파이썬 패키지로 형태소 분석 외에도 다양한 기능을 지원하고 있다.
형태소 분석에는 Kkma / Komoran / Hannanum / Okt / Mecab 5개 모델이 있다.
4-2. Kiwi
빠른 속도와 범용적인 성능을 지향하는 한국어 형태소 분석기 라이브러리
[ Installation ]
pip install kiwipiepy
[ Usage ]
from kiwipiepy import Kiwi
kiwi = Kiwi()
text = "맞춤법 틀리면 왜 안돼? 쓰고 싶은 대로 쓰면 되지"
result = kiwi.analyze(text)
print(result)
[([ Token(form='맞춤법', tag='NNG', start=0, len=3),
Token(form='틀리', tag='VV', start=4, len=2),
Token(form='면', tag='EC', start=6, len=1),
Token(form='왜', tag='MAG', start=8, len=1),
Token(form='안', tag='MAG', start=10, len=1),
Token(form='되', tag='VV', start=11, len=1),
Token(form='어', tag='EF', start=11, len=1),
Token(form='?', tag='SF', start=12, len=1),
Token(form='쓰', tag='VV', start=14, len=1),
Token(form='고', tag='EC', start=15, len=1),
Token(form='싶', tag='VX', start=17, len=1),
Token(form='은', tag='ETM', start=18, len=1),
Token(form='대로', tag='NNB', start=20, len=2),
Token(form='쓰', tag='VV', start=23, len=1),
Token(form='면', tag='EC', start=24, len=1),
Token(form='되', tag='VV', start=26, len=1),
Token(form='지', tag='EF', start=27, len=1)], -72.46429443359375)]
4-3. Khaiii
[ Installation ]
Khaiii 형태소 분석기 설치하기
빌드 환경 MS Window 는 지원하지 않는다. C++14로 개발했기 때문에 이를 지원하는 컴파일러가 필요하다. 1. 빌드 툴 다운로드 pip install cmake 2. khaiii 빌드 및 설치 git clone https://github.com/kakao/khaiii.git # k
pinopino.tistory.com
[ Usage ]
from khaiii import KhaiiiApi
api = KhaiiiApi()
for word in api.analyze("안녕, 세상."):
print(word)
안녕, 안녕/IC + ,/SP
세상. 세상/NNG + ./SF
5) Stemming
동사를 원형으로 바꾸기
고유 명사와 일반 명사는 그대로 단어를 추가하고, 동사와 형용사의 경우 '다'를 붙여준다.
아래 코드는 Khaiii 형태소 분석기를 이용한 코드
def stemming(sentence):
morphtags = morphs = [(morph.lex, morph.tag) for word in KhaiiiApi().analyze(sentence) for morph in word.morphs]
words = []
for lex, tag in enumerate(morphtags) :
if tag=='NNP' or tag=='NNG' :
words.append(lex)
elif tag=='VA' or tag=='VV' :
words.append(lex+'다')
return words
6) Stop word
의미 없는 조사, 단어 등 제거하기
의미 있는 리스트는 아직 발견하지 못했다.
References