TechTogetWorld

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

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

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


본글은 언어구분 방법에 대한 글입니다.

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


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


1. 동작구현 ==> [# 170820 4 lang-train-project_v03 ]

  - 프로그램을 실행하면, 프로그램에서 자동으로 독일어 사이트에서 9개의 독일어

    원문을 크롤링 해옵니다.

  - 별도로 저장한 프랑스어 txt 화일과 함께 학습을 합니다(학습용 5개 : fr-1 ~ fr-5 )

  - 프랑스어 4개( fr6~fr9)로 테스트를 실행합니다.

  - 평가합니다.

  - 특기사항

     . 크롤링 프로그램의 경우는 초반에 잘 되다가도, 중간에 인터넷 사이트의 뉴스기사가

        바뀌면  간혹 크롤링이 잘 않되는경우가 발생하는것 같습니다 (단순 텍스트만 바뀌면

        상관이 없지만, 글의 구조가 바뀌는경우입니다), 감안해서 코딩이 필요합니다.

2. Source code


170820 4 lang-train-project_v03.py

fr---6.txt

fr---7.txt

fr---8.txt

fr---9.txt

fr--1.txt

fr--2.txt

fr--3.txt

fr--4.txt

fr--5.txt


3. 참고자료    


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


 [# 170820 4 lang-train-project_v03 ]


import urllib.request

from bs4 import BeautifulSoup

import time

from sklearn import svm, metrics

import glob, os.path ,re, json


# train data

# HTML 가져오기

url = "http://www.zeit.de/index"

response = urllib.request.urlopen(url)

# HTML 분석하기

soup = BeautifulSoup(response, "html.parser")

# 원하는 데이터 추출하기 --- (※1)

results = soup.select("#main > div > div.cp-area.cp-area--major  div > h2 > a")

i=0

for result in results:

  i=i+1

  print(i,"st article")

  print("title:" , result.attrs["title"])

  url_article=result.attrs["href"]

  response = urllib.request.urlopen(url_article)

  soup_article=BeautifulSoup(response, "html.parser")

  content=soup_article.select_one("p")


  output=""

  for item in content.contents:

    stripped=str(item).strip()

    if stripped == "":

      continue

    if stripped[0] not in ["<","/"]:

      output+=str(item).strip()

      print(output)


# 추출한 data를 txt 화일로 저장하기

  fn= "de" +"--"+ str(i)+ ".txt"

  fw = open(fn, 'w', encoding='UTF-8', newline='')

 # f = open("C:/Python/새파일.txt", 'w')

  result_text = output

  fw.write(result_text)

  fw.close()

  # 1초휴식 : 초당 서버호츨 횟수가 늘어나면, 아이디 차단당할수 있음. 휴식시간이 필요함

  time.sleep(1.5)


# 학습시키기

files=glob.glob("*--*.txt")

train_data=[]

train_label=[]

i=0

for file_name in files :

    i=i+1

    print(i)

    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)+0.00001

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

#리스트에 넣기

    train_label.append(lang)

    train_data.append(count)



# 테스트 하기: 프랑스어 4개 화일(6~9번)을 테스용 데이터로 사용함

i=0

files=glob.glob("*---*.txt")

test_data=[]

test_label=[]

for file_name in files :

    i=i+1

    print(i)

    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)+0.00001

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

#리스트에 넣기

    test_label.append(lang)

    test_data.append(count)


# 평가하기

clf = svm.SVC()

clf.fit(train_data, train_label)

predict=clf.predict(test_data)

score=metrics.accuracy_score(test_label, predict)

print("score=",score)

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

print("test_data=",test_data)

print("predict=",predict)




[참고자료]


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

http://konlpy-ko.readthedocs.io/ko/v0.4.3/

https://ithub.korean.go.kr/user/total/database/corpusView.do