呉ユーキション - 生まれのナチュラルパイソン機械学習:ナイーブベイズスパムフィルタリング

ナイーブベイズは、いくつかの実際の生活を解決する
問題は、最初のテキスト文字列のリストを取得し、その後用語ベクトルを生成する必要がある場合。

データの準備:テキストセグメンテーション

テストアルゴリズム:ナイーブベイズクロスチェック

ファイルの構文解析と完全なスパムテスト機能

デフcreateVocabList(のdataSet):
    vocabSet =セット([])  空のセットを作成
    のための文書でのDataSetを:
        vocabSet = vocabSet | セット(文書)#の二組の組合は
    返すリスト(vocabSet)

デフsetOfWords2Vec(vocabList、のInputSetを):
    returnVec = [0] * (vocabList)lenの
     ための単語のInputSet:
         もし言葉vocabList:
            returnVec [vocabList.index(単語)] = 1
         さもなければプリント" 言葉は:%sが私の語彙ではありません!"%の単語)が
     返さreturnVec 

デフbagOfWords2VecMN(vocabList、のInputSet):
    returnVec = [0] * lenは(vocabList)の
     ための単語のInputSet:
         もし言葉をvocabList:
            returnVec [vocabList。インデックス(ワード)] + = 1
     リターンreturnVec 

デフ textParse(bigString):    入力は大きな文字列で、#outputは、単語リストである
    輸入
    listOfTokens = re.split(R ' \ W * '、bigString)
     リターン [tok.lower()のために TOK  listOfTokens 場合でlen(TOK)> 2 ] 

DEF trainNB0(trainMatrix、trainCategory):
    numTrainDocs = LEN(trainMatrix)
    numWords = LEN(trainMatrix [0])
    pAbusive = SUM(trainCategory )/ フロート(numTrainDocs)
    p0Num = もの(numWords)
    p1Num =もの(numWords)      ものに変更() 
    p0Denom = 2.0 
    p1Denom = 2.0                         2.0に変更
    するための I範囲(numTrainDocs):
         もし trainCategory [I] == 1 
            p1Num + = trainMatrix [I] 
            p1Denom + = 和(trainMatrix [I])
         
            p0Num + = trainMatrix [I] 
            p0Denom + = 和(trainMatrix [I] )
    p1Vect =(p1Num / p1Denom)ログ           #1 ()ログの変更を 
    p0Vect = LOG(p0Num / p0Denom)           #1 )(ログの変更を
    復帰p0Vect、p1Vect、pAbusive 

DEF aloneIndex(datasetLen):
    A = []
    しばらく(真):
        randIndex = INT(LEN random.uniform(0、(トレーニングセット)))
        a.append(randIndex)
        の場合(LEN(セット())== 10 ):
             ブレークは
    返すDEF :はspamtest()
    ドキュメントリストを = [] 
    CLASSLIST = [] 
    全文 = []
     のための I における範囲(1,26 ):
        wordListに = textParse(オープン(' F:\\ machinelearninginaction \\ CH04 \\メールスパム\\ \\%d.txt 'ⅰ).read())
        fullText.extend(wordListに)

 
        docList.append(wordListに) 
        classList.append( 1 
        wordListに = textParse(オープン(' F:\\ machinelearninginaction \\ CH04 \\メール\\ハム\\%d.txt 'I).read())
        ドキュメントリスト。追記(wordListに)
        fullText.extend(wordListに)
        classList.append(0)
    vocabList = createVocabList(ドキュメントリスト)#が作成語彙 
    トレーニングセット=範囲(50 
    TESTSET = aloneIndex(トレーニングセット)テストを作成し 
    trainingSetTを= []
     のために範囲(LEN(トレーニングセット)):
         のため Jにある範囲(LEN(TESTSET)を):
             もし(TESTSET [J] =!トレーニングセット[I]):
                trainingSetT.append(トレーニングセット[i])と
    トレーニングセット = trainingSetT 
    trainMat = [] 
    trainClasses = []
     のため docIndex におけるトレーニングセット:#1 分類器(GETちゃったごめんなさい)trainNB0列車
        trainMat.append(bagOfWords2VecMN(vocabList、ドキュメントリスト[docIndex]))
        trainClasses.append(CLASSLIST [docIndex])
    p0V、P1V、pSpam = trainNB0(配列(trainMat )、アレイ(trainClasses)) 
    ERRORCOUNT = 0
     のため docIndex  TESTSET:        は、残りの項目を分類 
        wordVector = bagOfWords2VecMN(vocabList、ドキュメントリスト[docIndex])
         であれば(!classifyNB(配列(wordVector)、p0V、P1V、pSpam)= CLASSLIST [docIndex]):
            ERRORCOUNT + = 1
             プリント" 分類エラー" 、ドキュメントリスト[docIndex])
     プリント' エラーレートがある:'、フロート(ERRORCOUNT)/ (TESTSET)LEN)
    
はspamtest()

 

おすすめ

転載: www.cnblogs.com/tszr/p/12041716.html