ITS's Dev Story

오늘은 나이브 베이스 확률이론을 사용해서 스팸메일 필터링 소프트웨어를 동작시키고 구현해 보았다.

먼저, 텍스트 토큰을 생성한다. 나는 아래와 같이 생성하였다.

그 다음, 이메일 데이터 집합 (예제 파일로 제공하는 샘플 데이터이다.)을 꺼낸다. 그 후, 파일 구문 분석 소스와 전체스팸 검사 함수를 Python으로 만들어 보았다. 

-------------------------------------------------------------------------------------------

* Numpy 기계학습의 모든 문서는 제가 머신러닝을 공부하고, 제 프로젝트에 필요한 알고리즘을 찾기 위해 정리하는 일종의 '요점정리 노트' 입니다. 혹여나 오해 없으시기 바랍니다. (2016.03.14 추가)

-------------------------------------------------------------------------------------------

소스코드는 아래와 같다.

def textParse(bigString):
    import re
    listOfTokens = re.split(r'\W*', bigString)
    return [tok.lower() for tok in listOfTokens if len(tok) > 2] 
    
def spamTest():
    docList=[]; classList = []; fullText =[]
    for i in range(1,26):
        wordList = textParse(open('email/spam/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(1)
        wordList = textParse(open('email/ham/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
    vocabList = createVocabList(docList)
    trainingSet = range(50); testSet=[]          
    for i in range(10):
        randIndex = int(random.uniform(0,len(trainingSet)))
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])  
    trainMat=[]; trainClasses = []
    for docIndex in trainingSet:
        trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
        trainClasses.append(classList[docIndex])
    p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses))
    errorCount = 0
    for docIndex in testSet:      
        wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])
        if classifyNB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
            errorCount += 1
            print "classification error",docList[docIndex]
    print 'the error rate is: ',float(errorCount)/len(testSet)


맨 마지막 실행 화면은 사진으로 못 찍었지만 글로 써 본다.

>>> bayes.spamTest()

the error rate is : 0.0

초등학교 5학년 때 서울교대 영재원을 다니면서 오바마와 박근혜 대통령의 연설문 데이터에서 가장 많이 쓰인 단어를 추출해내는 프로그램을 교수님이 만들어 보라고 하신 적이 있다. 단순히 기술만 생각한다면 이 수업은 별 효과가 없을 것이라고 생각한다. 아마도 머신러닝도 그럴 것이다.

오늘은 여기까지 하기로 했다.