[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
'파이썬 웹 개발' 카테고리의 다른 글
[Django] SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async (0) | 2022.07.26 |
---|---|
[Django] No module named 'googleapiclient' 설치 에러 해결 (0) | 2022.07.14 |
[Django] 장고 ORM vs raw 성능 비교하기 (0) | 2022.05.25 |
[Django] The Zen of Python, by Tim Peters _출력구문에서 제거하는 방법 (0) | 2022.05.20 |
[Django] 파이썬 장고 네이버 검색 API _ 뉴스 검색 (0) | 2022.05.14 |
댓글