자연어 처리가 필요한 영역
- 완성도 높은 자연어 처리: 스팸 처리, 맞춤법 검사, 단어 검색, 객체 인식
- 완성도 낮은 자연어 처리: 질의응답, 요약, 유사 단어 바꾸어 쓰기, 대화
자연어 처리 관련 용어
- 말뭉치(코퍼스): 자연어 처리에서 모델을 학습시키기 위한 데이터
- 토큰: 자연어 처리를 위한 문서는 작은 단위로 나누어야 하는데, 이때 문서를 나누는 단위
- 토큰화: 텍스트를 문장이나 단어로 분리하는 것
- 불용어: 문장 내 많이 등장하는 단어
- 어간 추출: 단어를 기본 형태로 만드는 작업(cosigned, cosigning... -> cosign)
- 품사 태깅: 주어진 문장에서 품사를 식별하기 위해 붙여 주는 태그
자연어 처리 과정
- 자연어 -> 전처리(토큰화, 불용어 제거, 어간 추출, 정규화) -> 임베딩 -> 모델/모형 적용
자연어 처리를 위한 라이브러리
- NLTK: 말뭉치, 토큰 생성, 형태소 분석, 품사 태깅
- KoNLPy: 한국어 처리를 위한 파이썬 라이브러리(꼬꼬마, 코모란, 한나눔, 트위터, 메카브와 같은 형태소 분석기 사용 가능)
- Gensim: 임베딩(워드투벡터), 토픽모델링(LDA...)
- 사이킷런: CounterVectorizer(텍스트에서 단어의 등장 횟수를 기준으로 특성 추출), Tfidfvectorizer(TF-IDF 값을 사용해서 텍스트에서 특성 추출), HashingVectorizer(CounterVectorizer와 방법이 동일하지만 텍스트를 처리할 때 해시 함수를 사용하기 때문에 실행 시간이 감소)
전처리
- 결측치 처리: dropna() - 결측치 삭제, fillna(0) - 결측 0으로 채우기
- 문장 토큰화: nltk의 sent_tokenize
- 단어 토큰화: nltk의 word_tokenize, nltk.tokenize의 WordPunctTokenizer(아포스트로피가 포함되었을 때)
어간 추출
- 어간 추출: 단어 그 자체만 고려하기 때문에 품사가 달라도 사용 가능
- 예시: automates, automatic... -> automat
- NLTK의 어간 추출로는 대표적으로 포터(nltk.stem의 PorterStemmer)와 랭커스터(nltk.stem의 LancasterStemmer) 알고리즘이 있음
- 포터 알고리즘은 단어 원형이 비교적 잘 보존되지만, 랭커스터 알고리즘은 원형을 알아볼 수 없을 정도로 축소시키기 때문에 정확도가 낮음(랭커스터는 일반적인 상황보다 데이터셋을 축소시켜야 하는 상황에 유용)
표제어 추출
- 표제어 추출: 단어가 문장 속에서 어떤 품사로 쓰였는지 고려하기 때문에 품사가 같아야 사용 가능
- 예시: am, are, is -> be / car, cars, car's... -> car
- 표제어 추출은 nltk.stem의 WordNetLemmatizer 주로 사용
- 일반적으로 표제어 추출의 성능을 높이고자 단어에 대한 품사 정보를 추가하곤 함(아래의 코드 참고)
print(lemma.lemmatize('obsesses', 'v'),lemma.lemmatize('obsessed','a'))
print(lemma.lemmatize('standardizes','v'),lemma.lemmatize('standardization','n'))
print(lemma.lemmatize('national','a'), lemma.lemmatize('nation','n'))
print(lemma.lemmatize('absentness','n'), lemma.lemmatize('absently','r'))
print(lemma.lemmatize('tribalical','a'), lemma.lemmatize('tribalicalized','v'))
- 어간 추출과 표제어 추출은 둘 다 어근 추출이 목적이지만, 어간 추출은 사전에 없는 단어도 추출할 수 있고 표제어 추출은 사전에 있는 단어만 추출할 수 있다는 점에서 차이가 있음(일반적으로 어간 추출보다 표제어 추출의 성능이 더 좋지만, 시간이 오래 걸림)
정규화
- 정규화: 데이터셋이 가진 특성의 모든 데이터가 동일한 정도의 스케일을 갖도록 하는 것
- 정규화를 위해 sklearn.preprocessing의 StandardScaler, MinMaxScaler 자주 사용
- MinMaxScaler(): 모든 칼럼이 0과 1 사이에 위치하도록 값의 범위 조정(이상치에 매우 민감할 수 있기 때문에 주의)
- StandardScaler(): 각 특성의 평균을 0, 분산을 1로 변경하여 값의 범위 조정
- RobustScalar(): 평균과 분산 대신 중간 값과 사분위수 범위(제3사분위수 - 제1사분위수)를 사용
- MaxAbsScalar(): 절댓값이 0~1 사이가 되도록 조정(모든 데이터가 -1~1 사이가 되도록 조정)
실습
- 커스텀 데이터셋(customdataset())은 미니 배치나 데이터를 무작위로 섞는(shuffle) 등의 용도로 사용할 수 있응ㅁ
- BCEWuthLogitsLoss
- BCELoss 손실 함수에 시그모이드 함수가 함께 결합된 것(이진 분류에서 사용하는 손실 함수로는 이진 교차 엔트로피와 BCEWuthLogitsLoss가 있음)
- BCEWuthLogitsLoss은 로짓 값을 입력으로 받고 내부적으로 시그모이드 함수를 포함하고 있으므로 수치적으로 안정성과 계산 효율성 면에서 이진 교차 엔트로피보다 선호되는 손실 함수임
출처: 서지영(2022). 딥러닝 파이토치 교과서. p506-p539.
'파이토치' 카테고리의 다른 글
[딥러닝 파이토치 교과서] 클러스터링 (0) | 2023.06.24 |
---|---|
[딥러닝 파이토치 교과서] 자연어 처리를 위한 임베딩 (0) | 2023.06.18 |
[딥러닝 파이토치 교과서] 성능 최적화 (0) | 2023.06.17 |
[딥러닝 파이토치 교과서] 합성곱 신경망2 (0) | 2023.05.28 |
[파이토치] 신경망 모델 구성/Autograd/최적화 (1) | 2023.05.14 |