Yet Never Lose Faith

- Good to Great , Jim Collins

How To Preprocess Image Data 자세히보기

Deep Learning/[Books] 머신러닝, 딥러닝 실전 앱 개발

머신러닝 이용하여 언어판정하기 (feat. Unicode code point)

Kellyyyy 2020. 5. 21. 08:00

언어판정이란 주어진 문장이 어떤 언어로 작성됐는지 판정하는 것을 의미한다.

머신러닝 모델을 사용해서 언어판정을 해보려고 한다.

 

1. 이론

 

(1) Unicode codepoint

 

언어의 종류마다 사용하는 문자가 다르다.

 

한국어는 '가, 나,...' 

영어는 'a,b,...'

일본어는 'か,つ,...'

 

언어판정을 위해서는 사용하는 문자의 차이, 사용빈도를 구분할 수 있어야한다.

이때, 문자의 식별을 위해 Unicode codepoint라는 개념을 사용한다.

 

Unicode codepoint란?

 

문자열을 대표하는 정수값으로, 문자열에 할당된 코드값을 의미한다.

한 문자는 한 코드를 갖는다.

 

유니코드 전체를 논리적으로 묶은 평면을 유니코드 평면이라고 하는데,

총 17개의 평면으로 구성되어 있으며, 한 평면은 65536개의 코드 포인트가 존재한다.

 

오늘 내가 사용할 평면은 BMP 평면이다.

다국어 기본 평면으로 유니코드에서 많이 쓰이는 문자나 기호에 배정한 평면이다.

 

(2) 사용 알고리즘

 

sklearn에서 제공하는 GaussianNB를 사용하겠다.

 

 

2. 구축

 

(1) Unicode codepoint를 사용해서 문자의 출현빈도 세는 함수 구현하기

 

우선, 입력된 문자의 Unicode codepoint를 기록할 배열을 만든다.

한 평면은 65536개의 포인트를 가지므로 동일한 크기의 배열이 필요하다.

 

 

import numpy as np
counter = np.zeros(65535)

 

 

다음으로, 입력받은 문자를 Unicode codepoint로 변환한 후 출현 횟수를 센다.

이때 ord()를 이용하면 문자를 Unicode codepoint로 바꿀 수 있다. 

 

 

for i in range(len(str)) :
    code_point = ord(str[i])
    counter[code_point] += 1

 

 

마지막으로, 출현빈도를 구하기 위해 전체 입력문자수로 counter배열을 나눈다.

 

 

counter = counter/len(str)

 

 

함수로 정리하면 다음과 같다.

 

 

def count_codePoint(str) :
    
    counter = np.zeros(65535)
    
    for i in range(len(str)) :
        code_point = ord(str[i])
        counter[code_point] += 1
        
    counter = counter/len(str)
    
    return counter

 

 

(2) 머신러닝 모델 구축 및 학습, 평가

 

우선, 학습 전용 데이터를 준비한다.

일본어, 영어, 한국어 3종류를 준비했다.

 

ko_str = "이것은 한국어 문장입니다."
en_str = "This is English Sentences."
ja_str = "これは日本の文章です。"

x_train = [count_codePoint(ko_str), count_codePoint(ja_str), count_codePoint(en_str)]
print(x_train)
y_train = ['ko','ja', 'en']

 

 

다음으로 GaussianNB를 사용하여 모델 껍데기를 만들고,

fit()을 사용하여 가중치를 학습한다.

 

 

from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(x_train, y_train)

 

 

모델이 완성됐으면 평가전용 데이터를 준비한다.

정답률을 확인해보기 위해 y_test 데이터도 생성했다.

 

 

ko_test_str = '안녕하세요.'
ja_test_str = 'こんにちは'
en_test_str = 'Hello'

x_test = [count_codePoint(ko_test_str), count_codePoint(ja_test_str), count_codePoint(en_test_str)]
y_test = ['ko','ja','en']

 

 

마지막으로 predict()를 사용하여 test데이터 언어를 판정하고

accuracy_score()를 사용하여 정답률을 구한다.

 

 

from sklearn.metrics import accuracy_score
y_pred = clf.predict(x_test)
print(y_pred)
print('정답률=',accuracy_score(y_test,y_pred))

 

 

결과를 보면 제대로 분석했다는 것을 확인할 수 있다.

 

 

 

 

전체 소스코드를 정리하면 아래와 같다.

 

 

import numpy as np

def count_codePoint(str) :
    
    counter = np.zeros(65535)
    
    for i in range(len(str)) :
        code_point = ord(str[i])
        counter[code_point] += 1
        
    counter = counter/len(str)
    
    return counter
    
ko_str = "이것은 한국어 문장입니다."
en_str = "This is English Sentences."
ja_str = "これは日本の文章です。"

x_train = [count_codePoint(ko_str), count_codePoint(ja_str), count_codePoint(en_str)]
print(x_train)
y_train = ['ko','ja', 'en']

from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(x_train, y_train)

ko_test_str = '안녕하세요.'
ja_test_str = 'こんにちは'
en_test_str = 'Hello'

x_test = [count_codePoint(ko_test_str), count_codePoint(ja_test_str), count_codePoint(en_test_str)]
y_test = ['ko','ja','en']

from sklearn.metrics import accuracy_score
y_pred = clf.predict(x_test)
print(y_pred)
print('정답률=',accuracy_score(y_test,y_pred))

 

 

참고문헌 

- Unicode codepoint에 대한 내용은 아래 포스팅에서 참고했다.

더 알아보고 싶다면 확인해보면 좋을 것 같다.

https://miaow-miaow.tistory.com/37

 

[Unicode] Unicode 란? (문자세트, 인코딩, 코드 포인트, 평면, 정규화) 🤪

목표: Unicode란 무엇이고, Unicode에서 알아두어야 할 용어들을 파악하자 문자 세트(Character set) 문자 인코딩(Character encoding) 코드 포인트(Code point) 유니코드 평면(Unicode Planes) 유니코드 정규화(U..

miaow-miaow.tistory.com

 

- 전체적인 내용은 책 [파이썬을 이용한 머신러닝, 딥러닝 실전 앱 개발]을 인용했다.