반응형
* 영어권 텍스트 처리 패키지: NLTK
* Stemming(어간 추출)
* Lemmatizing(원형 복원)
* Pos Tag(품사 부착)
1. NLTK
import nltk
nltk.__version__
# '3.5'
2. English Text Data Download(Example) & Check
# github에서 corpus(말뭉치) 다운로드
nltk.download()
# nltk에 들어있는 book 데이터 확인
from nltk.book import *
* gutenberg의 파일 리더기
nltk.corpus.gutenberg.fileids()
* fileids를 사용해 gutenberg안에 있는 text 데이터 추출
emma = nltk.corpus.gutenberg.raw('austen-emma.txt')
print(emma[:1000])
3. Sentence Tokenize
from nltk.tokenize import sent_tokenize
token = sent_tokenize(emma[:1000]) # 문장 단위로 토큰화
print(token)
token[0]
token[3]
4. Word Tokenize
from nltk.tokenize import word_tokenize
# 위의 token[3]를 단어별로 끊어서 리스트화
word_tokenize( token[3] )
words_token3 = word_tokenize(token[3])
list(filter(lambda x: x!= ',', words_token3[:15])) # 앞에서부터 15개 단어 중 해당되지 않는 것만 출력
5. RegexpTokenizer
from nltk.tokenize import RegexpTokenizer
ret = RegexpTokenizer('[a-zA-Z]{2}') # 2글자씩 추출
emma_token = ret.tokenize(emma)
6. Stemming(어간 추출)
* Stemmer는 대상 단어의 의미를 구분하지 않고 어간을 추출한다.
* 예시 리스트
words =['sending', 'cooking', 'files', 'lives', 'crying', 'dying']
1) PorterStemmer 사용
from nltk.stem import PorterStemmer
pst = PorterStemmer()
print(pst.stem(words[0])
# words 안에 포함된 모든 단어에 대한 어간을 추출하여 리스트 생성
li = [pst.stem(i) for i in words]
li
2) LancasterStemmer 사용
from nltk.stem import LancasterStemmer
lcst = LancasterStemmer()
li2 = [lcst.stem(i) for i in words]
li2
3) RegexpStemmer 사용(정규표현식 사용)
from nltk.stem import RegexpStemmer
regstm = RegexpStemmer('ing')
li3 = [regstm.stem(w) for w in words]
li3
4) SnowballStemmer 사용
from nltk.stem import SnowballStemmer
sno = SnowballStemmer(language = 'english')
li4 = [sno.stem(w) for w in words]
li4
7. Lemmatizing(원형 복원, 표제어 추출)
from nltk.stem.wordnet import WordNetLemmatizer
wl = WordNetLemmatizer()
lem_list = [wl.lemmatize(w, pos = 'v') for w in words]
# pos = 'n': 명사, 'v': 동사
lem_list
8. Pos Tag(품사 부착)
* 절단한 어구의 품사를 태깅
from nltk.tag import pos_tag
# emma 데이터를 word_tokenize로 토큰화하여 리스트를 만든다. 그 리스트를 pos_tag 함수 적용
emma = nltk.corpus.gutenberg.raw('austen-emma.txt')
select_sentence = emma[50:200]
tagged_list = pos_tag(word_tokenize(select_sentence))
tagged_list
* 각 품사에 대한 설명
# NNP(고유명사)
nltk.help.upenn_tagset('NNP')
# NN(명사)
nltk.help.upenn_tagset('NN')
* 각 품사를 이용해, 원하는 값 추출
# NN만 추출
nn_list = [i[0]for i in tagged_list if i[1] == 'NN']
* Regular Expression을 이용해 원하는 값 추출
- 와일드카드
?: 0 or 1개
+: 1개 이상
*: 0개 이상
import re
pattern = re.compile('NN?')
re_list = [(t[0], t[1]) for t in tagged_list if pattern.match(t[1])]
9. Viusalization(시각화)
from nltk import Text
emma_Text = Text(emma_token)
emma_Text
# 빈도수 20위 단어를 라인 차트로 표시
emma_Text.plot(20)
# 단어별 토큰 추출
ret = RegexpTokenizer('[a-zA-Z]+')
emma_token = ret.tokenize(emma)
emma_Text = Text(emma_token)
emma_Text
# 단어의 빈도수 분포도
emma_Text.dispersion_plot(['Emma', 'happy', 'sad'])
10. 유사 단어 추출 & 불용어
* 유사 단어 추출
# 파라미터와 유사한 단어가 포함된 원소를 찾아준다.
emma_Text.similar('most')
* 불용어
emma_tag = pos_tag(emma_Text)
# token에 품사 태깅
stopwords = ['Mr.', 'Mrs.', 'Miss', 'Mr', 'Mrs', 'Dear']
# NNP: 고유명사
names_list = [t[0] for t in emma_tag if t[1] == 'NNP' and t[0] not in stopwords]
names_list
11. 단어별 빈도수 체크 패키지
from nltk import FreqDist
emma_fd = FreqDist(names_list)
emma_fd
반응형
'프로그래밍' 카테고리의 다른 글
[Sqoop] Ubuntu 20.04 Sqoop 활용 (0) | 2021.06.07 |
---|---|
[Python] Text Data Analysis(2) (0) | 2021.06.06 |
[Big Data] 빅데이터 모델 운영시스템 및 생명 주기 (0) | 2021.06.06 |
[R] 내부 평가를 이용한 분류 모델 성능 평가 (0) | 2021.06.05 |
[R] ROC 곡선 기법을 통한 분류 모델 성능 평가 (0) | 2021.06.05 |