딕셔너리 활용하기

매일 공부(ML)·2022년 2월 19일
0

Intro

딕셔너리에 저장된 데이터를 조금 더 세심하게 다루는 방법과 파일에 저장된 데이터를 읽어와서 빈도를 확인하는 방법을 통해서 파일에 저장된 데이터를 읽어와서 딕셔너리를 활용하여 데이터의 빈도수를 측정할 수 있다.


다음 문장에서 가장 많이 나타난 단어는 무엇일까요?

Writing programs (or programming) is a very creative and rewarding activity. You can write programs for many reasons ranging from making your living to solving a difficult data analysis problem to having fun to helping someone else solve a problem. This book assumes that everyone needs to know how to program and that once you know how to program, you will figure out what you want to do with your newfound skills.

이런 종류의 문제는 사람이 하기에 매우 어려운 문제이지만, 지난 시간에 배웠던 것과 같은 패턴의 문제이기 때문에 딕셔너리를 사용해 쉽게 해결할 수 있습니다.

단지, 리스트에 저장된 데이터가 아니라 긴 문장 형태의 데이터라는 점이 다를 뿐이죠.

그러면 먼저 문장을 어떻게 단어로 바꿀 수 있는지 알아보겠습니다.


split 메소드

문자열에 split 메소드를 실행시키면 다음과 같이 띄어쓰기를 기준으로 문장을 분할해 단어들의 리스트로 만들어줍니다.

(참고로, 별도의 옵션을 사용하면 공백 문자(스페이스바)가 아닌 다른 문자를 기준으로도 분할할 수 있습니다)

line = 'The general pattern to count the words'
print(line.split())

# ['The', 'general', 'pattern', 'to', 'count', 'the', 'words']

따라서 문장이 길어지더라도 동일한 결과가 나타납니다.

counts = dict()
line = 'The general pattern to count the words in a line of text is to split the line into words, then loop through the words and use a dictionary to track the count of each word independently.'

words = line.split()

print('Words:', words)

# Words: ['The', 'general', 'pattern', 'to', 'count', 'the', 'words', 'in', 'a', 'line', 'of', 'text', 'is', 'to', 'split', 'the', 'line', 'into', 'words,', 'then', 'loop', 'through', 'the', 'words', 'and', 'use', 'a', 'dictionary', 'to', 'track', 'the', 'count', 'of', 'each', 'word', 'independently.']

이렇게 문장을 리스트로 변환시키면 지난 시간에 저희가 사용했던 get 메소드를 활용해서 문장에 있는 단어들의 빈도수를 구할 수 있게 됩니다.

for word in words:
    counts[word] = counts.get(word,0) + 1
print('Counts', counts)

# Counts {'The': 2, 'general': 2, 'pattern': 2, 'to': 6, 'count': 4, 'the': 8, 'words': 4, 'in': 2, 'a': 4, 'line': 4, 'of': 4, 'text': 2, 'is': 2, 'split': 2, 'into': 2, 'words,': 2, 'then': 2, 'loop': 2, 'through': 2, 'and': 2, 'use': 2, 'dictionary': 2, 'track': 2, 'each': 2, 'word': 2, 'independently.': 2}

그리고 이런 패턴을 활용하면 파일에 저장된 소설과 같은 텍스트에 대한 빈도수도 구할 수 있게 됩니다.


딕셔너리에 루프를 적용하는 방법

지금까지는 딕셔너리를 만드는데만 루프를 사용했지만, 딕셔너리에 저장된 데이터를 다룰 때도 루프가 유용하게 사용됩니다.

먼저 counts라는 딕셔너리를 for 반복문에 넣고 다음과 같이 실행하면, 딕셔너리의 키와 값이 각각 출력됩니다.

counts = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
for key in counts:
    print(key, counts[key])

# chuck 1
# fred 42
# jan 100

지금부터는 딕셔너리의 키나 값을 별도로 저장하는 몇 가지 방법을 알아보겠습니다.

먼저 딕셔너리를 리스트로 변환하면 이와 같이 키로만 구성된 리스트를 얻을 수 있습니다.

jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
print(list(jjj))
# ['jan', 'chuck', 'fred']

#그리고 딕셔너리의 keys라는 메소드를 사용해도 같은 결과를 얻을 수 있습니다.

jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
print(jjj.keys())
# ['jan', 'chuck', 'fred']

#딕셔너리의 값으로만 구성된 리스트를 얻으려면 values라는 메소드를 사용하면 됩니다.

jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
print(jjj.values())
# [100, 1, 42]

items 메소드

keys, values 메소드로는 딕셔너리의 키와 값의 쌍을 얻을 수 없었는데요, 키와 값의 쌍을 얻기 위해서는 items 메소드를 사용하면 됩니다.

다음과 같이 딕셔너리에 items 메소드를 실행하면 '튜플(tuple)'이라는 자료 구조 안에 키와 값이 쌍을 이루어 저장된 리스트가 반환됩니다.

jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
print(jjj.items())
# [('jan', 100), ('chuck', 1), ('fred', 42)]

그리고 이 items 메소드를 사용하면 다음과 같이 간결하게 딕셔너리에 저장된 키와 값을 출력할 수 있게 됩니다.

jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}
for aaa,bbb in jjj.items() :
    print(aaa, bbb)

# chuck 1
# fred 42
# jan 100

파일에 저장된 데이터 읽어와서 빈도 분석하기

파일에서 읽어온 데이터를 이와 같이 한 문장씩 읽어온 후 위에서 배운 코드와 연결시키면 텍스트 파일에 있는 모든 단어에 대한 빈도가 계산될 것입니다.

name = input('Enter file:')
handle = open(name)

counts = dict()
for line in handle:
    words = line.split()
    for word in words:
        counts[word] = counts.get(word,0) + 1

print(counts)
#  Enter file: words.txt

이제 여기에서 가장 많이 나온 단어를 찾아야 합니다.

이전에 배웠던 최대값을 찾는 알고리즘을 적용하되 키와 값의 쌍을 출력할 수 있도록 items 메소드를 사용하였습니다.

이 코드는 최대 빈도를 저장할 bigcount라는 변수와 가장 많이 나온 단어를 저장할 bigword라는 변수를 None으로 초기화하면서 시작됩니다.

그리고 for 반복문을 통해 counts 딕셔너리의 키는 word에, 빈도수는 count에 저장이 됩니다.

이후 count 값이 가장 큰 단어를 bigword에, 그 단어의 빈도수를 bigcount에 저장을 하고 이것을 모든 단어에 대해 반복합니다.

따라서, 반복이 종료된 후 마지막 남아있는 bigword, bigcount를 출력하면 해당 텍스트 파일에서 가장 많이 나온 단어와 그 빈도수가 출력됩니다.


bigcount = None
bigword = None
for word,count in counts.items():
    if bigcount is None or count > bigcount:
        bigword = word
        bigcount = count

print(bigword, bigcount)
# Enter file: words.txt
# to 16

텍스트 파일에서 데이터를 읽어와 가장 많이 나온 단어를 출력하는 프로그램의 전체 코드는 다음과 같습니다.

name = input('Enter file:')
handle = open(name)

counts = dict()
for line in handle:
    words = line.split()
    for word in words:
        counts[word] = counts.get(word,0) + 1

bigcount = None
bigword = None
for word,count in counts.items():
    if bigcount is None or count > bigcount:
        bigword = word
        bigcount = count

print(bigword, bigcount)
profile
성장을 도울 아카이빙 블로그

0개의 댓글