본문 바로가기
파이썬 웹 개발

[Django] 파이썬 데이터시각화 & txt 업로드, 읽기, 키워드 분석 [1]

by 배추잠자리 2022. 6. 2.
반응형

[Django] 파이썬 데이터시각화 &  txt 업로드, txt파일 읽기, 최다 키워드 찾기

[Django] 파이썬 데이터시각화 &  txt 파일업로드, txt파일 읽기, 키워드 분석하기[1]

 

파이썬 장고를 통해 txt 파일 업로드 후 txt파일의 내용을 읽어 제일 많이 언급된 키워드를 찾는 방법입니다.

파이썬 Hannanum 라이브러리를 사용할 예정입니다.

 

1. 파이썬 장고 Ajax 파일업로드( txt파일 업로드 )

2. 장고 txt파일 읽기

3. Hannanum 를 활용하여 txt파일 내용 분석하기

4. 분석된 내용을 Counter 라이브러리를 통해 최다 빈도수 키워드 찾기

5. 결과 확인

 

 

■ 파일 업로드 페이지

 

파일 업로드 html 페이지 작성

 

 

 

■ 전송 버튼 스크립트 작성

 

# 클릭이벤트 -> 파일 param 처리

버튼 클릭 후 파일 처리

 

 

# 클릭이벤트 -> txt 파일 체크

txt 파일이 아닌 경우에는 업로드를 못하게 합니다.

 

 

# 클릭이벤트 -> Ajax를 통해 처리할 URL로 보내주기

 

파일을 ajax로 보낼때는 아래와 같이 Ajax 옵션을 잘 처리해주어야 합니다.

 

enctype: 'multipart/form-data',
processData: false,
contentType: false,

 

 

■ 장고 백단(views) 메소드 작성

 

# Hannanum, Counter 를 추가

 

Hannanum 은 txt파일 내용을 분석하기 위함이고,

Counter 는 분석된 값들의 키워드 수를 세는 용도 입니다.

 

 

 

# txt파일 읽기 및 키워드 분석하기

 

Hannanum 라이브러리를 통해 txt파일 내용이 담겨는 read를 분석합니다.

당장의 리스트는 정렬도 안되있고 모든 키워드를 분석하기 때문에 Counter 라이브러리를 통해 키워드 빈도 수를 분석하고 최상위 4개만 뽑아보겠습니다.

 

 

■ 결과

 

저는 간단하게 뉴스기사를 업로드 해보았습니다.

 

 

 

Hannanum 라이브러리를 통해 분석된 키워드 중 빈도 수가 가장 많이 나온 상위 4개가 출력됩니다.

후보 6개, 국민의힘 5개, 민주당 5개, 선거 5개

 

이 데이터를 기반으로 데이터 시각화 또는 차트로 연결되면 됩니다.

 

 

 

■ HTML 소스코드

 

<!DOCTYPE html>
<html lang="en">
<head>

    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>

.filebox label {
  display: inline-block;
  padding: 10px 20px;
  color: red;
  vertical-align: middle;
  background-color: #fdfdfd;
  cursor: pointer;
  border: 1px solid gold;
  border-radius: 5px;
}

/* named upload */
.filebox .upload-name {
  display: inline-block;
  height: 35px;
  font-size:18px;
  padding: 0 10px;
  vertical-align: middle;
  background-color: #f5f5f5;
  border: 1px solid #ebebeb;
  border-radius: 5px;
}

</style>
<body>


<form>
<div class="filebox">
  <label>업로드
  <input type="file" name="file" id="attach-doc">
  </label>
</div>
</form>
<br><br>
<button id="test">파일전송 버튼</button>


</body>
<script src="https://code.jquery.com/jquery-latest.min.js"></script>
<script>
// 클릭이벤트
$("#test").on('click',function(){

    // 파일 처리
    var form = $('#attach-doc')[0];
    var formData = new FormData(form[0]);
    formData.append('file' , $('input[type=file]')[0].files[0]);


    // 확장자 유효성 체크
    if($('#attach-doc').val() != "") {
        let fileLen = $('#attach-doc').val().length;
        let fileDot = $('#attach-doc').val().lastIndexOf(".");
        let fileType = $('#attach-doc').val().substring(fileDot+1, fileLen).toLowerCase();
        var check_file_type = new Array();
        //파일 확장자 체크
        if (fileType != 'txt') {
            alert('업로드가 불가능한 확장자의 파일입니다.');
            return false;
        }
    }

    // ajax를 통해 파일 업로드 
    $.ajax({
        type: "post",
        enctype: 'multipart/form-data',
        processData: false,
        contentType: false,
        url: '{% url 'hannanum_text' %}',  // URL
        data: formData,
        dataType: "JSON",
        beforeSend: function () {
        },
        success: function (data) {

        },
        timeout: 100000 //응답제한시간 ms
    });
});


</script>
</html>

 

 

 

■ views.py 소스코드

 

 

from konlpy.tag import Hannanum
from collections import Counter

 

hannanum=Hannanum()
@csrf_exempt
def hannanum_text(request):
    if request.method == 'POST':
        file = request.FILES.get('file')  # 파일 받기
        read = file.read().decode('utf8') # 파일 읽기
        lists = hannanum.nouns(str(read)) # 파일 분석
        _counter = {}
        cnt = Counter(lists)  # 최다 빈도수 키워드 분석
        print(cnt.most_common(4))  # 최다 빈도수 키워드 4개 표출

    data = {'status': 'success'}
    response = JsonResponse(data)
    return response

 

반응형

댓글