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类。