반응형
반응형

hsplit(array, number) 수평으로 쪼개기

vsplit(array, number) 수직으로 쪼개기

dsplit(array, number) 깊게 쪼개기

split(array, number, axis) 쪼개기 axis=0 수직으로 axis=1 수평으로



dsplit 쪼개기



반응형

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

[OpenCV] face detection  (0) 2018.06.28
[OpenCV] 영상 얼굴 인식 (face detection)  (0) 2018.06.28
2. python3 py파일 exe 실행파일 만들기  (0) 2017.12.31
1. python3 py파일 exe 실행파일 만들기  (0) 2017.12.31
np.newaxis  (0) 2017.12.28
반응형

앞에 설명한 것에 이어서  인제 앞에서 짠것과 같은 코드를 DeviceFarm에 올리는 방법에 대해 설명하겠다. 그냥 지금 프로젝트를 압축해서 올리면 DeviceFarm에서는 돌아가지 않는다. Maven 프로젝트로 만들어줘야 한다. Maven을 잘 모르더라도 겁먹을 필요는 없다. 그냥 설명하는 대로 잘 따라하면 제대로 동작한다. 


그리고 아직 AWS DeviceFarm에 대해 더 자세히 알고 싶으면 http://docs.aws.amazon.com/devicefarm/latest/developerguide/devicefarm-dg.pdf 

에 접속해서 저 PDF를 꼼꼼히 읽어보길 바란다. 

여기서는 Working with Appium Java TestNG for Android and Device Farm 이부분만을 보면된다. 

혹시라도 완성된 다른코드를 보고 싶으면 사람을 위해 

https://github.com/awslabs/aws-device-farm-appium-tests-for-sample-app

이 코드를 보고 참고해서 만들면 된다. 


우선 Maven 프로젝트를 만들어준다. 툴을 Eclipse이다. 





빨간색 표시된 곳을 눌러 MavenProject를 만들어 준다. 

그리고 그냥 다 Next를 눌러 완성 시킨 후 pom.xml을 우선 셋팅해준다. 



<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>


<groupId>com.acme</groupId>

<artifactId>acme-android-appium</artifactId>

<version>1.0-SNAPSHOT</version>

<packaging>jar</packaging>


<dependencies>

<dependency>

<groupId>org.testng</groupId>

<artifactId>testng</artifactId>

<version>6.8.8</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>io.appium</groupId>

<artifactId>java-client</artifactId>

<version>3.1.0</version>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-jar-plugin</artifactId>

<version>2.6</version>

<executions>

<execution>

<phase>package</phase>

<goals>

<goal>test-jar</goal>

</goals>

</execution>

</executions>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-dependency-plugin</artifactId>

<version>2.10</version>

<executions>

<execution>

<id>copy-dependencies</id>

<phase>package</phase>

<goals>

<goal>copy-dependencies</goal>

</goals>

<configuration>

<outputDirectory>${project.build.directory}/dependency-jars/</outputDirectory>

</configuration>

</execution>

</executions>

</plugin>

<plugin>

<artifactId>maven-assembly-plugin</artifactId>

<version>2.5.4</version>

<executions>

<execution>

<phase>package</phase>

<goals>

<goal>single</goal>

</goals>

<configuration>

<finalName>zip-with-dependencies</finalName>

<appendAssemblyId>false</appendAssemblyId>

<descriptors>

<descriptor>src/main/assembly/zip.xml</descriptor>

</descriptors>

</configuration>

</execution>

</executions>

</plugin>

</plugins>

</build>


 

</project>



위와 같이 설정을 해준 후 src안에 main 과 test패키지를 만들어준다. 그 이후 main 안에는 assembly안에 zip.xml파일을 만들어준다. 


zip.xml의 내용은 

<assembly

    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0http://maven.apache.org/xsd/assembly-1.1.0.xsd">

  <id>zip</id>

  <formats>

    <format>zip</format>

  </formats>

  <includeBaseDirectory>false</includeBaseDirectory>

  <fileSets>

    <fileSet>

      <directory>${project.build.directory}</directory>

      <outputDirectory>./</outputDirectory>

      <includes>

        <include>*.jar</include>

      </includes>

    </fileSet>

    <fileSet>

      <directory>${project.build.directory}</directory>

      <outputDirectory>./</outputDirectory>

      <includes>

        <include>/dependency-jars/</include>

      </includes>

    </fileSet>

  </fileSets>

 

</assembly>

와 같다. 


 



위와 같은 구조로 만들어 준 후 page, 와 test는 테스트 코드들이다. 저것과 꼭 똑같이 할필요는 없다. 그냥 테스트 코드를 저 위치에 test패키지안에 넣어주면 된다. 주의할점은 selenium의 라이브러리 값들을 maven이 가져오는 depedency들에게 맞춰서 다시 임포트 해줘야한다. 


이후에는 cmd 창에가서 mvn package install 를 해주면 target에 pom에 설정해두었던 대로 폴더들이 생성된다. 

 


여기서 중요한 것은 zip-with-depedencies 파일이다. 이것을 deviceFarm에 올려주면 된다. 

DeviceFarm에 테스트를 설정하는 것은 매우 간단하므로 굳이 설명하지 않겠다. 


이것보다 더 나은 방법도 있을 수 있다. 그러나 나처럼 삽질하시는 분들이 없으면 하는 마음에 포스트를 작성해보았다. 그나마 삽질하시는 분들에게 조금이나마 도움이되었으면한다. 


반응형
반응형

이번에 내가 있던 스타트업에서 안드로이드 어플을 런칭할 기회가 생겨 테스트를 위해 AWS DeviceFarm 을 이용하여 테스트를 해볼 기회가 생겼다. 안드로이드 기기를 실제로 Device와 OS 버전을 전부 맞춰서 일일이 테스트하기란 거의 불가능에 가깝다. 그래서 자동화 테스트툴 Appium , Calabash, uiAutomator등이 나오게 되었고 DeviceFarm은 이런 자동화테스트 툴을 이용하여 실제 디바이스에서 테스트하는 것을 간단한 조작 만으로 가능하게 해주었다. 


그 과정이 한글로된 문서들이 없어서 힘들어할 사람들을 위해 내가 삽질했던 부분들을 다른 분들은 좀 더 편하게 작업하시라고 포스트를 할려고한다. 


먼저 Appium을 설치해야한다. 그리고 자신이 만들 프로젝트에 Selenium 라이브러리를 추가해주어야한다. 먼저 Appium 을 설치하는 방법이다. 


일단 이동영상을 먼저 보면 어떻게 설치하고 돌려야하는지 대충 감이 잡힌다. 

 

https://www.youtube.com/watch?v=FJ_GwSApOpo



그리고 SlideShare에서 가장 Appium에 대해 잘 설명되어있는 슬라이드를 올린다. 이 두가지를 먼저 보면 Appium을 어떻게 써야하고 무엇인지 대충 감이 잡힌다. 

일단 죄송하게도 내 컴퓨터가 맥이라 맥을 기준으로 설명을 한다. Window도 크게 다르지 않다. 


http://appium.io/ 로 일단 접속하여 Appium을 다운로드한다. 








핑크색으로 표시된 부분을 누르면 다운로드를 받을 수 있다. 다운로드를 받은 후 해야할 일은 Path들이 잘 설정 되어있는지 보아야한다. 그 방법은 간단하다. Appium을 실행 시켜 청진기 버튼을 누르면 간단하게 테스트 할 수 있다. 



Iphone Test는 신경쓰지 않아도 된다. 지금은 안드로이드 테스트를 해야하니까. 보통 Mac에서의 자바 경로는 저곳이다. JAVA_HOME과 ANDROID_HOME path는 무조건 설정을 해줘야한다.( 설정하는 방법을 검색해도 모르겠으면 댓글을 남겨주면 설명하는 블로그를 새로 올리겠습니다.)

이렇게 설정 테스트를 맞췄으면 인제 프로젝트를 생성해보면 된다. 

나는 Eclipse를 가지고 테스트를 하였다. 미리 테스트하고 싶은 apk파일로 만들어놓아야한다. 

아 그전에 테스트 코드를 어떻게 만들어야할지 모르는 사람들을 위해 github에 좋은 코드가 있어서 소개한다.

https://github.com/testvagrant/AppiumDemo

보통 찾아보면 있는 코드들(Main에 그냥 다때려받는) 과는 달리 이 코드는 상당히 깔끔하게 정리가 되어있다. 
이 코드를 보았으면 프로젝트를 만들 때 주의 할 점은 아까 위에서 소개한 동영상을 참고하면 프로젝트 라이브러리들을 쉽게 설정할 수 있다. 요점은 selenium의 버전이 최신버전이면 굳이 testng 라이브러리를 넣지 않아도 된다. selenium안에서 testng가 포함되어 있다. 

코드에 대한 설명은 더 하지 않겠다. 왜냐하면 설정하는 방법을 설명하는 것이기 때문에 (코드에대한 질문이 있으면 따로 질문해주면 답변해드리겠습니다. )

테스트 코드가 다 완성되었다는 가정하에 인제 애뮬레이터를 먼저 켜놓아야한다. 나는 Genymotion을 사용하였다.(설치 방법도 간단하고 기본 애뮬레이터보다 속도가 훨씬 빠르다.) 애뮬레이터를 켠 후 Appium을 실행시킨후 Launch를 누른다. (Appium의 대한 셋팅은 안드로이드 디자인의 아이콘을 누르면 설정할 수 있다. Package명과 시작시 Activity를 설정해주었다. 나머지는 자신에 맞게 설정해주면된다. )  그 이후 이클립스에서 프로젝트를 Run -> TestNG로 실행하면 테스트 코드가 수행되는 모습을 볼 수 있다. 

내가 좀 찾았던 힌트를 몇개 드리면 테스트 코드에서 디바이스의 backButton은 driver.navigate().back(); 메소드를 사용하면 백버튼을 구현할 수 있다. Appium testng 테스트 코드는 안드로이드 apk의 코드를 읽어 파싱하여 테스트 코드를 실행시키기 때문에 코드를 읽을 수 있는 안드로이드의 ID값이나 Text 이름 아니면 xpath값을 설정해주어야한다. xpath값을 찾는 방법을 모르는 사람을 위해 내가 찾은 방법을 설명하자면 테스트 코드가 실제로 돌아갈때 Appium에서 돋보기 버튼을 누르면 해당화면을 찍어 xpath값을 알아낼 수 있다. 그러나 이 값이 모든 디바이스에서 동일하지 않기 때문에 여러 디바이스에서 테스트하는 경우라면 id 값을 가져오거나 실제로 List 클래스를 구현하여 읽는것이 가장 낫다. 

다음번에는 AWS DeviceFarm에 실제로 테스트하기 위해 프로젝트를 셋팅하는 방법에 대해 포스팅하겠다. 


반응형
반응형

pyInstaller라는 게 있다.

http://www.pyinstall.org/


64비트에서도 잘 작동한다.


> python setup.py install 로 설치한다.


사용 시)

EXE로 만들기를 원하는 파이썬 스크립트를 찾아 CONSOLE에서 명령 실행

> pyinstaller.exe xxx.py


단일 파일로 만들 때는 -F 옵션 추가

> pyinstaller.exe -F xxx.py


GUI 프로그램의 경우, 실행 시 CONSOLE창을 숨기고 싶다면 --noconsole 옵션 추가

> pyinstaller.exe -F --noconsole xxx.py



반응형

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

[OpenCV] 영상 얼굴 인식 (face detection)  (0) 2018.06.28
numpy 배열 쪼개기  (0) 2018.01.05
1. python3 py파일 exe 실행파일 만들기  (0) 2017.12.31
np.newaxis  (0) 2017.12.28
python matplotlib 한글깨짐  (0) 2017.12.28
반응형

py2exe는 python2 만 지원하는 것으로 알고 있고

python3에는 cx_freeze 라는 모듈을 사용해야한다.


cx_freeze - http://cx-freeze.sourceforge.net

py2exe - http://www.py2exe.org


> pip install cx_freeze


Setup.py 파일로 만들어서 실행 파일로 실행


import sys

import os

from cx_Freeze import setup, Executable


os.environ['TCL_LIBRARY'] = "c:/python/tcl/tcl8.6"

os.environ['TK_LIBRARY'] = "c:/python/tcl/tk8.6"


setup(name = "parser",

options={"build_exe": {"packages": ["tkinter", "matplotlib"],

"include_files": ['clienticon.ico']}},

version = "1.0",

description = "Parser",

author = "head1ton",

executables = [Executable("parser.py")])

만약 윈도우 GUI 프로그램인 경우 executables의 옵션을 입력해주어야 한다.

executables = [Executable("imgtk.py", base="Win32GUI")])


Setup.py 실행

> python setup.py build


설치파일로 만들 수도 있다.

> python setup.py bdist_msi

dist 폴더에 설치파일 생성.


참고 - http://sh1n2.tistory.com/123

반응형
반응형



1. AWS EC2 접속


2. AMI 버전 확인

$ grep . /etc/*-release

/etc/os-release:NAME="Amazon Linux AMI"

/etc/os-release:VERSION="2017.03"

/etc/os-release:ID="amzn"

/etc/os-release:ID_LIKE="rhel fedora"

/etc/os-release:VERSION_ID="2017.03"

/etc/os-release:PRETTY_NAME="Amazon Linux AMI 2017.03"

/etc/os-release:ANSI_COLOR="0;33"

/etc/os-release:CPE_NAME="cpe:/o:amazon:linux:2017.03:ga"

/etc/os-release:HOME_URL="http://aws.amazon.com/amazon-linux-ami/"

/etc/system-release:Amazon Linux AMI release 2017.03


3. Java 1.8 설치

$ java -version

java version "1.7.0_151"

OpenJDK Runtime Environment (amzn-2.6.11.0.74.amzn1-x86_64 u151-b00)

OpenJDK 64-Bit Server VM (build 24.151-b00, mixed mode)


$ sudo yum install java-1.8.0


$ sudo yum remove java-1.7.0


$ java -version

openjdk version "1.8.0_141"

OpenJDK Runtime Environment (build 1.8.0_141-b16)

OpenJDK 64-Bit Server VM (build 25.141-b16, mixed mode)


4. Scala 설치

$ wget https://downloads.lightbend.com/scala/2.12.3/scala-2.12.3.tgz

$ tar xzvf scala-2.12.3.tgz


$ sudo su -

# cd /home/ec2-user/

# mv scala-2.12.3 /usr/local/scala

# exit


$ sudo vi /etc/profile


export PATH=$PATH:/usr/local/scala/bin


$ source /etc/profile


$ scala -version

Scala code runner version 2.12.3 -- Copyright 2002-2017, LAMP/EPFL and Lightbend, Inc.


5. Spark 설치

* 주의 사항 : AWS t2.large 인스턴스 정도가 되어야 정상 동작함 (t2.small에서는 Spark Streaming 정상 동작 하지 않음)

$ wget https://d3kbcqa49mib13.cloudfront.net/spark-2.2.0-bin-hadoop2.7.tgz

$ tar xvzf spark-2.2.0-bin-hadoop2.7.tgz


$ sudo su -

# cd /home/ec2-user/

# mv spark-2.2.0-bin-hadoop2.7 /usr/local/spark

# exit


$ sudo vi /etc/profile


export PATH=$PATH:/usr/local/spark/bin


$ source /etc/profile

$ spark-shell


6. Kafka 설치 및 데몬 실행

$ wget http://apache.mirror.cdnetworks.com/kafka/0.11.0.0/kafka_2.11-0.11.0.0.tgz

$ tar xzvf kafka_2.11-0.11.0.0.tgz

$ ln -s kafka_2.11-0.11.0.0 kafka


$ bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

$ bin/kafka-server-start.sh -daemon config/server.properties


7. MongoDB 설치 및 서비스 실행

$ sudo su

# vi /etc/yum.repos.d/mongodb-org-3.4.repo


[mongodb-org-3.4]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc


# yum install -y mongodb-org

# service mongod start

# mongo

# exit


8. Redis 설치 및 서비스 실행

$ sudo yum -y update

$ sudo yum -y install gcc make


$ sudo wget http://download.redis.io/redis-stable.tar.gz

$ tar xvzf redis-stable.tar.gz

$ cd redis-stable

$ sudo make install


$ sudo mkdir -p /etc/redis /var/lib/redis /var/redis/6379

$ sudo cp redis.conf /etc/redis/6379.conf

$ sudo vi /etc/redis/6379.conf


daemonize yes

logfile /var/log/redis_6379.log

dir /var/redis/6379


$ sudo wget https://raw.githubusercontent.com/saxenap/install-redis-amazon-linux-centos/master/redis-server

$ sudo mv redis-server /etc/init.d

$ sudo chmod 755 /etc/init.d/redis-server

$ sudo vi /etc/init.d/redis-server


REDIS_CONF_FILE="/etc/redis/6379.conf"


$ sudo chkconfig --add redis-server

$ sudo chkconfig --level 345 redis-server on

$ sudo service redis-server start


9. Node.js 개발 환경 구축

$ sudo yum install git-core

$ sudo yum install nodejs npm --enablerepo=epel


$ npm -v

1.3.6

$ sudo npm update -g npm

$ npm -v

5.3.0

$ npm install


$ sudo npm cache clean -f

$ sudo npm install -g n

$ sudo n 6.11.1

$ node -v

v0.10.48


재접속


$ node -v

v6.11.1


10. Maven 개발 환경 구축

$ sudo yum install java-1.8.0-openjdk-devel.x86_64

$ sudo alternatives --config java

$ sudo alternatives --config javac

$ javac -version

javac 1.8.0_141


$ sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo

$ sudo sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo

$ sudo yum install -y apache-maven

$ mvn -v

Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00)

Maven home: /usr/share/apache-maven

Java version: 1.7.0_151, vendor: Oracle Corporation

Java home: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.151.x86_64/jre

Default locale: en_US, platform encoding: UTF-8

OS name: "linux", version: "4.9.38-16.35.amzn1.x86_64", arch: "amd64", family: "unix"


------------------

<참고자료>

리눅스 버전 확인

https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EC%A2%85%EB%A5%98_%ED%99%95%EC%9D%B8,_%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%B2%84%EC%A0%84_%ED%99%95%EC%9D%B8

AMI에 JDK 1.8 설치

http://blog.naver.com/PostView.nhn?blogId=typez&logNo=221020775376&redirect=Dlog&widgetTypeCall=true

스칼라 및 스파크 설치

http://www.w3ii.com/ko/apache_spark/apache_spark_installation.html

카프카 설치

http://www.popit.kr/kafka-%EC%9A%B4%EC%98%81%EC%9E%90%EA%B0%80-%EB%A7%90%ED%95%98%EB%8A%94-%EC%B2%98%EC%9D%8C-%EC%A0%91%ED%95%98%EB%8A%94-kafka/

https://blog.knoldus.com/2017/04/19/installing-and-running-kafka-on-aws-instance-centos/

몽고디비 설치

http://chichi.space/2017/05/12/%ED%95%9C%EB%B2%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-AWS-EC2%EC%97%90-MongoDB-%EC%84%A4%EC%B9%98%ED%95%98%EA%B3%A0-%EB%B3%B4%EC%95%88%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0/

레디스 설치

http://mygumi.tistory.com/133

웹 프론트 개발 환경 구축

http://tbang.tistory.com/123

Node.js 최신 버전 설치

http://goosia.com/?p=85

NPM 최신 버전 설치

https://askubuntu.com/questions/562417/how-do-you-update-npm-to-the-latest-version

$ npm -v
2.15.1
$ sudo npm update -g npm
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
npm@3.10.9 /usr/local/lib/node_modules/npm
$ npm -v
3.10.9

Maven 설치

http://bhargavamin.com/how-to-do/install-jenkins-on-amazon-linux-aws/

sudo yum install -y git  java-1.8.0-openjdk-devel aws-cli

sudo alternatives --config java

sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo

sudo sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo

sudo yum install -y apache-maven

mvn –v

AWS EC2 t2.micro Swap 할당하는 방법

https://m.blog.naver.com/PostView.nhn?blogId=sory1008&logNo=220808623133&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

$ dd if=/dev/zero of=/swapfile bs=1M count=1024 $ mkswap /swapfile $ swapon /swapfile $ echo "/swapfile swap swap defaults 0 0" >> /etc/fstab



출처: http://nashorn.tistory.com/623 [나숑의 법칙]

반응형

'연구개발 > Linux' 카테고리의 다른 글

VirtualEnv Wrapper를 이용한 파이썬 가상환경 설정  (0) 2017.04.05
centos fdisk  (0) 2017.03.30
ubuntu 방화벽  (0) 2016.03.14
zabbix mail setting  (0) 2016.03.03
swap  (0) 2016.03.02
반응형

import numpy as np
x = np.array([
[[2, 3, 1, 0],[12, 13, 11, 10],[22, 23, 21, 20]],
[[32, 33, 31, 30],[42, 43, 41, 40],[52, 53, 51, 50]]
])
print('x:', x)
print('x.shape:', x.shape)

X1 = x[:, np.newaxis, 1] # 모든 행에서 1열 값을 가져오고(행이됨), 축을 추가한다(열이됨)
print('X1:', X1)
print('X1.shape:', X1.shape)

X2 = x[:, 1, np.newaxis] # x[:, np.newaxis, 1]과 동일
print('X2:', X2)
print('X2.shape:', X2.shape)

X3 = x[1, np.newaxis, :] # 1행에서 모든 열값을 가져온다 (축추가로 열값이됨)
print('X3:', X3)
print('X3.shape:', X3.shape)

X4 = x[1, :, np.newaxis] # 1행에서 모든 열값을 가져온다 ( 축 추가로 행값이됨 )
print('X4:', X4)
print('X4.shape:', X4.shape)

X5 = x[:, np.newaxis] # 차원추가? 열추가?
print('X5:', X5)
print('X5.shape:', X5.shape)


반응형
반응형
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)


반응형
반응형


import numpy as np
import re
from nltk.corpus import stopwords
stop = stopwords.words('english')
def tokenizer(text):
text = re.sub('<[^>]*>', '', text)
emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)', text.lower())
text = re.sub('[\W]+', ' ', text.lower()) + ' '.join(emoticons).replace('-', '')
tokenized = [w for w in text.split() if w not in stop]
return tokenized

# generator 함수 stream_docs를 정의해서 한 번에 문서 하나를 읽어들이고 반환시키도록 한다.
def stream_docs(path):
with open(path, 'r', encoding='utf-8') as csv:
next(csv)
for line in csv:
text, label = line[:-3], int(line[-2])
yield text, label

# 테스트로 movie_data.csv 파일의 첫 번째 문서를 읽어보자
print(next(stream_docs(path='movie_data.csv')))

# stream_docs 함수로부터 문서 스트림을 읽어들이고 size파라미터에 특정 문서의 숫자를 반환하는
# get_minibatch 함수를 정의
def get_minibatch(doc_stream, size):
docs, y = [], []
try:
for _ in range(size):
text, label = next(doc_stream)
docs.append(text)
y.append(label)
except StopIteration:
return None, None
return docs, y

from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.linear_model import SGDClassifier
vect = HashingVectorizer(decode_error='ignore', n_features=2**21, preprocessor=None, tokenizer=tokenizer)
clf = SGDClassifier(loss='log', random_state=1, n_iter=1)
doc_stream = stream_docs(path='movie_data.csv')

import pyprind
pbar = pyprind.ProgBar(45)
classes = np.array([0, 1])
for _ in range(45):
X_train, y_train = get_minibatch(doc_stream, size=1000)
if not X_train:
break
X_train = vect.transform(X_train)
clf.partial_fit(X_train, y_train, classes=classes)
pbar.update()

X_test, y_test = get_minibatch(doc_stream, size=5000)
X_test = vect.transform(X_test)
print('Accuarcy: %.3f' % clf.score(X_test, y_test))

clf = clf.partial_fit(X_test, y_test)

'''
머신러닝 모델을 웹 어플리케이션에 임베트하는 방법으로
데이터를 실시간으로 학습하는 방법을 익혀보자.
'''

# 피팅된 사이킷런 에스티메이터 직렬화
import pickle
import os

dest = os.path.join('movieclassifier', 'pkl_objects')
if not os.path.exists(dest):
os.makedirs(dest)

pickle.dump(stop, open(os.path.join(dest, 'stopwords.pkl'), 'wb'), protocol=4)
pickle.dump(clf, open(os.path.join(dest, 'classifier.pkl'), 'wb'), protocol=4)

# vectorizer.py
from sklearn.feature_extraction.text import HashingVectorizer
import re
import os
import pickle

cur_dir = os.path.dirname(__file__)
stop = pickle.load(open(os.path.join(cur_dir, 'pkl_objects', 'stopwords.pkl'), 'rb'))

def tokenizer(text):
text = re.sub('<[^>]*>', '', text)
emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)', text.lower())
text = re.sub('[\W]+', ' ', text.lower()) + ' '.join(emoticons).replace('-', '')
tokenized = [w for w in text.split() if w not in stop]
return tokenized

vect = HashingVectorizer(decode_error='ignore', n_features=2**21, preprocessor=None, tokenizer=tokenizer)


import pickle
import re
import os
#from vectorizer import vect
clf = pickle.load(open(os.path.join('pkl_objects', 'classifier.pkl'), 'rb'))


import numpy as np
label = {0:'negative', 1:'positive'}
example = ['I love this movie']
X = vect.transform(example)
print('Prediction: %s\nProbaility: %.2f%%' % (label[clf.predict(X)[0]], np.max(clf.predict_proba(X))*100))


반응형
반응형
pbar.py
import pyprind
import pandas as pd
import os
pbar = pyprind.ProgBar(50000)
labels = {'pos':1, 'neg':0}

df = pd.DataFrame()
'''
for s in ('test', 'train'):
for l in ('pos', 'neg'):
path = './aclImdb/%s/%s' % (s, l)
for file in os.listdir(path):
with open(os.path.join(path, file), 'r', encoding='utf-8') as infile:
txt = infile.read()
df = df.append([[txt, labels[l]]], ignore_index=True)
pbar.update()

df.columns = ['review', 'sentiment']

import numpy as np
np.random.seed(0)
df = df.reindex(np.random.permutation(df.index))
df.to_csv('./movie_data.csv', index=False)
'''
df = pd.read_csv('./movie_data.csv')
print('df.head(3):\n', df.head(3))
# pbar 실행

# 단어를 피처 벡터로 변환
import pandas as pd
import numpy as np
df = pd.DataFrame()
df = pd.read_csv('./movie_data.csv')
print('df.head(3):\n', df.head(3))

from sklearn.feature_extraction.text import CountVectorizer
count = CountVectorizer()
docs = np.array([
'The sun is shining',
'The weather is sweet',
'The sun is shining and the weather is sweet'
])
bag = count.fit_transform(docs)

print(count.vocabulary_)
print(bag.toarray())

'''
nd는 문서의 전체 개수, df(d,t)는 용어 t를 포함하는 문서 d의 개수
'''
from sklearn.feature_extraction.text import TfidfTransformer
tfidf = TfidfTransformer()
np.set_printoptions(precision=2)
print(tfidf.fit_transform(count.fit_transform(docs)).toarray())

print(df.loc[0, 'review'][-50:])

import re
def preprocessor(text):
text = re.sub('<[^>]*>', '', text)
emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)', text)
text = re.sub('[\W]+', ' ', text.lower()) + ' '.join(emoticons).replace('-', '')
return text

print(preprocessor(df.loc[0, 'review'][-50:]))
print(preprocessor("</a>This :) is :( a test :-)!"))

# 모든 영화 리뷰에 적용
df['review'] = df['review'].apply(preprocessor)

# 문서를 토큰으로 처리하기
def tokenizer(text):
return text.split()
print('tokenizer:\n', tokenizer('running like running and thus they run'))

from nltk.stem.porter import PorterStemmer
porter = PorterStemmer()

def tokenizer_porter(text):
return [porter.stem(word) for word in text.split()]

print('tokenizer_porter("runners like running and thus they run"):\n'
, tokenizer_porter('runners like running and thus they run'))

'''
불용어(stop-word) : 모든 종류의 텍스트에서 공통으로 많이 사용되는 단어들로 문서의 다른 종류들을 구별하는 데
유용할 만한 정보를 거의 가지고 있지 않은 (혹은 아주 조금만 가지고 있는) 경우를 말한다.
불용어의 예로는 is, and, has 같은 것들이 있다.
'''
import nltk
nltk.download('stopwords')

from nltk.corpus import stopwords
stop = stopwords.words('english')
[print(w) for w in tokenizer_porter('a runner likes running and runs a lot')[-10:] if w not in stop]

# 문서 분류를 위한 로지스틱 회귀 모델 훈련
X_train = df.loc[:25000, 'review'].values
y_train = df.loc[:25000, 'sentiment'].values
X_test = df.loc[25000:, 'review'].values
y_test = df.loc[25000:, 'sentiment'].values

# GridSearchCV 오브젝트를 사용하여 5-폴드(5-fold) 충화 교차검증을
# 사용하는 이번 로지스틱 회귀 모델에 대한 최적의 파라미터 세트를 찾아보자
from sklearn.grid_search import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(strip_accents=None, lowercase=False, preprocessor=None)
param_grid = [{'vect__ngram_range': [(1,1)],
'vect__stop_words': [stop, None],
'vect__tokenizer': [tokenizer, tokenizer_porter],
'clf__penalty': ['l1', 'l2'],
'clf__C': [1.0, 10.0, 100.0]},
{'vect__ngram_range': [(1,1)],
'vect__stop_words': [stop, None],
'vect__tokenizer': [tokenizer, tokenizer_porter],
'vect__use_idf': [False],
'vect__norm': [None],
'clf__penalty': ['l1', 'l2'],
'clf__C': [1.0, 10.0, 100.0]}]
lr_tfidf = Pipeline([('vect', tfidf),
('clf', LogisticRegression(random_state=0))])
gs_lr_tfidf = GridSearchCV(lr_tfidf, param_grid, scoring='accuracy', cv=5, verbose=1, n_jobs=1)
gs_lr_tfidf.fit(X_train, y_train)
print('Best parameter set : %s ' % gs_lr_tfidf.best_params_)

print('CV Accuracy: %.3f' % gs_lr_tfidf.best_score_)
clf = gs_lr_tfidf.best_estimator_
print('Test Accuracy: %.3f' % clf.score(X_test, y_test))
import numpy as np
import re
from nltk.corpus import stopwords
stop = stopwords.words('english')
def tokenizer(text):
text = re.sub('<[^>]*>', '', text)
emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)', text.lower())
text = re.sub('[\W]+', ' ', text.lower()) + ' '.join(emoticons).replace('-', '')
tokenized = [w for w in text.split() if w not in stop]
return tokenized

# generator 함수 stream_docs를 정의해서 한 번에 문서 하나를 읽어들이고 반환시키도록 한다.
def stream_docs(path):
with open(path, 'r', encoding='utf-8') as csv:
next(csv)
for line in csv:
text, label = line[:-3], int(line[-2])
yield text, label

# 테스트로 movie_data.csv 파일의 첫 번째 문서를 읽어보자
print(next(stream_docs(path='./machinelearning/movie_data.csv')))

# stream_docs 함수로부터 문서 스트림을 읽어들이고 size파라미터에 특정 문서의 숫자를 반환하는
# get_minibatch 함수를 정의
def get_minibatch(doc_stream, size):
docs, y = [], []
try:
for _ in range(size):
text, label = next(doc_stream)
docs.append(text)
y.append(label)
except StopIteration:
return None, None
return docs, y

from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.linear_model import SGDClassifier
vect = HashingVectorizer(decode_error='ignore', n_features=2**21, preprocessor=None, tokenizer=tokenizer)
clf = SGDClassifier(loss='log', random_state=1, n_iter=1)
doc_stream = stream_docs(path='./machinelearning/movie_data.csv')

import pyprind
pbar = pyprind.ProgBar(45)
classes = np.array([0, 1])
for _ in range(45):
X_train, y_train = get_minibatch(doc_stream, size=1000)
if not X_train:
break
X_train = vect.transform(X_train)
clf.partial_fit(X_train, y_train, classes=classes)
pbar.update()

X_test, y_test = get_minibatch(doc_stream, size=5000)
X_test = vect.transform(X_test)
print('Accuarcy: %.3f' % clf.score(X_test, y_test))

clf = clf.partial_fit(X_test, y_test)


반응형

+ Recent posts

반응형