TechTogetWorld

인공지능의 실전입문에 관한 글입니다.

알고리즘을 만드는것이 아니고, 만들어진 알로리즘을 활용하는 방법에 관한 글입니다.

자동차 운전을 위해 자동차를 만드는방법을 알필요는 없습니다. 물론 알면 좋기는 하겠지만, 서로 별도의 분야라고 할수있습니다.


본글은 학습용 데이터를 학습/테스트/측정하는 방법에 대한 글입니다.

글의 순서는 아래와 같습니다.


=========================================================================================


1. 외국어 문장 판별  => [ # 170814 7 xor-train ]

   . count=list(map(lambda n : n/total,count)) ==> 주의 " list " 를 넣치 않으면 error 발생

   . 언어별 알파벳 사용횟수가 틀리다는 점을 이용해서, 문장을 주고 영어인지 프랑스어인지 등 구분하는 알고리즘임. 유첨(학습,테스트 데이터)

lang.zip


2. 외국어별 알파벳 사용빈도을 그래프로 표식하여 비교 ==> [ 170816 3 lang-train graph ]

3. 독버섯과 식용버섯 구분==> [ #170819 3 mushroom-train ]

170819 1 mushroom.csv


4. 참고자료


=========================================================================================


[ # 170816 2 lang-train ]



from sklearn import svm, metrics

import glob, os.path ,re, json


files=glob.glob("./lang/train/*.txt")

train_data=[]

train_label=[]

for file_name in files :

    basename=os.path.basename(file_name)

    lang=basename.split("-")[0]

    file=open(file_name,"r",encoding="utf-8")

    text=file.read()

    text=text.lower()

    file.close()

    code_a = ord("a")

    code_z = ord("z")

    count = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

    for character in text:

        code_current=ord(character)

        if code_a<=code_current <=code_z :

            count[code_current-code_a] +=1

    total=sum(count)

    count=list(map(lambda n : n/total,count))

#리스트에 넣기

    train_label.append(lang)

    train_data.append(count)

#print(train_data)

#print("=========================================================================")

#print(train_label)


files=glob.glob("./lang/test/*.txt")

test_data=[]

test_label=[]

for file_name in files :

    basename=os.path.basename(file_name)

    lang=basename.split("-")[0]

    file=open(file_name,"r",encoding="utf-8")

    text=file.read()

    text=text.lower()

    file.close()

    code_a = ord("a")

    code_z = ord("z")

    count = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

    for character in text:

        code_current=ord(character)

        if code_a<=code_current <=code_z :

            count[code_current-code_a] +=1

    total=sum(count)

    count=list(map(lambda n : n/total,count))

#리스트에 넣기

    test_label.append(lang)

    test_data.append(count)

#print(train_data)

#print("=========================================================================")

#print(train_label)


clf = svm.SVC()

clf.fit(train_data, train_label)

predict=clf.predict(test_data)

score=metrics.accuracy_score(test_label, predict)

print("score=",score)

report=metrics.classification_report(test_label, predict)

print("--------report-----------")

print(report)



[ 170816 3 lang-train graph ]


from sklearn import svm, metrics

import glob, os.path ,re, json

import matplotlib.pyplot as plt

import pandas as pd



files=glob.glob("./lang/train/*.txt")

train_data=[]

train_label=[]

for file_name in files :

    basename=os.path.basename(file_name)

    lang=basename.split("-")[0]

    file=open(file_name,"r",encoding="utf-8")

    text=file.read()

    text=text.lower()

    file.close()

    code_a = ord("a")

    code_z = ord("z")

    count = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

    for character in text:

        code_current=ord(character)

        if code_a<=code_current <=code_z :

            count[code_current-code_a] +=1

    total=sum(count)

    count=list(map(lambda n : n/total,count))

#리스트에 넣기

    train_label.append(lang)

    train_data.append(count)


# 그래픽 준비하기

graph_dict={}

for i in range(0,len(train_label)):

    label = train_label[i]

    data = train_data[i]

    if not (label in graph_dict) :

        graph_dict[label]=data

asclist=[[chr(n) for n in range(97,97+26)]]

print(asclist)

df=pd.DataFrame(graph_dict, index=asclist)


# 그래프 그리기

plt.style.use('ggplot')

df.plot(kind="bar",subplots=True,ylim=(0,0.15))

plt.savefig('lang-plot.png')





[ #170819 3 mushroom-train ]

import pandas as pd

from sklearn.ensemble import RandomForestClassifier

from sklearn import metrics

from sklearn.model_selection import train_test_split

# 데이터 읽어 들이기--- (※1)

mr = pd.read_csv("170819 1 mushroom.csv", header=None)

# 데이터 내부의 기호를 숫자로 변환하기--- (※2)

label = []

data = []

attr_list = []

for row_index, row in mr.iterrows():

    label.append(row.ix[0])

    row_data = []

    for v in row.ix[1:]:

        row_data.append(ord(v))

    data.append(row_data)

# 학습 전용과 테스트 전용 데이터로 나누기 --- (※3)

data_train, data_test, label_train, label_test = \

    train_test_split(data, label)

# 데이터 학습시키기 --- (※4)

clf = RandomForestClassifier()

clf.fit(data_train, label_train)

# 데이터 예측하기 --- (※5)

predict = clf.predict(data_test)

# 결과 테스트하기 --- (※6)

ac_score = metrics.accuracy_score(label_test, predict)

cl_report = metrics.classification_report(label_test, predict)

print("정답률 =", ac_score)

print("리포트 =\n", cl_report)



[참고자료]


https://www.docker.com/products/docker-toolbox  ==> docker 설치방법

https://www.data.go.kr/main.do

인공지능의 실전입문에 관한 글입니다.

알고리즘을 만드는것이 아니고, 만들어진 알로리즘을 활용하는 방법에 관한 글입니다.

자동차 운전을 위해 자동차를 만드는방법을 알필요는 없습니다. 물론 알면 좋기는 하겠지만, 서로 별도의 분야라고 할수있습니다.


본글은 학습용 데이터를 학습/테스트/측정하는 방법에 대한 글입니다.

글의 순서는 아래와 같습니다.


=========================================================================================


1. X-OR 구현 => [ # 170814 7 xor-train ]

2. 손글씨 맞추기

  - MNIST DOWN ==> [ # 170814 10 mnist-download ] 

  - DATA 변환 ==> CSV 로 , [# 170814 11 mnist-tocsv]    

t10k.csv

train.csv

  - 학습/테스트/평가 ==> [# 170814 9 mnist-train]

    . DATA숫자가 5000개 정도 수준으로, 정확도는 78% 수준임,  전체DATA로 하게되면 정확도는 95% 수준으로 올라감


3. 참고자료


=========================================================================================


[ # 170814 7 xor-train ]


from sklearn import svm

# XOR의 계산 결과 데이터 --- (※1)

xor_data = [

    #P, Q, result

    [0, 0, 0],

    [0, 1, 1],

    [1, 0, 1],

    [1, 1, 0]

]

# 학습을 위해 데이터와 레이블 분리하기 --- (※2)

data = []

label = []

for row in xor_data:

    p = row[0]

    q = row[1]

    r = row[2]

    data.append([p, q])

    label.append(r)

# 데이터 학습시키기 --- (※3)

clf = svm.SVC()

clf.fit(data, label)

# 데이터 예측하기 --- (※4)

pre = clf.predict(data)

print(" 예측결과:", pre)

# 결과 확인하기 --- (※5)

ok = 0; total = 0

for idx, answer in enumerate(label):

    p = pre[idx]

    if p == answer: ok += 1

    total += 1

print("정답률:", ok, "/", total, "=", ok/total)




[ # 170814 10 mnist-download ]

import urllib.request as req
import gzip, os, os.path
savepath = "./mnist"
baseurl = "http://yann.lecun.com/exdb/mnist"
files = [
    "train-images-idx3-ubyte.gz",
    "train-labels-idx1-ubyte.gz",
    "t10k-images-idx3-ubyte.gz",
    "t10k-labels-idx1-ubyte.gz"]
# 다운로드
if not os.path.exists(savepath): os.mkdir(savepath)
for f in files:
    url = baseurl + "/" + f
    loc = savepath + "/" + f
    print("download:", url)
    if not os.path.exists(loc):
        req.urlretrieve(url, loc)
# GZip 압축 해제
for f in files:
    gz_file = savepath + "/" + f
    raw_file = savepath + "/" + f.replace(".gz", "")
    print("gzip:", f)
    with gzip.open(gz_file, "rb") as fp:
        body = fp.read()
        with open(raw_file, "wb") as w:
            w.write(body)
print("ok")


[# 170814 11 mnist-tocsv]

import struct
def to_csv(name, maxdata):
    # 레이블 파일과 이미지 파일 열기
    lbl_f = open("./mnist/"+name+"-labels-idx1-ubyte", "rb")
    img_f = open("./mnist/"+name+"-images-idx3-ubyte", "rb")
    csv_f = open("./mnist/"+name+".csv", "w", encoding="utf-8")
    # 헤더 정보 읽기 --- (※1)
    mag, lbl_count = struct.unpack(">II", lbl_f.read(8))
    mag, img_count = struct.unpack(">II", img_f.read(8))
    rows, cols = struct.unpack(">II", img_f.read(8))
    pixels = rows * cols
    # 이미지 데이터를 읽고 CSV로 저장하기 --- (※2)
    res = []
    for idx in range(lbl_count):
        if idx > maxdata: break
        label = struct.unpack("B", lbl_f.read(1))[0]
        bdata = img_f.read(pixels)
        sdata = list(map(lambda n: str(n), bdata))
        csv_f.write(str(label)+",")
        csv_f.write(",".join(sdata)+"\r\n")
        # 잘 저장됐는지 이미지 파일로 저장해서 테스트하기 -- (※3)
        if idx < 10:
            s = "P2 28 28 255\n"
            s += " ".join(sdata)
            iname = "./mnist/{0}-{1}-{2}.pgm".format(name,idx,label)
            with open(iname, "w", encoding="utf-8") as f:
                f.write(s)
    csv_f.close()
    lbl_f.close()
    img_f.close()
# 결과를 파일로 출력하기 --- (※4)
to_csv("train", 1000)
to_csv("t10k", 500)



[# 170814 9 mnist-train]

from sklearn import model_selection,svm,metrics
import pandas

train_csv=pandas.read_csv("./mnist/train.csv",header=None)
tk_csv=pandas.read_csv("./mnist/t10k.csv",header=None)

def test(l) :
    output=[]
    for i in l:
        output.append(float(i)/256)
    return output

train_csv_data=list(map(test,train_csv.iloc[:,1:].values))
tk_csv_data=list(map(test,tk_csv.iloc[:,1:].values))

train_csv_label=train_csv[0].values
tk_csv_label=tk_csv[0].values

clf = svm.SVC()
clf.fit(train_csv_data, train_csv_label)
predict = clf.predict(tk_csv_data)
print(predict)
score = metrics.accuracy_score(tk_csv_label,predict)
print("정답률 =", score)





[참고자료]


https://www.docker.com/products/docker-toolbox  ==> docker 설치방법

https://www.data.go.kr/main.do


인공지능의 실전입문에 관한 글입니다.

알고리즘을 만드는것이 아니고, 만들어진 알로리즘을 활용하는 방법에 관한 글입니다.

자동차 운전을 위해 자동차를 만드는방법을 알필요는 없습니다. 물론 알면 좋기는 하겠지만, 서로 별도의 분야라고 할수있습니다.


본글은 인공지능에 입력할 학습data를 구하는 방법에 관한 글입니다 ( 인터넷에 흩어져 있는 자료수집 )

글의 순서는 아래와 같습니다.


=========================================================================================

[ 웹상의 데이타 가져오기 ]

1.개발환경 구성

  - 아나콘다 기준으로 설명합니다.  

  - Docker를 설치하고, 우분투를 설치하고, 우분투에서 각종 패키지(apt-get install)를 설치해도 무방합니다.
  - 아나콘다는 파이선 패키지를 쉽게 설치할수있도록 도와줍니다.
    . conda install ~
    . pip ~ 등으로 설치한다

2.웹사이트에 자료요청하는 방식 ==> get 요청

3.웹사이트에서 사진한장 가져오기 ==> download-png1

4.쇼핑몰에서 가격정보 가져오기 ==>bs-usd

5.포털에서 뉴스자료 가져오기 ==> download-bs-news2

6.웹 사이트에 파이선으로 프로그램 안에서 로그인 하기 ==> 170813 6 selenium-login

7.자바스크립트를 이용해서 자료 가져오기 selenium-js

8.날씨정보 가져오기 ==>170813 8 api-weather

9.네이버에서 이메일 가져오기 ==> 170813 10 selenium-login

   - 네이버 메일을 가져오는 코드입니다.

   - 네이버에 처음 로그인시에는

      . 1)로그인 ,2)새로운 기기 등록 , 3)로그인상태 유지 3단계의 단계를 통과해야 합니다. 각각 단계에 버튼입력코드가 필요합니다

      . 두번째 부터는 새로운 기기등록 , 로그인상태 유지  2단계의 코드는 필요없습니다, 주석처리를 해야합니다. 주석 처리 않하면 error 발생

10  날씨 가져오기 ==>170814 1 xml-forecast] 
11. 깃 허브에서 자료가져오기 ==>170814 2 json-github

12  csv 화일 읽기 ==> [# EUC_KR로 저장된 CSV 파일 읽기]

13. 엑셀화일 읽기==>[# 170814 4 excel-read]

  - 다운받은 엑셀은  다름이름으로 저장 " 엑셀통합문서" 로 저장해야 파이선에서 불러올수 있음

14. 엑셀에 자료 입력하기[ # 170814 5 write excel ]



[ Next Step ]

  ==> 가져온 데이터를 머신러닝으로 학습 시키기


[ 참고자료 ]

===================================================================================================



[ 개발환경 구성 ] 

1. 아나콘다 기준으로 설명합니다.  
  - Docker를 설치하고, 우분투를 설치하고, 우분투에서 각종 패키지(apt-get install)를 설치해도 무방합니다.
  - 아나콘다는 파이선 패키지를 쉽게 설치할수있도록 도와줍니다.


아나콘다에서 설치

phantomjs

conda install -c trent phantomjs 

conda install -c javascript phantomjs 

conda install -c javascript/label/dev phantomjs

conda install -c mutirri phantomjs 

conda install -c mutirri/label/bokeh-deps phantomjs 

conda install -c mutirri/label/all phantomjs 

conda install -c mutirri/label/selenium phantomjs

selenium

conda install -c metaperl selenium  ==> python 2.xx

conda install -c conda-forge selenium  ==> python 3.xx

beautifulsoup4

conda install -c anaconda beautifulsoup4 ==>python 4.xx

fontconfig

conda install -c anaconda fontconfig python 2.xx




[ Get 요청 ] 

# https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EC%B4%88%EC%BD%9C%EB%A6%BF

import urllib.request
import urllib.parse
API = "https://search.naver.com/search.naver"
# 매개변수를 URL 인코딩합니다. --- (※1)
values = {
"where" : "nexearch" ,
"sm" : "top_hty" ,
"where" : "nexearch" ,
"fbm" : "1" ,
"ie" : "utf8" ,
"query" : "초콜릿"
}
params = urllib.parse.urlencode(values)
# 요청 전용 URL을 생성합니다. --- (※2)
url = API + "?" + params
print("url=", url)
# 다운로드합니다. --- (※3)
data = urllib.request.urlopen(url).read()
text = data.decode("utf-8")  #euc-kr"
print(text)


[ download-png1 ] 

# 170813 2 download-png1

import urllib.request

# data를 불러올 사이트/화일
url="http://uta.pw/shodou/img/28/214.png"

# 불러운 화일을 저장할 이름
savename="test.png"

# 다운로드 (1)
mem=urllib.request.urlopen(url).read()

#파일로 저장하기 (2)
#"wb" 는 binary file(인간이 읽을수 없음)을 의미함
with open(savename,mode="wb") as f:
    f.write(mem)

print("저장되었습니다")


[ bs-usd ] 

#170813 3 bs-usd

from bs4 import BeautifulSoup
import urllib.request as req
# HTML 가져오기
url = "http://info.finance.naver.com/marketindex/"
res = req.urlopen(url)
# HTML 분석하기
soup = BeautifulSoup(res, "html.parser")
# 원하는 데이터 추출하기 --- (※1)
price = soup.select_one("div.head_info > span.value").string
print("usd/krw =", price)


[ download-bs-news2 ]

# bs-news2

from bs4 import BeautifulSoup
# 분석 대상 HTML --- (※1)
html = """
<html><body>
<div id="meigen">
  <h1>위키북스 도서</h1>
  <ul class="items">
    <li>유니티 게임 이펙트 입문</li>
    <li>스위프트로 시작하는 아이폰 앱 개발 교과서</li>
    <li>모던 웹사이트 디자인의 정석</li>
  </ul>
</div>
</body></html>
"""
# HTML 분석하기 --- (※2)
soup = BeautifulSoup(html, 'html.parser')
# 필요한 부분을 CSS 쿼리로 추출하기
# 타이틀 부분 추출하기 --- (※3)
h1 = soup.select_one("div#meigen > h1").string
print("h1 =", h1)
# 목록 부분 추출하기 --- (※4)
li_list = soup.select("div#meigen > ul.items > li")
for li in li_list:
  print("li =", li.string)



170813 6 selenium-login ]

#"로그인 버튼을 클릭합니다.") 이후 부터 정상실행 않됨

# 170813 6 selenium-login
from selenium import webdriver
USER = "**********"
PASS = "*************^"
# PhantomJS 드라이버 추출하기 --- (※1)
browser = webdriver.PhantomJS()
browser.implicitly_wait(3)
# 로그인 페이지에 접근하기 --- (※2)
url_login = "https://nid.naver.com/nidlogin.login"
browser.get(url_login)
print("로그인 페이지에 접근합니다.")
# 텍스트 박스에 아이디와 비밀번호 입력하기 --- (※3)
e = browser.find_element_by_id("id")
e.clear()
e.send_keys(USER)
e = browser.find_element_by_id("pw")
e.clear()
e.send_keys(PASS)
# 입력 양식 전송해서 로그인하기 --- (※4)
form = browser.find_element_by_css_selector("input.btn_global[type=submit]")
form.submit()
print("로그인 버튼을 클릭합니다.")
# 여기까지만 정상실행됨
# 쇼핑 페이지의 데이터 가져오기 --- (※5)
browser.get("https://order.pay.naver.com/home?tabMenu=SHOPPING")
# 쇼핑 목록 출력하기 --- (※6)
products = browser.find_elements_by_css_selector(".sub_sc h4")
print(products)
for product in products:
    print("-", product.text)


[  170813 67selenium-js ]

# 170813 67selenium-js

from selenium import webdriver
# PhantomJS 드라이버 추출하기
browser = webdriver.PhantomJS()
browser.implicitly_wait(3)
# 적당한 웹 페이지 열기
browser.get("https://google.com")
# 자바스크립트 실행하기
r = browser.execute_script("return 100 + 50")
print(r)

[# 170813 8 api-weather]
mport requests
import json
# API 키를 지정합니다. 자신의 키로 변경해서 사용해주세요. --- (※1)
apikey = "474d59dd890c4108f62f192e0c6fce01"
# 날씨를 확인할 도시 지정하기 --- (※2)
cities = ["Seoul,KR", "Tokyo,JP", "New York,US"]
# API 지정 --- (※3)
api = "http://api.openweathermap.org/data/2.5/weather?q={city}&APPID={key}"
# 켈빈 온도를 섭씨 온도로 변환하는 함수 --- (※4)
k2c = lambda k: k - 273.15
# 각 도시의 정보 추출하기 --- (※5)
for name in cities:
    # API의 URL 구성하기 --- (※6)
    url = api.format(city=name, key=apikey)
    # API에 요청을 보내 데이터 추출하기
    r = requests.get(url)
    # 결과를 JSON 형식으로 변환하기 --- (※7)
    data = json.loads(r.text)    
    # 결과 출력하기 --- (※8)
    print("+ 도시 =", data["name"])
    print("| 날씨 =", data["weather"][0]["description"])
    print("| 최저 기온 =", k2c(data["main"]["temp_min"]))
    print("| 최고 기온 =", k2c(data["main"]["temp_max"]))
    print("| 습도 =", data["main"]["humidity"])
    print("| 기압 =", data["main"]["pressure"])
    print("| 풍향 =", data["wind"]["deg"])
    print("| 풍속 =", data["wind"]["speed"])
    print("")




[# 170813 10 selenium-login]

이메일 제목읽어오기

# 170813 10 selenium-login

from selenium import webdriver
# PhantomJS 드라이버 추출하기 --- (※1)
browser = webdriver.PhantomJS()
# 3초 대기하기 --- (※2) phantumjs의 버그로 무조건 3초를 대기하고 , 이후 진행해야함
browser.implicitly_wait(3)
# 로그인 --- (※3)
browser.get("https://nid.naver.com/nidlogin.login")
# 화면을 캡처해서 저장하기 --- (※4)
element_id=browser.find_element_by_id("id") # 아이디 텍스트 입력
element_id.clear()
element_id.send_keys("****")

element_pw=browser.find_element_by_id("pw") # 비번 텍스트 입력
element_pw.clear()
element_pw.send_keys("****^")
browser.save_screenshot("website_c.png")
# 브라우저 종료하기 --- (※5)

button=browser.find_element_by_css_selector("input.btn_global[type=submit]")
button.submit()

# 메일 페이지 열기
browser.get("https://mail.naver.com/")
browser.save_screenshot("website_D.png")

#브라우져 종료
browser.quit()




[ #170814 1 xml-forecast] 
 -. 날씨 가져오기

from bs4 import BeautifulSoup 
import urllib.request #as req
import os.path
url = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108"
request = urllib.request.urlopen(url)
xml = request.read()
soup=BeautifulSoup(xml,"html.parser")
seoul=soup.find_all("location")[0]
datas=seoul.find_all("data")
for item in datas :
   print(item.find("wf").text)


[ # 170814 2 json-github ]


# 170814 2 json-github

import urllib.request as request
import os.path, random
import json

# JSON 데이터 내려받기 --- (※1)
url = "https://api.github.com/repositories"
savename = "repo.json"
if not os.path.exists(url):
    request.urlretrieve(url, savename)
# JSON 파일 분석하기 --- (※2)
items = json.load(open(savename, "r", encoding="utf-8"))
# 또는
# s = open(savename, "r", encoding="utf-8").read()
# items = json.loads(s)
# 출력하기 --- (※3)
for item in items:
    print(item["name"] + " - " + item["owner"]["login"])

print("--------------------------------------")

json_str=request.urlopen("https://api.github.com/repositories").read()
output=json.loads(json_str)

for item in output :
    print(item["name"])
    print(item["full_name"])
    print(item["owner"]["login"])
print()


[# EUC_KR로 저장된 CSV 파일 읽기]

import codecs
# EUC_KR로 저장된 CSV 파일 읽기
filename = "list-euckr.csv"
csv = codecs.open(filename, "r", "euc_kr").read()
# CSV을 파이썬 리스트로 변환하기
data = []
rows = csv.split("\r\n")
for row in rows:
    if row == "": continue
    cells = row.split(",")
    data.append(cells)
# 결과 출력하기
for c in data:
    print(c[1], c[2])


[# 170814 4 excel-read]

import openpyxl
book=openpyxl.load_workbook("stats_104102.xlsx")
#print(book.get_sheet_names())
#print(book.get_sheet_by_name("stats_104102")

sheet = book.worksheets[0]
for row in sheet.rows:
    for data in row:
     print(data.value,end=" ")
    print("",end="\n")

http://www.index.go.kr/potal/main/EachDtlPageDetail.do?idx_cd=1041


[ # 170814 5 write excel ]

import openpyxl

workbook=openpyxl.Workbook()
sheet=workbook.active

sheet["A1"] = "테스트 화일"
sheet["A2"] = "안녕"

sheet.merge_cells("A1:C1")
sheet["A1"].font=openpyxl.styles.Font(size=20,color="FF0000")

workbook.save("newFile.xlsx")


[ 참고자료 ]

https://www.docker.com/products/docker-toolbox  ==> docker 설치방법

https://www.data.go.kr/main.do