문장을 단어와 품사별로 추출하고 그 빈도를 세려고 하였는데 추출 결과가 이중리스트 구조라서 어떻게 카운트할까 고민이었다.
나머지는 아래 소스 참조
f = open('english_text.txt', encoding='utf-8')
raw = f.read()
import nltk
"""
nltk.download('punkt')
단어단위로 나눈다.
"""
text = nltk.word_tokenize(raw)
"""
nltk.download('averaged_perceptron_tagger')
단어들을 명사, 형용사 등으로 태깅한다.
"""
tagged_text = nltk.pos_tag(text)
"""
tagged_text는 list이다.
각 태그의 의미는
nltk.help.upenn_tagset()
라고 쳐보면 알 수 있다.
tagged_text[1:10]
[('agreed', 'VBD'),
('to', 'TO'),
('help', 'VB'),
('Hannag', 'NNP'),
('against', 'IN'),
('the', 'DT'),
('Magisters', 'NNPS'),
('.', '.'),
('``', '``')]
이런 딕셔너리 형태를 키, 값 형태로 변환해서 엑셀로 넣고 작업하고 싶다.
그런데 단어별로 나온 것이 170만개가 넘는다.
여기서 distinct 및 count를 해 줘야겠다.
완전 대박!!!
distinct 및 count하는 코드를 어떻게 짜야 할까 고민하다가
Counter라는 놈이 매우 빠르다는 소문을 듣고 테스트를 해 보았다
tagged_text를 카운트해보자.
일반적으로 리스트의 요소들 카운트는 len함수를 사용한다.
"""
len(tagged_text)
"""
나는 단지 len에 비해서 Counter가 빠르다는 건 줄 알고 Counter를 사용해보았다.
"""
from collections import Counter
tagged_text_unique = Counter(tagged_text)
"""
그러나 보라! 이 아름다운 결과를! 항목별로 카운트까지 다 해 주었다!!
('Jonathan', 'NNP'): 90,
('Gloves', 'NNPS'): 9,
('Who', 'WP'): 294,
('nuts', 'NNS'): 3,
('heard', 'VBD'): 139,
help(Counter)
에서 자세한 내용을 확인할 수 있다.
"""