ITPub博客

首页 > 大数据 > 数据挖掘 > (转载) 数据挖掘之分类

(转载) 数据挖掘之分类

数据挖掘 作者:Metalwin 时间:2010-11-26 10:15:57 0 删除 编辑

随着当代计算机硬件的发展,硬件功能越来越强大,价格越来越低,企业可以记录的数据也越来越多,这些因素就为数据挖掘的普及做了比较好的前提准备,树挖掘是未来信息处理的重要技术,而且就目前而言已经取得了决定性成功而且得到了比较广泛的应用。

数据挖掘中有很多领域,分类就是其中之一,什么是分类,
分类就是把一些新得数据项映射到给定类别的中的某一个类别,比如说当我们发表一篇文章的时候,就可以自动的把这篇文章划分到某一个文章类别,一般的过程是根据样本数据利用一定的分类算法得到分类规则,新的数据过来就依据该规则进行类别的划分。

分类在数据挖掘中是一项非常重要的任务,有很多用途,比如说预测,即从历史的样本数据推算出未来数据的趋向,有一个比较著名的预测的例子就是大豆学习。再比如说分析用户行为,我们常称之为受众分析,通过这种分类,我们可以得知某一商品的用户群,对销售来说有很大的帮助。

分类器的构造方法有统计方法,机器学习方法,神经网络方法等等。常见的统计方法有knn算法,基于事例的学习方法。机器学习方法包括决策树法和归纳法,上面讲到的受众分析可以使用决策树方法来实现。神经网络方法主要是bp算法,这个俺也不太了解。


文本分类, 所谓的文本分类就是把文本进行归类,不同的文章根据文章的内容应该属于不同的类别,文本分类离不开分词,要将一个文本进行分类,首先需要对该文本进行分 词,利用分词之后的的项向量作为计算因子,再使用一定的算法和样本中的词汇进行计算,从而可以得出正确的分类结果。在这个例子中,我将使用庖丁分词器对文 本进行分词。

下面这个例子将使用反余弦进行词汇单元进行匹配,
第一步,训练样本:
Java代码
  1. protected MapMapInteger>> getClassVector(List categoryList) throws Exception  
  2.           
  3.         if (categoryList == null || categoryList.size() == 0 
  4.             if (logger.isDebugEnabled())  
  5.                 logger.debug("The list of new categoryList which should be classified is null or size 0");  
  6.              
  7.             return Collections.emptyMap();  
  8.          
  9.           
  10.         MapMapInteger>> categoryMap new HashMapMapInteger>>();  
  11.           
  12.         Directory ramDir new RAMDirectory();  
  13.         IndexWriter writer new IndexWriter(ramDir, new PaodingAnalyzer(), true);  
  14.           
  15.         for (Category cRc categoryList)  
  16.             for (Article item cRc.getArticleList())  
  17.                   
  18.                 Document doc new Document();  
  19.                 doc.add(new Field("description"item.getContent(), Field.Store.NO,  
  20.                         Field.Index.TOKENIZED, TermVector.YES));  
  21.                 doc.add(new Field("category"cRc.getId().toString(), Field.Store.YES, Field.Index.NO));  
  22.                 writer.addDocument(doc);  
  23.              
  24.          
  25.           
  26.         if (logger.isDebugEnabled())  
  27.             logger.debug("Generate the index in the memory, the size of categoryList list is " categoryList.size());  
  28.          
  29.           
  30.         writer.close();  
  31.           
  32.         buildContentVectors(ramDir, categoryMap, "category""description");  
  33.         return categoryMap;  
  34.           
  35.      
protected Map> getClassVector(List categoryList) throws Exception {
                
                if (categoryList == null || categoryList.size() == 0) {
                        if (logger.isDebugEnabled()) {
                                logger.debug("The list of new categoryList which should be classified is null or size = 0");
                        }
                        return Collections.emptyMap();
                }
                
                Map> categoryMap = new HashMap>();
                
                Directory ramDir = new RAMDirectory();
                IndexWriter writer = new IndexWriter(ramDir, new PaodingAnalyzer(), true);
                
                for (Category cRc : categoryList) {
                        for (Article item : cRc.getArticleList()) {
                                
                                Document doc = new Document();
                                doc.add(new Field("description", item.getContent(), Field.Store.NO,
                                                Field.Index.TOKENIZED, TermVector.YES));
                                doc.add(new Field("category", cRc.getId().toString(), Field.Store.YES, Field.Index.NO));
                                writer.addDocument(doc);
                        }
                }
                
                if (logger.isDebugEnabled()) {
                        logger.debug("Generate the index in the memory, the size of categoryList list is " + categoryList.size());
                }
                
                writer.close();
                
                buildContentVectors(ramDir, categoryMap, "category", "description");
                return categoryMap;
                
        }

第二步:对待分类的文章进行分词(原理和样本训练类似):
Java代码
  1. protected MapMapInteger>> getArticleVector(List
     articleList) throws Exception  
  2.         if (articleList == null || articleList.size() == 0 
  3.             if (logger.isDebugEnabled())  
  4.                 logger.debug("The list of articles which should be classified is null or size 0");  
  5.              
  6.          
  7.           
  8.         MapMapInteger>> articleMap new HashMapMapInteger>>();  
  9.           
  10.         Directory articleRamDir new RAMDirectory();  
  11. //      IndexWriter writer new IndexWriter(articleRamDir, new ChineseAnalyzer(), true);  
  12.         IndexWriter writer new IndexWriter(articleRamDir, new PaodingAnalyzer(), true);  
  13.           
  14.         for (Article article articleList)  
  15.             Document doc new Document();  
  16.             doc.add(new Field("articleId"article.getId(),  
  17.                     Field.Store.YES, Field.Index.NO));  
  18.             doc.add(new Field("description"article.getContent(), Field.Store.NO, Field.Index.TOKENIZED, TermVector.YES));  
  19.             writer.addDocument(doc);  
  20.          
  21.           
  22.         writer.flush();  
  23.         writer.close();  
  24.           
  25.         buildContentVectors(articleRamDir, articleMap, "articleId""description");  
  26.         return articleMap;  
  27.      
protected Map> getArticleVector(List
articleList) throws Exception { if (articleList == null || articleList.size() == 0) { if (logger.isDebugEnabled()) { logger.debug("The list of articles which should be classified is null or size = 0"); } } Map> articleMap = new HashMap>(); Directory articleRamDir = new RAMDirectory(); // IndexWriter writer = new IndexWriter(articleRamDir, new ChineseAnalyzer(), true); IndexWriter writer = new IndexWriter(articleRamDir, new PaodingAnalyzer(), true); for (Article article : articleList) { Document doc = new Document(); doc.add(new Field("articleId", article.getId(), Field.Store.YES, Field.Index.NO)); doc.add(new Field("description", article.getContent(), Field.Store.NO, Field.Index.TOKENIZED, TermVector.YES)); writer.addDocument(doc); } writer.flush(); writer.close(); buildContentVectors(articleRamDir, articleMap, "articleId", "description"); return articleMap; }

分类的核心算法(下面这段代码的原理来自于lucene in action):
Java代码
  1. public double caculateVectorSpace(MapInteger> articleVectorMap, MapInteger> classVectorMap)  
  2.         if (articleVectorMap == null || classVectorMap == null 
  3.             if (logger.isDebugEnabled())  
  4.                 logger.debug("itemVectorMap or classVectorMap is null");  
  5.              
  6.               
  7.             return 20 
  8.          
  9.           
  10.         int dotItem 0 
  11.         double denominatorOne 0 
  12.         double denominatorTwo 0 
  13.           
  14.           
  15.         for (EntryInteger> entry articleVectorMap.entrySet())  
  16.             String word entry.getKey();  
  17.             double categoryWordFreq 0 
  18.             double articleWordFreq 0 
  19.               
  20.             if (classVectorMap.containsKey(word))  
  21.                 categoryWordFreq classVectorMap.get(word).intValue() classVectorMap.size();  
  22.                 articleWordFreq entry.getValue().intValue() articleVectorMap.size();  
  23.              
  24.               
  25.             dotItem += categoryWordFreq articleWordFreq;  
  26.             denominatorOne += categoryWordFreq categoryWordFreq;  
  27.             denominatorTwo += articleWordFreq articleWordFreq;  
  28.          
  29.           
  30.         double denominator Math.sqrt(denominatorOne) Math.sqrt(denominatorTwo);  
  31.           
  32.         double ratio  dotItem denominator;  
  33.           
  34.         return Math.acos(ratio);  
  35.      
public double caculateVectorSpace(Map articleVectorMap, Map classVectorMap) {
                if (articleVectorMap == null || classVectorMap == null) {
                        if (logger.isDebugEnabled()) {
                                logger.debug("itemVectorMap or classVectorMap is null");
                        }
                        
                        return 20;
                }
                
                int dotItem = 0;
                double denominatorOne = 0;
                double denominatorTwo = 0;
                
                
                for (Entry entry : articleVectorMap.entrySet()) {
                        String word = entry.getKey();
                        double categoryWordFreq = 0;
                        double articleWordFreq = 0;
                        
                        if (classVectorMap.containsKey(word)) {
                                categoryWordFreq = classVectorMap.get(word).intValue() / classVectorMap.size();
                                articleWordFreq = entry.getValue().intValue() / articleVectorMap.size();
                        }
                        
                        dotItem += categoryWordFreq * articleWordFreq;
                        denominatorOne += categoryWordFreq * categoryWordFreq;
                        denominatorTwo += articleWordFreq * articleWordFreq;
                }
                
                double denominator = Math.sqrt(denominatorOne) * Math.sqrt(denominatorTwo);
                
                double ratio =  dotItem / denominator;
                
                return Math.acos(ratio);
        }

效果:
测试数据:
Java代码
  1. public static List prepareCategoryList()  
  2.         List categoryList new ArrayList();  
  3.         List
     articleList new ArrayList
    ();  
  4.           
  5.         Category new Category();  
  6.         c.setArticleList(articleList);  
  7.         c.setId("1");  
  8.         categoryList.add(c);  
  9.           
  10.         Article a1 new Article();  
  11.         a1.setId("1");  
  12.         a1.setTitle("Hibernate初探");  
  13.         a1.setContent("开始看Hibernate reference,运行hibernate的test中的代码。 Environment是一个非常重要的类。它定义了很多常量,最重要的是hibernate的入口在这里。");  
  14.           
  15.         Article a2 new Article();  
  16.         a2.setId("2");  
  17.         a2.setTitle("Hibernate SQL方言");  
  18.         a2.setContent("PO的数据类型设置 int 还是Integer Integer 允许为 null Hibernate 既可以访问Field也可以访问Property");  
  19.           
  20.         Article a3 new Article();  
  21.         a3.setId("3");  
  22.         a3.setTitle("Hibernate 杂烩");  
  23.         a3.setContent("Hibernate 中聚合函数的使用 Criteria接口的Projections类主要用于帮助Criteria接口完成数据的分组查询和统计功能:");  
  24.           
  25.         Article a4 new Article();  
  26.         a4.setId("4");  
  27.         a4.setTitle("Hibernate映射类型");  
  28.         a4.setContent("Hibernate映射类型Hibernate映射类型,对应的基本类型及对应的标准SQL类型");  
  29.           
  30.           
  31.         articleList.add(a1);  
  32.         articleList.add(a2);  
  33.         articleList.add(a3);  
  34.         articleList.add(a4);  
  35.           
  36.         return categoryList;  
  37.      
  38.       
  39.     public static List
     prepareArticleList()  
  40.         List
     articleList new ArrayList
    ();  
  41.         Article a1 new Article();  
  42.         a1.setId("1");  
  43.         a1.setTitle("Hibernate学习笔记(一)");  
  44.         a1.setContent("本笔记的内容: 分层体系结构 ORM介绍 Hibernate简介 Hibernate开发步骤 Hibernate核心API ");  
  45.           
  46.         Article a2 new Article();  
  47.         a2.setId("2");  
  48.         a2.setTitle("Hibernate的性能问题");  
  49.         a2.setContent("各位老大,使用hibernate做企业级别的应用,会不会有性能问题啊?比如大数据量的搜索或者客户端同时大量的请求,会不会严重影响性能啊?有没有什么好的解决办法? 谢了先!");  
  50.           
  51.         Article a3 new Article();  
  52.         a3.setId("3");  
  53.         a3.setTitle("Spring2.5全面支持JEE5的实现");  
  54.         a3.setContent("Spring 2.5 发布已经有一段时间了,一直没有时间研究一下,只是听说有很多方面的提升。有一点十分重要的就是全面支持JEE5风格的annotation。");  
  55.           
  56.         Article a4 new Article();  
  57.         a4.setId("4");  
  58.         a4.setTitle("谈谈Spring的SqlMapClientTemplate对SqlMapClientCallback");  
  59.         a4.setContent(" 谈谈Spring的SqlMapClientTemplate对SqlMapClientCallback的使用 ■记得以前在看 SqlMapClientTemplate的源代码的时候,下面的这两段代码硬是没看懂当时我很疑惑:真的有必要用到内部匿名类这样诡异的手法么?");  
  60.           
  61.         Article a5 new Article();  
  62.         a5.setId("5");  
  63.         a5.setTitle("spring 2.0 学习笔记");  
  64.         a5.setContent(" 前几天学习hibernate!在mysql下都能正常跑出来.! 但是我一换成oracle就出现下面这种情况: 小弟不解呀..google了很多次 也解决不了此问题::.希望老大门帮忙看一下哈.!!! 环境:MyEclipse5.5,hibernate2.0,spring2.0");  
  65.           
  66.         articleList.add(a1);  
  67.         articleList.add(a2);  
  68.         articleList.add(a3);  
  69.         articleList.add(a4);  
  70.         articleList.add(a5);  
  71.           
  72.         return articleList;  
  73.      
public static List prepareCategoryList() {
                List categoryList = new ArrayList();
                List
articleList = new ArrayList
(); Category c = new Category(); c.setArticleList(articleList); c.setId("1"); categoryList.add(c); Article a1 = new Article(); a1.setId("1"); a1.setTitle("Hibernate初探"); a1.setContent("开始看Hibernate reference,运行hibernate的test中的代码。 Environment是一个非常重要的类。它定义了很多常量,最重要的是hibernate的入口在这里。"); Article a2 = new Article(); a2.setId("2"); a2.setTitle("Hibernate SQL方言"); a2.setContent("PO的数据类型设置 int 还是Integer Integer 允许为 null Hibernate 既可以访问Field也可以访问Property"); Article a3 = new Article(); a3.setId("3"); a3.setTitle("Hibernate 杂烩"); a3.setContent("Hibernate 中聚合函数的使用 Criteria接口的Projections类主要用于帮助Criteria接口完成数据的分组查询和统计功能:"); Article a4 = new Article(); a4.setId("4"); a4.setTitle("Hibernate映射类型"); a4.setContent("Hibernate映射类型Hibernate映射类型,对应的基本类型及对应的标准SQL类型"); articleList.add(a1); articleList.add(a2); articleList.add(a3); articleList.add(a4); return categoryList; } public static List
prepareArticleList() { List
articleList = new ArrayList
(); Article a1 = new Article(); a1.setId("1"); a1.setTitle("Hibernate学习笔记(一)"); a1.setContent("本笔记的内容: 分层体系结构 ORM介绍 Hibernate简介 Hibernate开发步骤 Hibernate核心API "); Article a2 = new Article(); a2.setId("2"); a2.setTitle("Hibernate的性能问题"); a2.setContent("各位老大,使用hibernate做企业级别的应用,会不会有性能问题啊?比如大数据量的搜索或者客户端同时大量的请求,会不会严重影响性能啊?有没有什么好的解决办法? 谢了先!"); Article a3 = new Article(); a3.setId("3"); a3.setTitle("Spring2.5全面支持JEE5的实现"); a3.setContent("Spring 2.5 发布已经有一段时间了,一直没有时间研究一下,只是听说有很多方面的提升。有一点十分重要的就是全面支持JEE5风格的annotation。"); Article a4 = new Article(); a4.setId("4"); a4.setTitle("谈谈Spring的SqlMapClientTemplate对SqlMapClientCallback"); a4.setContent("谈谈Spring的SqlMapClientTemplate对SqlMapClientCallback的使用 ■记得以前在看SqlMapClientTemplate的源代码的时候,下面的这两段代码硬是没看懂当时我很疑惑:真的有必要用到内部匿名类这样诡异的手法么?"); Article a5 = new Article(); a5.setId("5"); a5.setTitle("spring 2.0 学习笔记"); a5.setContent("前几天学习hibernate!在mysql下都能正常跑出来.! 但是我一换成oracle就出现下面这种情况: 小弟不解呀..google了很多次也解决不了此问题::.希望老大门帮忙看一下哈.!!! 环境:MyEclipse5.5,hibernate2.0,spring2.0"); articleList.add(a1); articleList.add(a2); articleList.add(a3); articleList.add(a4); articleList.add(a5); return articleList; }

以上测试代码中的数据来源于javaeye的文章。
输出:
2008-02-19 11:05:42,031 DEBUG ArticleClassifierImpl:74 - articleId=2---------acos value=1.412016112149136
2008-02-19 11:05:42,031 DEBUG ArticleClassifierImpl:74 - articleId=1---------acos value=1.3258176636680326
2008-02-19 11:05:42,031 DEBUG ArticleClassifierImpl:74 - articleId=5---------acos value=1.4244090675006476

有此可见文章id号为1,2,5的文章符合hibernate分类,事实上我们还要更进一步,假设我们有两个分 类,hibernate,spring,各有5各样本,那么最后的结果应该再次作最小符合判断,acos值最小的则认为该article属于该分类,同学 们可以自己做一下实验。

文本分类中有很多注意点,比如说噪音词去除(上面的代码中并包括最简单的噪音词去除功能)等,接下来我会使用knn算法改造以上代码,并使用相同的测试数据并比对测试结果。
<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21822798/viewspace-1118911/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-06-05