(update 2012.12.28 关于本项目下载及运行的常见问题 FAQ见 newsgroup18828文本分类器、文本聚类器、关联分析频繁模式挖掘算法的Java实现工程下载及运行FAQ )
本文要点如下:
对newsgroup文档集进行预处理,按照DF法及SVD分解法抽取特征词,实现降维
实现了K-Means,MBSAS,DBSCAN三种聚类算法用weka工具进行newsgroup文档聚类
计算各种算法聚类的熵,进行算法评价
1、newsgroup文档集预处理
newsgroup是常用的数据挖掘实验数据。文本预处理主要包括单词分片、去除标点等无关符号、去停用词等等,相关详细介绍见我的另一篇博文数据挖掘-基于贝叶斯算法及KNN算法的newsgroup18828文本分类器的JAVA实现(上),此处只给出文本预处理和向量化不同的部分代码。
文本预处理类DataPreProcess.java
package com.pku.yangliu;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
/** 
 * Newsgroups文档集预处理类
 */
public class DataPreProcess {
	
	/**输入文件调用处理数据函数
	 * @param strDir newsgroup文件目录的绝对路径
	 * @throws IOException 
	 */
	public void doProcess(String strDir) throws IOException{
		File fileDir = new File(strDir);
		if(!fileDir.exists()){
			System.out.println("File not exist:" + strDir);
			return;
		}
		String subStrDir = strDir.substring(strDir.lastIndexOf('/'));
		String dirTarget = strDir + "/../../processedSample_includeNotSpecial"+subStrDir;
		File fileTarget = new File(dirTarget);
		if(!fileTarget.exists()){//注意processedSample需要先建立目录建出来,否则会报错,因为母目录不存在
			fileTarget.mkdir();
		}
		File[] srcFiles = fileDir.listFiles();
		String[] stemFileNames = new String[srcFiles.length];
		for(int i = 0; i < srcFiles.length; i++){
			String fileFullName = srcFiles[i].getCanonicalPath();
			String fileShortName = srcFiles[i].getName();
			if(!new File(fileFullName).isDirectory()){//确认子文件名不是目录如果是可以再次递归调用
				System.out.println("Begin preprocess:"+fileFullName);
				StringBuilder stringBuilder = new StringBuilder();
				stringBuilder.append(dirTarget + "/" + fileShortName);
				createProcessFile(fileFullName, stringBuilder.toString());
				stemFileNames[i] = stringBuilder.toString();
			}
			else {
				fileFullName = fileFullName.replace("\\","/");
				doProcess(fileFullName);
			}
		}
		//下面调用stem算法
		if(stemFileNames.length > 0 && stemFileNames[0] != null){
			Stemmer.porterMain(stemFileNames);
		}
	}
	
	/**进行文本预处理生成目标文件
	 * @param srcDir 源文件文件目录的绝对路径
	 * @param targetDir 生成的目标文件的绝对路径
	 * @throws IOException 
	 */
	private static void createProcessFile(String srcDir, String targetDir) throws IOException {
		// TODO Auto-generated method stub
		FileReader srcFileReader = new FileReader(srcDir);
		FileReader stopWordsReader = new FileReader("F:/DataMiningSample/stopwords.txt");
		FileWriter targetFileWriter = new FileWriter(targetDir);	
		BufferedReader srcFileBR = new BufferedReader(srcFileReader);//装饰模式
		BufferedReader stopWordsBR = new BufferedReader(stopWordsReader);
		String line, resLine, stopWordsLine;
		//用stopWordsBR够着停用词的ArrayList容器
		ArrayList<String> stopWordsArray = new ArrayList<String>();
		while((stopWordsLine = stopWordsBR.readLine()) != null){
			if(!stopWordsLine.isEmpty()){
				stopWordsArray.add(stopWordsLine);
			}
		}
		while((line = srcFileBR.readLine()) != null){
			resLine = lineProcess(line,stopWordsArray);
			if(!resLine.isEmpty()){
				//按行写,一行写一个单词
				String[] tempStr = resLine.split(" ");//\s
				for(int i = 0; i < tempStr.length; i++){
					if(!tempStr[i].isEmpty()){
						targetFileWriter.append(tempStr[i]+"\n");
					}
				}
			}
		}
		targetFileWriter.flush();
		targetFileWriter.close();
		srcFileReader.close();
		stopWordsReader.close();
		srcFileBR.close();
		stopWordsBR.close();	
	}
	
	/**对每行字符串进行处理,主要是词法分析、去停用词和stemming
	 * @param line 待处理的一行字符串
	 * @param ArrayList<String> 停用词数组
	 * @return String 处理好的一行字符串,是由处理好的单词重新生成,以空格为分隔符
	 * @throws IOException 
	 */
	private static String lineProcess(String line, ArrayList<String> stopWordsArray) throws IOException {
		// TODO Auto-generated method stub
		//step1 英文词法分析,去除数字、连字符、标点符号、特殊字符,所有大写字母转换成小写,可以考虑用正则表达式
		String res[] = line.split("[^a-zA-Z]");
		//这里要小心,防止把有单词中间有数字和连字符的单词 截断了,但是截断也没事
		String resString = new String();
		//step2去停用词
		//step3stemming,返回后一起做
		for(int i = 0; i < res.length; i++){
			if(!res[i].isEmpty() && !stopWordsArray.contains(res[i].toLowerCase())){
				resString += " " + res[i].toLowerCase() + " ";
			}
		}
		return resString;
	}
	/**
	 * @param args
	 * @throws IOException 
	 */
	public void BPPMain(String[] args) throws IOException {
		// TODO Auto-generated method stub
		DataPreProcess dataPrePro = new DataPreProcess();
		dataPrePro.doProcess("F:/DataMiningSample/orginSample");
	}
}
package com.pku.yangliu;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import java.util.SortedMap;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.Iterator;
import java.util.TreeSet;
/**计算文档的属性向量,将所有文档向量化
 *
 */
public class ComputeWordsVector {
	
	/**计算文档的TF-IDF属性向量,返回Map<文件名,Map<特征词,TF-IDF值>>
	 * @param testSampleDir 处理好的聚类样本测试样例集合
	 * @return Map<String,Map<String,Double>> 所有测试样例的属性向量构成的map
	 * @throws IOException 
	 */
	public Map<String,Map<String,Doubl
 
                   
                   
                   
                   该博客介绍了如何使用Java实现K-means、MBSAS和DBSCAN算法对newsgroup18828文本数据集进行预处理和聚类。文章详细讨论了文本预处理步骤、K-means算法的关键点,并展示了K-means算法在6070词特征降维情况下的熵值评估结果。
该博客介绍了如何使用Java实现K-means、MBSAS和DBSCAN算法对newsgroup18828文本数据集进行预处理和聚类。文章详细讨论了文本预处理步骤、K-means算法的关键点,并展示了K-means算法在6070词特征降维情况下的熵值评估结果。
           最低0.47元/天 解锁文章
最低0.47元/天 解锁文章
                           
                       
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   1300
					1300
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            