본문 바로가기

Python 카테고리

텍스트 단어 개수, 단어 빈도 순서(오름차순, 내림차순) 구하기

 

a.txt

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

나는 정말 착한 아이입니다. 정말 정말정말

 

먼저 텍스트가 적혀있는 파일을 연결하기 위해 텍스트 파일을 연결하는 코드를 작성합니다.

 

file = open("a.txt", type)

 

file이라는 변수를 만들어주고 open()을 사용하여 텍스트가 적혀있는 파일 경로를 앞에 입력해 줍니다.

 

타입에는 r, w, a가 있습니다.

 

r(read)은 파일을 읽기 위해 사용하는 타입입니다.

 

w(write)는 파일을 쓰기 위해 사용하는 타입입니다.

 

a(add)는 마지막에 내용을 추가하기 위해 사용하는 타입입니다.

 

저희는 파일을 읽어서 찾아야 하기 때문에 r을 씁니다.

 

이제 단어를 출력할 때 특수문자가 나오면 안 되기 때문에 특수문자들을 삭제해야 합니다. 코드는 아래와 같습니다.

 

import re

delete = re.sub([내가 없앨 특수문자], "", file.read())

 

re를 import 선언을 해준 뒤 sub()를 사용하여 특수문자를 없애줍니다. 마지막 file.read( )는  위에 file이라는 변수를 읽어

 

냅니다.

 

이제 특수문자를 없앤 텍스트 파일을 단어로 나누어 주어야 합니다. 코드는 아래와 같습니다.

 

read = delete.split()

relen = len(read)

print("단어 수: %d" % relen)

 

특수문자를 없애 준 delete(읽어낸 텍스트 파일)를  split( ) 안에 아무것도 넣지 않았으니 띄어쓰기, 공백, 엔터로 나눕니

 

다. 그렇게 된다면 '정말', '정말정말'은 다른 단어로 표시됩니다. 그렇게 문장들이 단어로 나누어지고 len(read)로 read라

 

는 리스트에 담긴 단어들의 개수를 relen에 저장합니다. 그리고 print("단어 수: %d" % relen)로 relen을 출력하면 총 6 단

 

어가 나오게 됩니다.  ['나는', '정말', '착한', '아이입니다', '정말', '정말정말'] 앞에서 '.'을 특수기호에서 지워준다면 '아이입

 

니다'에서 '.'이 붙여지지 않고 리스트에 저장이 됩니다. 이렇게 하면 단어의 개수를 출력하였고, 이제 단어의 빈도수를

 

오름차순, 내림차순으로 정렬을 하여 출력해볼 겁니다.

 

먼저 read라는 단어들이 담긴 리스트를 이용하여 개수를 셀 겁니다. 첫 번째 for문으로 0부터 relen까지 도는 i라는 지역

 

변수를 만들어줍니다. 그리고 개수를 세기 위한 변수 = 0을 만들어줍니다. 그리고 read라는 리스트 안에 있는 첫 번째 단

 

어부터 read의 단어들을 한 번씩 비교하기 위해 for문을 하나 더 사용해 줄 것입니다. 이제 read[i]와 read[j]가 같다면

 

plus 1씩 더해줍니다. 코드는 아래와 같습니다.

 

 Di = {}
 
 for i in range(relen):
     plus = 0
     for j in range(relen):
         if read[i] == read[j]:
           	  plus += 1
     Di[read[i]] = plus

  

 

2 번째 for문이 한 번 돌게 되면 read[i] 단어는 read[0] 번째 단어와 비교한 뒤 같으면 plus에 1씩 더하고 아니라면 그냥

 

패스한 후 j가 1씩 늘어나면서 read[i]가 read [1] 번째 단어와 비교하게 됩니다. 그리고 2 번째 for문이 끝나면 Di라는 딕

 

셔너리 자료형으로 read[i](key): plus(value)로 추가합니다. 리스트가 아닌 딕셔너리로 하는 이유는 중복된 단어를 다시

 

출력 하지 않기 위해 딕셔너리로 합니다. 이제 read[i]가 모든 단어들과 비교를 하게 되면 read[i]는 1이 늘어나고 plus는

 

0으로 다시 초기화한 후 다시 2 번째 for문으로 들어가 비교를 하여 끝나면 다시 Di에 들어가 저장되는 방식입니다.

 

이제 Di는 단어:개수 이렇게 담겨 있을 것입니다. 이것을 그냥 출력하게 되면 딕셔너리 자료형이 그대로 출력이 됩니다.

 

하지만 우리는 오름차순, 내림차순으로 출력하기 위해 Di를 오름차순, 내림차순으로 변경해줍니다.

 

De = sorted(Di.items(), key=lambda x: x[1])

As = sorted(Di.items(), key=lambda x: x[1], reverse=True)

 

이렇게 해주면 Di.items()(Di에 들어가 있는 단어:개수가 쌍으로 나온다)들이 De에 리스트 형태로 저장이 됩니다.

 

reverse=True는 저장한 형태를 순서를 바꾸어줍니다. 그렇게 De(내림차순), As(오름차순)으로 저장이 됩니다.

 

이제 출력을 하기만 하면 됩니다. 한 줄씩 출력하기 위해 Di의 개수를  for문을 이용해 사용해줍니다.

 

코드는 아래와 같습니다.

 

Dil = len(Di)

for g in range(Dil):
	print("\'%s\'의 개수 : %s" % (De[g][0], De[g][1]))

for g in range(Dil):
	print("\'%s\'의 개수 : %s" % (As[g][0], As[g][1]))

 

for문의 범위를 설정하기 위해 len(Di)을 사용하여 쌍의 개수를 구한 후 Dil만큼 for문을 돕니다.

 

거기서 De[g][0]은 단어를 의미하고 De[g][1]은 개수를 의미합니다.  이유--> De = [( '나는' , 1), ('정말' : 2), .....]

 

리스트 형태로 변한 것이니 [g] == g번째 쌍(key : value), [g][0] == [g]번째 쌍의 0 번째를 인덱싱 

 

이렇게 오름차순, 내림차순으로 출력까지 끝났습니다.

'Python 카테고리' 카테고리의 다른 글

CodeUp 1001~1010(★☆☆☆☆)  (0) 2019.09.15
random 함수 이용 (러시안 룰렛)  (0) 2019.08.22
Python 집합(set) 자료형  (0) 2019.06.19
Python 사전(Dictionary) 자료형  (0) 2019.06.19
Python 튜플(Tuple) 자료형  (0) 2019.06.18