반응형

Python에서 xlsx을 돌리면 시간이 굉장히 오래 걸리고, 제약사항 또한 많기 때문에 csv를 사용한다.

하지만 대부분의 엑셀office에서는 xlsx 에서 csv 변환이 헷갈리고 잘 안되기 때문에 그냥 python에서 아래와 같은 방법을 사용해서 파일 변환을 할 수 있다.

Python 코드

################################

### xlsx -> csv 파일변환

em_df = pd.ExcelFile('employment_results.xlsx').parse(sheet_name=0, dtype=object, engine='xlrd', verbose=True)

 

# csv는 구분자로 ","를 쓰기 때문에, 혹시 데이터 중에 ","가 있다면 이게 구분자로 쓰일 수 있으므로

# 공백으로 치환 후 csv로 변환한다.

# 공백 치환은 안전하게 string이 있는 열에만 사용한다. em_df['입사기관명/진학학교명'] = em_df['입사기관명/진학학교명'].str.replace(',',' ')

#csv로 파일 변환 em_df.to_csv(path_or_buf='employment_results.csv', sep=',', header=True, index=False, mode='w', encoding='CP949')

#em_df에 해당 csv파일 삽입 em_df = pd.read_csv('employment_results.csv', engine='c', dtype=str, sep=',', encoding='CP949')

이제 파일 변환이 제대로 되었는지 describe()와 head()를 통해 확인해보자.

Python 코드

em_df.describe() em_df.head()

 

아주 잘 들어갔다.

Good!

반응형
반응형

wPython에서 pandas pkg를 이용하여 Dataframe 작업을 할 때 열 생성/변경/삭제 작업이 많다.

단순한 열 생성/변경/삭제 작업의 경우 간단하지만, 다수 개의 조건하에 있는 열 변경 작업은 생각이 조금 필요하다.

오늘 원소 값 변경을 위해 삽질을 여러 번 하다가.. 발견한 조건에 따른 원소 값 변경 코드를 정리해본다.

1. Dataframe 생성

original dataframe으로 Name, Gender 열을 가진 간단한 df를 생성했다. 이후에는 새로운 열을 생성하고, 그 열에 대한 원소값을 변경할 것이다.

a = pd.DataFrame({'Name':['Jane','Young','Tester','Tester2'], 'Gender':['man','woman','woman','man']}) print('***** original dataframe *****') print() print(a)

2. 조건에 따른 Dataframe에 새로운 Column 생성

나는 python의 loc 와 str.contains 함수를 사용할 것이므로, 이것을 먼저 간단하게 알아보고 넘어간다.

x.loc: label(값)을 이용하여 values 그룹에 접근(indexing)하는 것.

아래 예시(Example)과 같이 label(값 = viper)에 따른 값들을 출력해주는 method이다.

str.contains: string에서 아주 유용한 함수로, 인자값에 따른 문자열을 찾아준다.

예를들어, a={"장미", "집", "배나무", "매화는 매실의 ", "가나다", "abc", "꽂", "꼽", "꽁", "꼿꼿"} 라는 배열에서 a.str.contains("꽃")을 실행하면 "꽃"을 포함한 모든 단어를 출력할 수 있다.

즉, '기업명' 이라는 열에서 'xx전자'라는 이름을 가진 기업명을 찾아 '업무분야' 라는 카테고리를 새로 만든 후, '전자'라는 값을 삽입한다고 치자. 그럴 경우 기업명엔 '삼성전자', 'LG전자', 'ABC전자'등 많은 값이 있을 지라도 이 분류는 '전자'로 처리될 수 있다.

그러면 이제 나의 예시에서 loc와 contains method를 함께 사용해본다.

a.loc[a['Gender'].str.contains("wo")]) # a['Gender']열에서 "wo"가 포함된 값의 grp을 찾는다.

그 결과값으로 1, 2번 값들이 출력된다.

그러면 이제 해당 값("wo")을 가진 그룹에 'category'라는 column을 추가하여 '여자'라는 값을 생성한다.

a.loc[a['Gender'].str.contains("wo"), 'category'] ='여자' print(a)

3. 기존 Dataframe에 새로운 조건 삽입

2번에서 category가 '여자'라고 설정된 a dataframe에 새로운 조건을 적용해본다.

a.loc[a['Gender'].str.contains("man"), 'category'] ='사람' #man이 포함된 경우 '사람'을 입력한다. print(a)

* np.where()

: 배열 요소를 검색해 인덱스를 반환. 검색 조건을 응용하여 True, False 형태로 많이 사용함.

(예시) 1. dataframe에서 '입사기관명/진학학교명' 값들의 대분류를 만들기 위해, 기존 df에 'Category' 열을 삽입하고, '화학' or '에너지' or 환경 키워드를 포함한 입사원들에 대해 '화학.에너지.환경'의 데이터를 category로 입력해준다.

1) 초기 dataframe의 행은 3511명의 data로 구성되어 있다. 3번 순번을 가진 사람은 'LG화학'에 입사했으므로 'Category'열에 '화학.에너지.환경'이라는 값을 가질 것이다.

2) '화학' or '에너지' or '환경' 키워드를 포함한 입사기관명/진학학교명을 찾아, 그 값이 포함되었을 경우 'True', 미포함했을 경우 'False'로 값이 생성된다.

em_df['Category'] = em_df['입사기관명/진학학교명'].str.contains('화학' or '에너지' or '환경') em_df.head()

3) 그리고 True값을 가진 열을 '화학.에너지.환경'으로 값을 치환시킨다.

em_df['Category'] = np.where(em_df['Category']==True,'화학·에너지·환경', em_df['Category']) em_df.head()

4) 치환이 잘 됐는지 확인해본다.

2, 49, 66, ... 번의 사람들이 화학/에너지/환경 분야에 취업또는 진학했다.

*** 하지만 이렇게 np.where, str.contains을 사용해서는 여러 조건에 대한 값을 변경할 수 없다.

왜냐? 화학.에너지.환경으로 이미 바뀐 값들이 텔레캅/미작성에 대해 True/False를 다시 하게되면,

이전 바뀌었던 화학.에너지.환경은, 텔레캅/미작성 조건에서는 False가 되어버리기 때문이다.

+ str.contains에서 or을 쓸 경우 앞의 값만 체크가 된다! '미작성'값 Category는 '테스트중'으로 바뀌지 않았다.

즉, 여러 조건을 중첩하여 값을 바꿀 때엔 아래와 같이 loc를 사용해야한다.

em_df.loc[em_df['입사기관명/진학학교명'].str.contains("화학"), 'category'] ='화학' em_df.loc[em_df['입사기관명/진학학교명'].str.contains("텔레캅"), 'category'] ='테스트중' em_df.head()

오늘 몇 시간 삽질한 결과.... 다행히 정리됐다.

구글링을 많이 해봤지만 loc를 여러 조건을 통해 중첩시키는 예제는 없고,

중첩되는 조건을 쓰는 건 쉬운 숫자값들밖에 없었다.

+ 내용은 제대로 안알려주고 광고만 덕지덕지 붙은 티스토리, 네이버블로그 들까지...

나는 정말 나뿐만 아니라 남들에게도 도움이 되는 글을 쓰고싶다. 

오늘의 삽질 끄읕!!

 

반응형
반응형

딥러닝을 돌리기 위해 텐서플로우(tensorflow)에서 필요한 패키지가 몇 가지 있는데, 그 중 opencsv 및 cv2가 설치되지 않는 문제가 있다.

powershell 에서 pip install opencv, pip install cv2로 해당 패키지를 설치하게 되면 아래와 같은 에러가 발생하여 설치가 실패되는데, 이유는 python 패키지 이름이 아니기 때문에 에러가 발생한다.

이들은 둘 다 pip에서 설치할 수있는 opencv-python 패키지의 일부로 포함되어 있는데, 한번 설치해보자.

pip install cv2 pip install opencv 실행 결과 PS C:\Users\BAEK> pip install cv2 ERROR: Could not find a version that satisfies the requirement cv2 (from versions: none) ERROR: No matching distribution found for cv2

 

대안으로 opencv-python 설치하기

# pip install opencv-python

PS C:\Users\BAEK> pip install opencv-python Collecting opencv-python Downloading opencv_python-4.2.0.34-cp38-cp38-win_amd64.whl (33.1 MB) |████████████████████████████████| 33.1 MB 211 kB/s Requirement already satisfied: numpy>=1.17.3 in c:\users\baek\appdata\local\programs\python\python38\lib\site-packages (from opencv-python) (1.18.2) Installing collected packages: opencv-python Successfully installed opencv-python-4.2.0.34

설치 잘 됐다. 이제 다음 에러는...

반응형
반응형

Colab은 Google에서 제공하는 클라우드기반 가상 개발환경이다.

일반적으로 Python은 PyCharm 또는 Jupyter notebook을 많이 사용하는데, PyCharm의 경우 한줄한줄 코딩이 되지 않아 불편한 점이 있고 Jupyter notebook의 경우 윈도우 환경 제약을 간혹 받게 된다.

본인 또한 인공지능1 수업의 프로젝트를 진행하려다가 Jupyter notebook에서 딥러닝 관련 pkg가 설치되지 않아 구글링 끝에 Colab을 발견하여 사용하게 되었다.

별도의 설치없이 구글 계정만 있으면 사용 가능하고, 별도의 제약사항또한 없어 아주 잘 사용하고 있다!

즉, 인터넷만 가능하다면 언제어디서든 코딩이 가능하며 (아직까진)제약사항이 없어 모든이들에게 정말 추천한다.

구글은 아래와 같이 Colab을 소개한다.

Colaboratory(또는 줄여서 'Colab')를 사용하면 브라우저에서 Python을 작성하고 실행할 수 있습니다.

- 구성 필요 없음

- GPU 무료 액세스

- 간편한 공유

학생이든, 데이터 과학자든, AI 연구원이든 Colab으로 업무를 더욱 간편하게 처리할 수 있습니다. Colab 소개 영상에서 자세한 내용을 확인하거나 아래에서 시작해 보세요.

UI는 위와 같다. 거의 Jupyter notebook과 동일하다고 보면 된다.

하지만 Jupyter notebook에서 제약있는 몇몇의 패키지가 Colab에선 문제 없이 잘 설치되고, Colab 자체가 python 등 별도의 프로그램 설치 없이 코딩이 가능하다. 특히 딥러닝을 몇 개 돌려보았는데 문제없이 잘 돌아간다.

Google Colab 주소

https://colab.research.google.com/notebooks/intro.ipynb#scrollTo=5fCEDCU_qrC0

 

Google Colaboratory

설정에서 어두운 테마 옵션을 확인해 보세요.

colab.research.google.com

Colab 기본 설정 및 구성

아래 블로그에 해당 내용이 굉장히 잘 설명되어 있어 링크를 첨부한다. (본인과 관련 1도 없읍니다. 정말 유용해요.)

https://theorydb.github.io/dev/2019/08/23/dev-ml-colab/

[Colab] Google Colab (코랩) 환경설정 및 사용법

개요 파이썬을 활용한 머신러닝의 첫 관문! 구글 Colab(코랩)의 환경구성 및 기본 사용법을 다룬 포스트입니다. 목차 Colab이란 무엇인가? Colab 환경설정 Colab을 활용한 간단한 예제 작성 Colab & Markdown Colab이란 무엇인가? 구글 코랩(Colab)은 클라우드 기반의 무료 Jupyter 노트북 개발 환경이다. 내부적으로는 코랩 + 구글드라이브 + 도커 + 리눅스 + 구글클라우드의 기술스택으로 이루어진...

theorydb.github.io

[출처] [Colab] 구글 코랩(Google Colaboratory): Jupyter notebook보다 편한 python 개발 환경|작성자 사색

반응형
반응형

인공지능1 기말과제로 제출한 개인 프로젝트이다. 기말고사를 열심히 공부하느라(?) 과제에는 많은 힘을 쏟진 못하였다... 그래도 언젠가는 도움이될 것 같아서 제출한 과제 그대로 복붙을 해본다.

요약

Object detection을 주제로 인공지능1 이미지분석 개인프로젝트를 진행하였다. 이미지 분석에는 Classification, Object detection 등이 존재하나 Object detection이 결국 Classification이 포함되며, 더 심화되는 개념으로 Object Detection에 대해 금번 프로젝트로 정리해보았다. 해당 분석을 진행하기 위해 제2장에서 CNN, R-CNN, Fast R-CNN, Faster R-CNN 그리고 SSD(Sigle Shot Multi-box Detector)에 대한 이론을 정리하였으며, 제 3장에서는, Google에서 제공하는 Tensorflow Hub를 통해 Faster R-CNN과 SSD+mobilenet v2 모듈을 다운받아 구현함으로써 해당 방법론들에 대한 결과값과 소요시간을 계산하고 Output 이미지를 확인해보았다.

제 1 장 서론

현재 인공지능은 인간과 기계사이의 능력 격차를 해소하는 획기적인 성장을 기록해오고 있다. 연구원들은 기계(Machine)가 놀라운 성과를 거둘 수 있도록 수많은 필드의 방면을 연구하는데, 그런 많은 분야 중 하나가 Computer Vision이다. 이 분야는 기계가 인간처럼 세상을 보고, 비슷한 방식으로 인지하고, 심지어 이미지&비디오 인식(Image & Video recognition), 이미지분석&분류(Image Analysis & Classification), 미디어 재생산(Media Recreation), 추천시스템(Recommendation Systems), 자연어처리(Natural Language Processing) 같은 다수 작업에 지식을 사용할 수 있도록 한다. 딥러닝(Deep Learning)과 함께하는 Computer Vision의 발전은 주로 특정한 알고리즘인 CNN을 통해 구성되며 시간에 따라 완벽해지고 있다.

금번 과제의 구성은 제2장에서 CNN의 발전과정(CNN, R-CNN, Fast R-CNN, Faster R-CNN)에 대해 이론적으로 알아본 뒤, 제 3장에서 R-CNN 코드 구현을 통해 이미지를 예측 및 결과에 대해 기술하였다. 제4장 결론에서는 금번 프로젝트 내용을 정리하고 한계점에 대해 기술하였다.

제 2 장 CNN의 발전과정 및 SSD

2.1. CNN (Convolutional Neural Networks)

CNN(Convolutional Neural Network)은 딥러닝 알고리즘(Deep Learning Algorithm)으로, 이미지를 입력하여 이미지 내 다양한 측면/객체의 가중치(learnable weights, biases)를 할당하여 각각을 서로 다른 것으로 구별할 수 있게 할 수 있다. 전처리과정은 다른 분류 알고리즘과 비교했을 때 훨씬 적어 계산에 편리하며, 이전 방법에서 필터는 직접 손으로 동작하도록(hand-engineered) 설계되어 충분한 training을 진행해야 했지만, CNN은 이러한 필터/특성을 스스로 학습할 수 있는 능력을 가지고 있다. CNN의 구조는 인간 뇌에 있는 뉴런의 연결 패턴과 유사하며, 개별 뉴런은 Receptive Field로 알려져 있는 visual field의 제한된 영역에서만 자극에 반응한다. 인공지능1 수업에서 배웠듯, 해당 필드의 집합이 이미지 전체를 다루기 위해 아래 ‘[그림-1] CNN sequence to classify handwritten digits’ 과 같이 손으로 쓴 숫자를 CNN에서 분류하기위해CONV, RELU, POOL, FC layer가 사용되며, Convolution layer에서는 tensor를 입력 받아 영역별로 weights를 곱해 각 뉴런의 아웃풋을 계산한다. 여기서 filter라는 개념이 추가되는데, filter가 많아질수록 결과 값이 복잡해지기 때문에, 이후 Pooling layer를 통해 이미지를 downsizing 하여 계산결과가 작아지게 된다. 최종적으로는 FC(Fully Connected) Layer를 사용하여 class의 점수를 계산하게 된다. 각 layer내에서는 계산을 위해 Padding, Filter, Stride등 여러 Hyperparameters가 사용된다.

그림 1. A CNN sequence to classify handwritten digits

 

2.2. R-CNN (Regions with Convolutional Neural Networks)

RCNN은 CNN을 본격 이용하여 딥러닝 기반 이미지 분류기를 feature extractor로 사용하여 object detection, segmentation에서 높은 보였다는 점에서 주목을 끌었다. 최초의 R-CNN 논문에서의 문제 정의는 1) Localizing objects with DNN, 2) Training a high-capacity model with small quantity of annotated detection data로 완전히 새로운 방식이 아닌, Neural Network 기반의 detection feature extractor를 만들어내려고 시도했던 것으로 판단한다. R-CNN은 크게 아래 4가지 방법으로 나뉜다.

그림 2. R-CNN 학습 구조

1) Input image: 이미지를 입력한다.

2) Region proposal algorithm

대상의 class를 구분하지 않고 이미지로부터 region을 추출해낸다. 알고리즘은 상관없으며 비슷한 질감이나 색, 강도를 가진 인접한 픽셀들을 연결하여 bounding box를 구성하는 Selective search 방법 등을 이용한다. 이 방법으로 생성된 bounding box의 output을 다시 CNN 레이어의 input으로 활용하고, input으로 변환하는 과정에서 압축(warp)을 한다.

3) CNN: Feature vector extract

앞 단계에서 생성한 region을 압축한 input으로, 미리 training된 CNN 모듈에 통과시켜 새로운 Feature를 생성한다. AlexNet, VGGNet을 기반으로 튜닝 과정을 거친 CNN 모델을 사용한다. 기존의 CNN Classifier에서 최종 softmax 분류기 부분을 제외한 output을 결과물 feature로 사용하는데, 예를 들면 Kaggle이나 다른 분석 대회용 dataset을 보면 불분명한 image feature들이 존재하는 경우가 있는데, 이 feature를 나타낸 다는 것이 그 예이고, 이 결과물을 fixed-length feature vector라고 부른다.

4) Classify Algorithm

마지막으로 Fixed-length feature vector를 input으로 하는 분류기를 추가한다. Region proposal 단계에서 생성된 object를 CNN 레이어에 통과시켜 fixed-length feature vector로 변환한다. 그리고 이 input값을 바탕으로 객체여부를 분류한다. 이 단계를 나눈 이유는, 도메인 목적에 맞는 분류기를 설정 및 유효한 영역 판별을 판단하기 위함이다.

 

2.3. Fast R-CNN

Fast R-CNN은 R-CNN으로부터 속도를 개선시키기 위해 Rol pooling을 중간 과정에 삽입, 연산을 급격하게 줄여 속도를 개선시킨 모델이다. 기존 R-CNN은 RP(Region Proposal)마다 CNN을 적용했기 때문에 Selective search * CNN의 연산을 수행했지만, Fast R-CNN은 (Selective search +Rol Pooling) *1의 연산으로 급격하게 연산이 줄었다.

그림 3. Fast-CNN 구조

 

2.4. Faster R-CNN

Fast R-CNN을 통해 많은 시간과 비용이 절약되었지만, RP(Region Proposal) 생성 자체에 많은 시간이 소요되었다. Fast R-CNN에서는 selective search를 수행하는 region proposal이 외부에 존재하여 inference에서 병목(Bottleneck)을 일으켰기 때문에, Faster R-CNN에서는 RPN(Region Proposal Network) 자체를 학습함으로써 selective search 없이 RPN을 학습하는 구조로 모델이 만들어졌다. RPN은 Feature map을 input으로, RP를 output으로 하는 네트워크이며, selective search의 역할을 온전히 대체한다. 또한, Fast R-CNN의 경우 Selective search가 주는 bounding box 좌표를 이용하여 학습했지만, Faster R-CNN은 미리 정의한 reference bounding box인 anchor라는 개념을 도입하여 다양한 크기와 비율로 n개의 anchor를 미리 정의하여 sliding window시 sliding 마다 n개의 bounding box 후보를 생성하여 이미지를 학습하게 된다.

그림 4. Faster R-CNN RPN

 

2.5. SSD(Single Shot Multi-Box Detector)

Faster R-CNN이 등장한 후 더 빠르고 강력한 Detector인 SSD가 등장했다. Faster R-CNN은 기존 R-CNN의 속도와 비용을 개선했지만 7FPS with mAP 73.2% 의 느린 속도에 실시간 영상분석에 사용할 수 없었다. YOLO는 속도는 빨랐으나 45FPS with mAP 63.4%로 성능을 포기해야 했다. 하지만 SSD는 기존 R-CNN에서 사용했던 RP 추출 및 Resampling 과정을 제거하여 59FPS with mAP 74.3%으로 높은 정확성과 빠른 속도를 모두 얻어냈다. SSD는 말 그대로 사진의 변형 없이 그 한장으로 훈련, 검출을 하는 Detector이다. 기존 CNN에서는 이미지에서 객체 유무를 판단하기 위해 그림을 자르거나 변형해야 하여 오랜 시간이 소요되었지만, SSD는 기존 구조 뒤 보조 구조를 붙여 얻은 Multi-scale feature maps을 이용하여 이 문제를 해결하였다. 아래 사진에서 개의 크기는 사진의 1/3이지만, 고양이는 1/6정도로 둘 간 크기 차이가 크다. 이를 한 가지 feature map에서 구하려면 bounding box의 크기 차이로 인해 box의 크기 추정, 위치추정까지 많은 과정이 필요하다. SSD는 feature map을 여러 개의 크기로 만들어서 큰 map에서는 작은 물체의 검출을, 작은 map에서는 큰 물체의 검출을 하도록 만들어 이 방식은 resampling을 없애면서도 정확도 높은 결과를 도출하게 되었다.

그림 5. SSD feature map

 

제 3 장 Faster R-CNN & SSD+mobilenetV2 Object Detection 실습

Faster R-CNN패키지와 SSD+mobilenetV2 Object Detection 패키지를 활용하여 Object Detection을 진행하였다. 페이지 용량 문제로 코드는 주석처리를 포함하여 GitHub에 업로드 하였으며, 해당 페이지에서는 Input image에 따른 각 Detection별 Output만 기술한다.

2.1. Input Image 및 Object detection 결과

Input 이미지는 우리학교 NEW H 에서 찍은 사진으로 faster R-CNN과 SSD를 적용하였다.

좌측 결과가 faster R-CNN 적용, 우측 결과가 SSD 적용 결과이다. 이론대로 SSD가 더 빠른 Detection time(Inference time)을 가지고 더 많은 object를 탐지함을 알 수 있었다.

* 코드는 다른 포스팅으로 이어서 업로드하겠다.

 

 

제 4 장 결론 및 한계점

인공지능1 수업에서 간략히 다룬 R-CNN에 대해 이론적으로 더 알아보고, 실제 코드 적용을 통해 Object Detection을 확인하였다는 데에 의의가 있다. 하지만 R-CNN, Fast R-CNN, Faster R-CNN에 대해 Google의 TensorFlow Hub에서 Faster R-CNN을 제외한 패키지를 찾지 못하여 직접 Inference Time과 Accuracy 측정값을 비교해보지 못하였다. 아쉬움을 극복하기 위해 Object detection 분야에서 small하고 fast한 장점을 가진 SSD-based object detection model을 함께 학습해보았고, 실제로 SSD 모듈이 Faster R-CNN보다 2배이상 빠르고 많은 예측을 가짐을 확인할 수 있었다. 해당 코드와 결과는 Github에 주석을 포함하여 업로드 하였다.

 

참고 문헌

Sumit Saha(2018), A Comprehensive Guide to Convolutional Neural Networks — the ELI5 way

Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik(2014), Rich feature hierarchies for accurate object detection and semantic segmentation Tech report (v5)

Shaoquing Ren, Kaiming He, Ross Girshick, and Jian Sun(2016), Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

Matthijs hollemans(2018), MobileNetV2 + SSDLite with Core ML

Wei Liu 외(2016), SSD: Single Shot MultiBox Detector

전지원(2017), Single Shot MultiBox Detector 리뷰

반응형
반응형

python에서 textmining등 한글text 분석을 위해서는 konlpy 설치가 필요하다.

konlpy는 단순히 pip install로 끝나는 것이 아니라 java설치 등 선행되는 작업이 많으므로 아래 절차를 차근차근 진행해야한다.

아래절차를 선행하지 않는다면 본인처럼 엄청난 에러메세지를 마주하게 될 것이다...

차근차근 설치방법을 포스팅.

 

0. KoNLPy 제공자의 가이드 확인

https://konlpy-ko.readthedocs.io/ko/v0.4.3/install/

 

설치하기 — KoNLPy 0.4.3 documentation

주석 설치 및 사용 도중 문제가 발생하는 경우 다음 페이지들을 참고해주세요: 리눅스. 맥 OS. 윈도우. 발생한 문제가 어디에도 없는 경우 “New Issue” 버튼을 눌러 새로운 이슈를 생성해주시기

konlpy-ko.readthedocs.io

 

0-1) 윈도우의 경우 아래와 같음

1. Java 1.7+ 설치

* konlpy를 pip install로 설치하기 전 아래 절차를 먼저 수행한다.

안그러면 설치 후 다 꼬여버려서 에러나고 난리난다! (본인)

1) 본인 OS 정보 확인

2) Java 다운로드 사이트 접속 및 본인 OS에 맞는 버전 설치

https://www.oracle.com/technetwork/java/javase/downloads/jdk13-downloads-5672538.html

윈도우 64bit일 경우, Accept License Agreement 클릭 후 가장 하단 windows-x64_bin.zip 다운로드

이후 압축풀고 실행

2. JAVA_HOME 설정

1) jvm.dll 경로 확인

jvm.dll 파일이 있는 경로를 환경변수에 입력해줘야한다.

설치된 파일이 어디에 있는지 경로 확인 후(나는 Everything 프로그램으로 확인했다.)

* 나는 여러 목적들로 다운받은 적이 많아서 여러 개가 뜨는데, 초기 설정했을 경우 1-2개만 뜰 것이다.

 

2) 시스템 > 고급시스템설정 > 고급 > 환경변수

3) 사용자변수 새로만들기

4) JAVA_HOME 등록 후 저장

3. jPype1 (>=0.5.7) 다운로드

1) pip 최신버전 업데이트 및 python 버전 확인

# pip install --upgrade pip

# python

Python 3.6.7 on win32

2) jPype1 다운로드

https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype

 

Python Extension Packages for Windows - Christoph Gohlke

Many binaries depend on numpy-1.16+mkl and the current Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019 for Python 3, or the Microsoft Visual C++ 2008 Redistributable Package x64 , x86 , and SP1 for Python 2.7. Install numpy+mkl before other packages that depend on it. The ...

www.lfd.uci.edu

3) 본인 python 버전에 맞는 JPype 다운로드

나는 python 3.6.7 이며 32bit으로 다운받았기 때문에 cp36-win32.whl를 다운받아야한다.

* 본인 피씨 OS버전이 아니라 Python의 버전에 따라야한다. (내 pc는 64bit이지만 python은 32bit)

4. konlpy 설치

 

끝!

반응형
반응형

텍스트마이닝을 업로드하던 중 사전 진행필요한 절차가 많아 크롬드라이버 설치 및 konlpy등을 먼저 포스팅.

크롬드라이버는 crawling을 위해 필요한 프로그램으로 크롤링 시 추가적인 창을 띄워 정보들을 가져올 수 있음.

1. 크롬드라이버 다운로드 사이트 접속

https://chromedriver.chromium.org/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

chromedriver.chromium.org

2. 본인 크롬 버전에 맞는 드라이버를 선택

* 본인 크롬 버전 보는법

크롬 접속 > 더보기 > 도움말 > Chrome 정보(G)

버전 확인 (79.0~)

3. 이후 본인 OS에 따라 zip 다운로드

4. 다운 후, 해당 파일(exe)을 python을 돌릴 directory 안에 업로드

5. 테스트 해보기

패키지 import시 selenium을 import한 후 아래 코드를 통해 새로운 창이 open 되는 것을 확인

# 패키지 import

import datetime as dt

import pandas as pd

import requests

import time

import urllib.request #

import re

import konlpy

from bs4 import BeautifulSoup

from pandas import DataFrame

from selenium.webdriver import Chrome

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.keys import Keys

#크롬드라이버 연결

delay=0.1

browser = Chrome()

browser.implicitly_wait(delay)

start_url = 'https://www.youtube.com/channel/UCtckgmUcpzqGnzcs7xEqMzQ/videos'

browser.get(start_url)

browser.maximize_window()

body = browser.find_element_by_tag_name('body')#스크롤하기 위해 소스 추출

num_of_pagedowns = 30

#스크롤다운

while num_of_pagedowns:

body.send_keys(Keys.PAGE_DOWN)

time.sleep(0.1)

num_of_pagedowns -= 1

 

*** jupyter notebook사용 시 powershell에서 사전에 pip을 통해 selenium을 다운해야함

끝~!!

반응형
반응형

[텍스트마이닝] 유튜브 크리에이터 비교 및 분석 with python

이것은 3학년 텍스트마이닝 수업 과제로 진행했던 유튜버 크리에이터 분석이다. 오늘부터 차근차근 정리해보려고 한다. : )

1. 분석할 데이터 및 목표

- 유튜브 인기채널인 '펭수'와 '워크맨'을 전반적으로 크롤링.

- 어떤영상이 인기가 가장 많은지, 인기가 많은 요인은 무엇인지 게시글 및 댓글 분석

* 기존에 네이버부동산을 크롤링하여 원하는 조건(평수, 지역, 지하철역 등)에 따라 집을 추천해주는 추천서비스를 만들어보려 하였으나, 태그를 크롤링해오지 못하는 문제가 있어 주제를 변경함ㅜㅜ

 

1-2. DataSet 소개

1) 최종적으로는 2개의 Dataset

: 펭수 및 워크맨 영상(paw), 각 동영상별 댓글(paw_reply)

* 펭수 및 워크맨은 각각 1개의 dataset이나 결국 2개를 1개로 합침(paw)

2) 코드 파일은 총 4개

- 1, 2: 는 각 영상(Pengsu, workman)의 dataset 분석 코드

- 3: 1,2를 합친 코드 + 머신러닝

- 4: 3을 통해 NMF(Non-negative matrix factorization, NMF)를 진행한 것

2. 코드 설명

2-1. Pengsu, Workman Dataset 코드: 펭수 및 워크맨 코드 개별 구현 후 전처리에서 병합.

1) 패키지 import: 두 파일 모두 동일

* Konlpy: 한국어 분석을 위한 패키지. 형태소 분석, 명사 분석 등 한국어에 특화된 분석 가능

- Konlpy를 사용하기 위해서는 부가적으로 java설치 및 환경변수 설정 등 먼 여행을 떠나야한다.

이건 추후 포스팅

* selenium: 웹 브라우저를 제어하는 패키지. 유투브 화면 클릭, 스크롤 제어 등에 사용

# 패키지 import

import datetime as dt

import pandas as pd

import requests

import time

import urllib.request #

import re

import konlpy

from bs4 import BeautifulSoup

from pandas import DataFrame

from selenium.webdriver import Chrome

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.keys import Keys

2) Data 입력: Chrome Driver, Crawling

Chrome Driver를 통해 별도 창을 Open 후, 해당 창에서 data를 crawling함

스크롤 다운이 필요한 페이지이므로 스크롤제어를 사용.

* num_of_pagedowns를 조정하여 스크롤 횟수를 지정

#크롬드라이버 연결

delay=0.1

browser = Chrome()

browser.implicitly_wait(delay)

start_url = 'https://www.youtube.com/channel/UCtckgmUcpzqGnzcs7xEqMzQ/videos'

browser.get(start_url)

browser.maximize_window()

body = browser.find_element_by_tag_name('body')#스크롤하기 위해 소스 추출

num_of_pagedowns = 30

#스크롤 다운

while num_of_pagedowns:

body.send_keys(Keys.PAGE_DOWN)

time.sleep(0.1)

num_of_pagedowns -= 1

이를 실행하면 아래와 같이 추가적인 창이 실행된다. (미리 크롬드라이버 설치필요. 설치 링크는 아래!)

https://countrymouse.tistory.com/entry/ChromeDriver

 

크롬드라이버(Chrome Driver) 설치, 다운로드

텍스트마이닝을 업로드하던 중 사전 진행필요한 절차가 많아 크롬드라이버 설치 및 konlpy등을 먼저 포스팅. 크롬드라이버는 crawling을 위해 필요한 프로그램으로 크롤링 시 추가적인 창을 띄워

countrymouse.tistory.com

 

# 페이지 소스 받아오기

html0 = browser.page_source

html = BeautifulSoup(html0,'html.parser')

# 리스트 선언

title_list = [] #제목 리스트 생성

href_list = [] #주소 리스트 생성

viewcountmake_list = [] #조회수 크롤링 위한 리스트 생성

viewcount_list = [] #조회수 리스트 생성

# 구독자 수 저장

subsc = html.find(id="subscriber-count").text

subsc = subsc[4:]

# title 저장

for tr in html.find_all(id="video-title"):

title = tr.get('title')

title_list.append(title)

#href 태그 내용 저장

for tr in html.find_all(id="video-title"):

href = tr.get('href')

href_list.append(href)

# 조회수 저장

for tr in html.find_all('span', class_="style-scope ytd-grid-video-renderer"):

viewcount = tr.get_text('span')

viewcountmake_list.append(viewcount)

contents_count = len(title_list)

#구독자수, 동영상 수

print("구독자 수:",subsc, ",영상 개수:", contents_count)

간단하게 썸네일에 있는 정보로 dataframe을 만들어서 값을 잘 받아왔는지 확인해본다.

intro_df = pd.DataFrame({'구분': "펭수", '구독자':subsc, '영상수':contents_count}, index = [1])

intro_df.head()

#전처리 전 title, 주소, 좋아요수 데이터프레임 생성

print(len(title_list), len(href_list), len(viewcountmake_list))

# viewcountmake_list의 경우 조회수와 등록일이 각각 생성되어 list크기가 다름 -> 데이터프레임 생성 불가

# 데이터 클리닝 작업(조회수와 등록일에서 등록일 제거)

for tr in range(0,len(viewcountmake_list),2):

a = viewcountmake_list[tr]

viewcount_list.append(a)

# 조회수 데이터 전처리

clean_viewcount = []

for i in viewcount_list:

a = i[4:-2]

amul = float(a)*10000

clean_viewcount.append(int(amul))

print(clean_viewcount)

#title, 주소, 좋아요수 데이터프레임 생성

peng_list = pd.DataFrame({'title':title_list, 'href':href_list, 'viewcount':clean_viewcount})

peng_list.head()

#viewcount순으로 정렬

peng_list.sort_values(by=['viewcount'], axis=0, ascending=False)

여기까지 영상에 대한 기본적인 dataframe이 저장되었다.

글이 많이 길어지는 관계로 다음 화에서는 각 영상별 제목 / 본문내용 / 조회수 / 좋아요 / 싫어요 / 작성일 / 주소 dataframe을 생성,

그 후에는 시각화 및 머신러닝을 진행할 예정이다!

 

반응형

+ Recent posts