2016-09-07 2 views
-1

5 개의 파일 텍스트가 있습니다. 이 파일들을 1 개의 파일에 병합합니다. 그 파일에는 약 60 문장이 들어 있습니다. 해당 파일을 5 클러스터로 클러스터링하려고합니다. 클러스터링에 weka를 사용하고 있습니다. 자바에서 weka lib를 사용하여 많은 문장을 클러스터링합니다.

public static void doClustering(String pathSentences, int numberCluster) throws IOException { 

    Helper.deleteAllFileInFolder("results"); 

    //so cum bang so cau trong file/so cau trung binh trong 1 file 
    HashMap<Integer, String> sentences = new HashMap<>(); 
    HashMap<Integer, Integer> clustering = new HashMap<>(); 
    try { 
     StringToWordVector filter = new StringToWordVector(); 
     SimpleKMeans kmeans = new SimpleKMeans(); 
     FastVector atts = new FastVector(5); 
     atts.addElement(new Attribute("text", (FastVector) null)); 
     Instances docs = new Instances("text_files", atts, 0); 
     Scanner sc = new Scanner(new File(pathSentences)); 
     int count = 0; 
     while (sc.hasNextLine()) { 
      String content = sc.nextLine(); 
      double[] newInst = new double[1]; 
      newInst[0] = (double) docs.attribute(0).addStringValue(content); 
      docs.add(new SparseInstance(1.0, newInst)); 
      sentences.put(sentences.size(), content); 
      clustering.put(clustering.size(), -1); 
     } 
     NGramTokenizer tokenizer = new NGramTokenizer(); 
     tokenizer.setNGramMinSize(10); 
     tokenizer.setNGramMaxSize(10); 
     tokenizer.setDelimiters("\\W"); 
     filter.setTokenizer(tokenizer); 
     filter.setInputFormat(docs); 
     filter.setLowerCaseTokens(true); 
     filter.setWordsToKeep(1); 
     Instances filteredData = Filter.useFilter(docs, filter); 
     kmeans.setPreserveInstancesOrder(true); 
     kmeans.setNumClusters(numberCluster); 
     kmeans.buildClusterer(filteredData); 
     int[] assignments = kmeans.getAssignments(); 

     int i = 0; 
     for (int clusterNum : assignments) { 
      clustering.put(i, clusterNum); 
      i++; 
     } 
     PrintWriter[] pw = new PrintWriter[numberCluster]; 
     for (int j = 0; j < numberCluster; j++) { 
      pw[j] = new PrintWriter(new File("results/result" + j + ".txt")); 
     } 
     sentences.entrySet().stream().forEach((entry) -> { 
      Integer key = entry.getKey(); 
      String value = entry.getValue(); 
      Integer cluster = clustering.get(key); 
      pw[cluster].println(value); 
     }); 
     for (int j = 0; j < numberCluster; j++) { 
      pw[j].close(); 
     } 
    } catch (Exception e) { 
     System.out.println("Error K means " + e); 
    } 
} 

I는 입력 파일의 순서를 변경

클러스터링 결과는 다양하다. 해결하도록 도와 줄 수 있습니까? 정말 감사합니다.

+0

왜 10 그램을 사용하고 있습니까? 나는 이것이 클러스터링을 더욱 어렵게 만들 것이라고 생각합니다. – xro7

답변

1

k-means는 임의 알고리즘입니다.

일부 인스턴스를 초기 시드로 선택한 다음 로컬 최적 조건을 검색합니다.

물론 다른 결과가 나옵니다.

많이 다른 경우 이는 제대로 작동하지 않았 음을 나타냅니다. 데이터가 k-means에 적합하다면, 대부분의 실행은 매우 유사한 결과를 산출합니다 (레이블의 순열 제외).

관련 문제