Kmeans算法的JAVA实现 下载本文

内容发布更新时间 : 2024/10/23 7:36:02星期一 下面是文章的全部内容请认真阅读。

[原]数据挖掘-基于Kmeans算法、MBSAS算法及DBSCAN算法的newsgroup18828文本聚类器的JAVA实现(上)

2012-4-18阅读10359 评论26

(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文档集预处理类 * @author yangliu * @qq 772330184 * @mail yang.liu@pku.edu.cn */ 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(\ } } return; String subStrDir = strDir.substring(strDir.lastIndexOf('/')); String dirTarget = strDir + File fileTarget = new File(dirTarget); if(!fileTarget.exists()){//注意processedSample需要先建立目录建 } File[] srcFiles = fileDir.listFiles(); String[] stemFileNames = new String[srcFiles.length]; for(int i = 0; i < srcFiles.length; i++){ } //下面调用stem算法 if(stemFileNames.length > 0 && stemFileNames[0] != null){ } Stemmer.porterMain(stemFileNames); String fileFullName = srcFiles[i].getCanonicalPath(); String fileShortName = srcFiles[i].getName(); if(!new File(fileFullName).isDirectory()){//确认子文 } else { } fileFullName = doProcess(fileFullName); System.out.println(\StringBuilder stringBuilder = new stringBuilder.append(dirTarget + \createProcessFile(fileFullName, stemFileNames[i] = stringBuilder.toString(); fileTarget.mkdir(); \出来,否则会报错,因为母目录不存在 件名不是目录如果是可以再次递归调用 preprocess:\StringBuilder(); fileShortName); stringBuilder.toString()); fileFullName.replace(\/**进行文本预处理生成目标文件 * @param srcDir 源文件文件目录的绝对路径 * @param targetDir 生成的目标文件的绝对路径 * @throws IOException */ private static void createProcessFile(String srcDir, String targetDir) } /**对每行字符串进行处理,主要是词法分析、去停用词和stemming * @param line 待处理的一行字符串 * @param ArrayList 停用词数组 * @return String 处理好的一行字符串,是由处理好的单词重新生成,以空格为分隔符 // TODO Auto-generated method stub FileReader srcFileReader = new FileReader(srcDir); FileReader stopWordsReader = new FileWriter targetFileWriter = new FileWriter(targetDir); BufferedReader srcFileBR = new BufferedReader stopWordsBR = new String line, resLine, stopWordsLine; //用stopWordsBR够着停用词的ArrayList容器 ArrayList stopWordsArray = new ArrayList(); while((stopWordsLine = stopWordsBR.readLine()) != null){ } while((line = srcFileBR.readLine()) != null){ } targetFileWriter.flush(); targetFileWriter.close(); srcFileReader.close(); stopWordsReader.close(); srcFileBR.close(); stopWordsBR.close(); resLine = lineProcess(line,stopWordsArray); if(!resLine.isEmpty()){ } //按行写,一行写一个单词 String[] tempStr = resLine.split(\for(int i = 0; i < tempStr.length; i++){ } } if(!tempStr[i].isEmpty()){ if(!stopWordsLine.isEmpty()){ } stopWordsArray.add(stopWordsLine); throws IOException { FileReader(\BufferedReader(srcFileReader);//装饰模式 BufferedReader(stopWordsReader); targetFileWriter.append(tempStr[i]+\