본문 바로가기

온갖 잡 정보들

파이썬 Counter

문장을 단어와 품사별로 추출하고 그 빈도를 세려고 하였는데 추출 결과가 이중리스트 구조라서 어떻게 카운트할까 고민이었다.

나머지는 아래 소스 참조

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)

에서 자세한 내용을 확인할 수 있다.

"""