PyMining - 基於Python的數據挖掘平臺來進行文本分類

http://code.google.com/p/python-data-mining-platform/

 

裏面有介紹一些關於機器學習的一些算法。

 

從搜狗實驗室下載語料

http://www.sogou.com/labs/dl/c.html

注:這些都是分好類別的 http://code.google.com/p/python-data-mining-platform/wiki/Additional_Tools

解壓到d盤。

 

檢出pymining代碼 http://python-data-mining-platform.googlecode.com/svn/trunk/

 

將整個代碼複製到一個python的項目。

 


將搜狗的語料轉換成pymining的語料格式。

tools/sogou_importer.py

 

 

#encoding=utf-8

import dircache
import sys
import os

if __name__ == "__main__":
#    if len(sys.argv) <> 3:
#        print "python sogou_importer.py sogou_path output_file_path"
#        sys.exit()
    
    dirNameDict = { \
                   "C000008":0, \
                   "C000010":1, \
                   "C000013":2, \
                   "C000014":3, \
                   "C000016":4, \
                   "C000020":5, \
                   "C000022":6, \
                   "C000023":7, \
                   "C000024":8, \
                  }
     
#    outputPath = sys.argv[2]
#    inputDir = sys.argv[1]
    outputPath = "sougou_train.txt"
    inputDir = "D:\Reduced";
    ofs = open(outputPath, "w")

    if inputDir[len(inputDir) - 1] != "/":
        inputDir += "/"

    for dirName in dirNameDict.keys():
        newDir = inputDir + dirName + "/"
        if (not os.path.exists(newDir)):
            continue
        fileList = dircache.listdir(newDir)
        for fileName in fileList:
            filePath = newDir + fileName
            if (not os.path.exists(filePath)):
                continue
            ifs = open(filePath, "r")
            fileContent = ifs.read()
            fileContent = fileContent.decode("gb18030", "ignore")
            fileContent = fileContent.replace("\n", " ")
            fileContent = fileContent.replace("\t", " ")
            ofs.write(fileContent.encode("utf-8") + "\t" + str(dirNameDict[dirName]) + "\n")
            ifs.close()

    ofs.close()
 

一共8個類別,自行判斷每個文件夾的新聞類別

 

將格式化後的語料複製到項目的example/data/目錄下。在example目錄下新建mining目錄

 

 

開始測試分類的準確性:

在example/data/sougou_train.txt中複製一個語料保存到example/data/sougou_test.txt中(後面帶一個數字,這個數字代表的一個新聞的類別)。格式要與sougou_train.txt的格式保持一致。

運行 example/naive_bayes_only_test.py

 

 

#coding: utf8
import sys, os
sys.path.append(os.path.join(os.getcwd(), '../'))
from pymining.math.matrix import Matrix
from pymining.math.text2matrix import Text2Matrix
from pymining.nlp.segmenter import Segmenter
from pymining.common.global_info import GlobalInfo
from pymining.common.configuration import Configuration
from pymining.preprocessor.chisquare_filter import ChiSquareFilter
from pymining.classifier.naive_bayes import NaiveBayes

if __name__ == "__main__":
    config = Configuration.FromFile("conf/test.xml")
    GlobalInfo.Init(config, "__global__")
    txt2mat = Text2Matrix(config, "__matrix__")
    [trainx, trainy] = txt2mat.CreateTrainMatrix("data/sougou_train.txt")
    chiFilter = ChiSquareFilter(config, "__filter__")
    chiFilter.TrainFilter(trainx, trainy)
    [trainx, trainy] = chiFilter.MatrixFilter(trainx, trainy)

    nbModel = NaiveBayes(config, "naive_bayes")
    nbModel.Train(trainx, trainy)

    [testx, testy] = txt2mat.CreatePredictMatrix("data/sougou_test.txt")
    [testx, testy] = chiFilter.MatrixFilter(testx, testy)
    [resultY, precision] = nbModel.Test(testx, testy)
    
    print precision

    

 

 

 

一會就輸出準確率了 

 


 

example/mining目錄下會生成一些文件,這是pymining的一些學習模型,分類的時候可以加載這些文件來判別新的新聞來分類,或者直接在線的學習不加載這些文件。

參考http://code.google.com/p/python-data-mining-platform/wiki/Tutorial 

 

 

 

比如ClassifiterMatrix類初始化的時候,將讀取標籤爲matrix的信息(某些模塊如果不需要讀取某種標籤的信息,這個標籤下面將是無內容的,具體請見後面的xml)。
初始化的時候,需要指定最後一個布爾參數(isFromFile),表示是否這個模塊從配置類中指定的文件中載入得到。
一般在訓練的時候,指定這個參數爲False,而在單獨測試的時候,需要指定這個參數爲True,因爲需要從訓練的時候生成的文件中載入訓練的模型才能夠進行測試。
 

開始分類:

我們選擇不加載學習模型的文件來分類,從百度的新聞中找一個新聞。

 

運行example/naive_bayes_train_test_bysample.py

 

#encoding=utf8
import sys, os
sys.path.append(os.path.join(os.getcwd(), '../'))

from pymining.math.matrix import Matrix
from pymining.math.text2matrix import Text2Matrix
from pymining.nlp.segmenter import Segmenter
from pymining.common.global_info import GlobalInfo
from pymining.common.configuration import Configuration
from pymining.preprocessor.chisquare_filter import ChiSquareFilter
from pymining.classifier.naive_bayes import NaiveBayes


if __name__ == "__main__":
    config = Configuration.FromFile("conf/test.xml")
    GlobalInfo.Init(config, "__global__")
    txt2mat = Text2Matrix(config, "__matrix__")
    [trainx, trainy] = txt2mat.CreateTrainMatrix("data/sougou_train.txt")
    chiFilter = ChiSquareFilter(config, "__filter__")
    chiFilter.TrainFilter(trainx, trainy)

    nbModel = NaiveBayes(config, "naive_bayes")
    nbModel.Train(trainx, trainy)
    
    inputStr = "朝鮮人民軍總參謀長李英浩被解職後,美韓不斷猜測朝鮮內幕。據環球網報道,韓國《京鄉新聞》22日分析稱,“炸銅像事件可能成爲朝鮮半島緊張的新火種”,甚至揣測朝鮮可能借此牽制美國並實施第三次核試驗。據京華時報報道,7月19日,朝方當天在首都平壤召開記者會,一名嫌疑人自稱受韓國和美國情報機構指使,企圖炸燬朝鮮建國領袖金日成的銅像。朝鮮外務省發言人20日表示,由於美國不改變其對朝敵視政策,朝鮮“不得不全面重新考慮核問題”。"

    [cols, vals] = txt2mat.CreatePredictSample(inputStr.decode("utf-8"))
    [cols, vals] = chiFilter.SampleFilter(cols, vals)
    probTuple = nbModel.TestSample(cols, vals)
    print probTuple
 

 

 

輸出這個新聞的每個類別的相似概率。

 

 

朝鮮人民軍總參謀長李英浩被解職後,美韓不斷猜測朝鮮內幕。
據環球網報道,韓國《京鄉新聞》22日分析稱,“炸銅像事件可能成爲朝鮮半島緊張的新火種”,甚至揣測朝鮮可能借此牽制美國並實施第三次核試驗。
據京華時報報道,7月19日,朝方當天在首都平壤召開記者會,一名嫌疑人自稱受韓國和美國情報機構指使,企圖炸燬朝鮮建國領袖金日成的銅像。
朝鮮外務省發言人20日表示,由於美國不改變其對朝敵視政策,朝鮮“不得不全面重新考慮核問題”。
((0, 3.9413063433550935e-60), (1, 1.5063156437023602e-39), (2, 6.35241774643204e-48), (3, 2.2260167379491118e-68), (4, 7.13553884486322e-30), (5, 7.708008674579432e-40), (6, 1.5767993409024485e-48), (7, 0.06578001159339009), (8, 0.9342199884066099))

 

(8, 0.9342199884066099)從這個可以看出,這個新聞屬於我們的新聞類別中的第8類。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章