프로그래밍

[Python] Text Data Analysis(1)

RainIron 2021. 6. 6. 21:58
반응형

* 영어권 텍스트 처리 패키지: 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()

nltk.corpus.gutenberg에 있는 데이터 id list

* 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)

공백을 제외한 2글자씩 추출

 

6. Stemming(어간 추출)

* Stemmer는 대상 단어의 의미를 구분하지 않고 어간을 추출한다.

 

* 예시 리스트

words =['sending', 'cooking', 'files', 'lives', 'crying', 'dying']

1) PorterStemmer 사용

from nltk.stem import PorterStemmer

pst = PorterStemmer()
print(pst.stem(words[0])

sending -> send

# 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

 

반응형