찬란하게

언어 판별기 제작하기! ㄴstep1. 본문

AI (인공지능)/미니프로젝트

언어 판별기 제작하기! ㄴstep1.

체리핫 2021. 3. 26. 17:02

언어 판별 서비스 소개

알파벳으로 구성된 문장을 입력하면 그 문장이 영어인지, 프랑스어인지, 인도네시아어인지, 타갈로그어인지를 판별해준다.

 

STEP1. 언어 판별하는 모형 학습시키기

 

 

모형 만드는 과정

 

파일로 저장

# # 1. 라이브러리 준비

# In[1]:


from sklearn import svm, metrics

# glob - 문자열을 파일 경로로 인식 -> 디렉터리 형태로 
import glob, os.path, re, json


# # 2. 함수 준비
# 
# check_freq() : 알파벳 출현 빈도 조사

# In[ ]:


# 텍스트를 읽어 들이고 출현 빈도 조사하기 --- (※1)
def check_freq(fname):
    name = os.path.basename(fname)
    lang = re.match(r'^[a-z]{2,}', name).group()
    # 파일 읽기
    with open(fname, "r", encoding="utf-8") as f:
        text = f.read()
    text = text.lower() # 소문자 변환
    # 숫자 세기 변수(cnt) 초기화하기
    cnt = [0 for n in range(0, 26)]
    code_a = ord("a")
    code_z = ord("z")
    # 알파벳 출현 횟수 구하기 --- (※2)
    for ch in text:
        n = ord(ch)
        if code_a <= n <= code_z: # a~z 사이에 있을 때
            cnt[n - code_a] += 1
    # 정규화하기 --- (※3)
    total = sum(cnt)
    freq = list(map(lambda n: n / total, cnt))
    return (freq, lang)


# In[ ]:


# 각 파일 읽고 처리하기고 처리하기
def load_files(path):
    freqs = []
    labels = []
                 # 실제경로 문자열 변환
    file_list = glob.glob(path)
    for fname in file_list:
        r = check_freq(fname)
# 문자 count 함수 r = (freq = [0.111, 0.3234, 01214], lang)
        freqs.append(r[0])
        labels.append(r[1])
    return print({"freqs":freqs, "labels":labels})


# # 3. main 부분

# In[ ]:


## --------- main ---------- ## 

data = load_files("./lang/train/*.txt")
test = load_files("./lang/test/*.txt")
# 이후를 대비해서 JSON으로 결과 저장하기
with open("./lang/freq2.json", "w", encoding="utf-8") as fp:
    json.dump([data, test], fp)


# In[3]:


# 학습하기 --- (※4)
clf = svm.SVC()
clf.fit(data["freqs"], data["labels"])
# 예측하기 --- (※5)
predict = clf.predict(test["freqs"])


# In[4]:


# 결과 테스트하기 --- (※6)
ac_score = metrics.accuracy_score(test["labels"], predict)
cl_report = metrics.classification_report(test["labels"], predict)
print("정답률 =", ac_score)
print("리포트 =")
print(cl_report)


# In[ ]: