티스토리 뷰

#1 흐름도








#2 학습 데이터 소스코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from sklearn import svm, metrics
import glob, os.path
 
#1 file load
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"# 97이라는 숫자를 a코드에 저장
    code_z = ord("z"# 122라는 숫자를 z코드에 저장.
 
    count = [0 for n in range(026)]  # 0을 26개를 나열함.
    
    for character in text:
        code_current = ord(character) # current를 출력해보면 기사문장의 알파벳 하나하나을 숫자코드로 변환해서 하나하나 다 출력해줌.
        if code_a <= code_current <= code_z:
            count[code_current - code_a] += 1 # 여기 과정이 이해안됨.. count 리스트에 값을 넣는 과정이라는건 이해됨.
 
    
    #정규화
 
    total = sum(count)
    count = list(map(lambda n:n / total, count)
 
    #리스트에 넣기
    train_label.append(lang) #lang을 추가
    train_data.append(count) #count를 추가
cs




5번째 줄 : glob()메소드를 사용해서 학습용으로 사용될 데이터들을 모드 긁어오는 과정, glob() 메소드 참고

8~9번째 줄 : 학습데이터와 학습 레이블 리스트 변수 생성.

13번째 줄 : 읽어들여온 학습 데이터들을 for문을 통해서 가져오는데 여기서는 파일 경로를 제외한 이름을 가지고 온다.

13번째줄까지 하고 출력을 해보면 아래와 같이 출력이 되는것을 확인할 수 있다.





14번째 줄 : files를 출력해보면 ./lang/train/en-2.txt 이렇게 출력이 된다. 14번재줄은 en, fr, tl 이렇게 뽑아내기 위해서 사용이 된다. split() 메소드는 하위 문자열로 분할할때 사용

14번째줄을 출력해보면 아래와 같이 출력되는것을 확인할 수 있다.



17번째 줄 : 기사 내용을 다 뽑아내고

18번째 줄 : 뽑은 기사내용을 읽어드린 후(이때는 대,소문자가 섞여서 출력되는것을 확인할 수 있다.)

19번째 줄 : 소문자로 변환하고(대,소문자가 섞인 기사내용이 소문자로 변환되어서 출력되는것을 확인할 수 있다.

20번째 줄 : 읽어드리는 과정을 종료한다.




여기가지가 레이블을 구하고 기사내용을 소문자로 변환하여 추출하는 과정이다.

이제 알파벳 사용 빈도수룰 구하고 정규화시켜서 리스트에 넣는 과정을 해보도록 하겠다.





27번째 줄 : a를 아스키코드로 변환해서 보면 97이다. 따러서 숫자코드로 저장을 하는 과자ㅓㅇ

30번째 줄 : [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] 을 count 리스트 변수로 만드는 과정이다.

32번째 줄 : 소문자로 변환된 기사내용을 character 변수에 넣어서 for문을 돌리는 과정이다.

33번재 줄 : character를 출력해보면 기사 문장의 각각 알파벳들을 하나하나 숫자코드로 변환해서 출력을 해주는것을 확인할 수 있다.

34번째 줄 : 조건문이 성립이 된다면, 각각 숫자코드를 count 리스트에 집어넣는 과정이다. (이 과정은 잘 이해가 안되는 부분입니다 잘 알고 계시는 분들은 댓글로 달아주시면 감사하겠습니다.) 


40번째 줄 : 카운트 변수의 각 리스트 요소들을 다 더하고

41번째 줄 : 더한 요소들을 0 ~ 1의 값의 범위로 정규화를 시켜준다. lambda 참고 문서

덧붙여서 lambda에 대해 간단하게 알아보면 해당 코드를 다른 방법으로 표현하면 아래와 같이 적을 수 있다.


lambda n:10은 

def test(n):

   return 10


과 동일하다.



그리고 각 내용들을 리스트에 넣어준다.




위에서는 학습용 데이터를 정규화까지 시키는 과정이다.

학습용 데이터가 있으면 테스트용 데이터가 있어야 한다. 따라서 테스트용 데이터는 학습용 데이터와 코드가 동일하므로 따로 설명은 안하겠습니다.




#3 테스트용 데이터 소스코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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#split()메서드 : 하위 문자열로 분할.
    """
    filename을 기준으로 파일을 읽어드린 다음에 그 file의 내부에 있는 값을 추출.
    """
    #텍스트 추출하기
    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 for n in range(0,26)]
    #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:
            """
            'a'97 - 'a'97 = 0
            'b'98 - 'a'97 = 1
            """
            count[code_current - code_a] += 1
    """
    0~1 사이에 있는 값인 벡터를 구하기 위해서 정규화를 시켜야함.
    """
    # 정규화
    total = sum(count)
    count = list(map(lambda n:n / total, count))
    """
    lambda n:10란,
    def test(n): 매개변수가 하나인 함수를 만드는 것,
        return 10
    """
 
    #리스트에 넣기
    test_label.append(lang)
    test_data.append(count)
cs




#4 기계학습


1
2
3
4
5
6
7
8
9
#학습시키기
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 : ", report)
 
cs


기계학습에 대한 내용은 이전 포스트를 참고하면 될거 같습니다. 이전 포스트



#5 결과




Comments