U E D R , A S I H C RSS

데블스캠프2011/둘째날/Machine-Learning/Naive Bayes Classifier/송지원

요약

  • 가장 느리고 무식한 Linear Search로도 문제해결 했다를 보여주는 의지의 한국인 코드
  • 프로그램을 재실행하면 또 오래 기다려야 해서 파일 입출력을 적극 활용
  • 고로 이 프로그램을 복붙해서 그냥 실행하면 돌아가지 않습니다
  • 이 프로그램은 Bayes Classifier 값을 구하는것 까지이고, 시간 관계상 값의 참/거짓 빈도는 엑셀을 이용해서 계산했습니다.

확률값 분석

  • 다른 분들과 달리, 저는 한 글자인 문자와 특수문자를 첫 글자로 포함하는 단어들은 Train Data 및 Test Data 분석에 포함시키지 않았습니다.
  • 때문에, 경제 면에서는 200개의 기사 중 148개의 분류를 성공하는 저조한 성적을 보였습니다.
  • 반면, 정치 면에서는 200개의 기사 중 188개의 분류를 성공하여, 94%의 정확도를 보였습니다.


Source Code

  • 여러분의 정신 건강을 위해.. 이 코드를 분석하는 것을 권장하지는 않습니다;ㅁ;

Train File Analysis

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class FileAnalasys {
	String filename;
	List<String> articles;
	public List<String> data;
	public List<Integer> frequency;
	
	FileAnalasys(String f){
		filename = f;
		articles = new ArrayList<String>();
		data = new ArrayList<String>();
		frequency = new ArrayList<Integer>();
	}
	
	public void moveFileToData(){
		try{
			FileReader fr = new FileReader(filename);
			BufferedReader br = new BufferedReader(fr);
			String line;
			String str;
			
			line = br.readLine();
			while(line != null){
				articles.add(line);
				StringTokenizer st = new StringTokenizer(line, " ");
				while(st.hasMoreTokens()){
					str = st.nextToken();
					if(str.length() > 1 && str.charAt(0) != '.' && str.charAt(0) != ','&& str.charAt(0) != '!'&& str.charAt(0) != '"' && str.charAt(0) != ':' && str.charAt(0) != '-' && str.charAt(0) != ';'){
						boolean addFlag = true;
						for(int i=0; i<data.size(); i++){
							if(str.equals(data.get(i))){
								frequency.set(i, frequency.get(i)+1);
								addFlag = false;
								break;
							}							
						}
						if(addFlag){
							data.add(str);
							frequency.add(1);
						}
					}
				}
				line = br.readLine();				
			}
			this.printDataToFile();
			fr.close();
		} catch(IOException e){
			e.printStackTrace();
		}
	}	
	
	private void printDataToFile(){
		try {
			String fname = "D:/analysis.txt";
			FileWriter fw = new FileWriter(fname);
			String str = null;
			for(int i=0; i < data.size(); i++){
				str = data.get(i) + "\t" + frequency.get(i) + "\n";
				fw.write(str);
			}
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void loadAnalysisFile(){
		try{
			FileReader fr = new FileReader(filename);
			BufferedReader br = new BufferedReader(fr);
			String line;
			
			line = br.readLine();
			while(line != null){
				StringTokenizer st = new StringTokenizer(line, "\t");
				data.add(st.nextToken());
				frequency.add(Integer.parseInt(st.nextToken()));
				line = br.readLine();				
			}
		} catch(IOException e){
			e.printStackTrace();
		}
	}
	
	public void printArticle(){
		for(int i=0; i<articles.size(); i++){
			System.out.println(articles.get(i));
			System.out.print("\n\n");
		}
	}
	
	public void printData(){
		for(int i=0; i<data.size(); i++){
			System.out.print(data.get(i));
			System.out.println(" " + frequency.get(i));
		}
		System.out.println("Data size : "+data.size());
		System.out.println("Frequency size : "+frequency.size());
	}
	
	public int getArticleLength(){ return articles.size(); }
		
	
}

test File Analysis

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;


public class testFileCal {
	String filename;
	List<Double> bayes;
	
	
	testFileCal(String f){
		filename = f;
		bayes = new ArrayList<Double>();
	}
	
	
	public void testArticleRead(List<String> data, List<Integer> frequency, List<String> data2, List<Integer> frequency2){
		try{
			FileReader fr = new FileReader(filename);			
			BufferedReader br = new BufferedReader(fr);
			String line;
			String str;
			
			line = br.readLine();			
			while(line != null){
				StringTokenizer st = new StringTokenizer(line, " ");
				ArrayList<String> articleWords = new ArrayList<String>();
				while(st.hasMoreTokens()){
					str = st.nextToken();
					if(str.length() > 1 && str.charAt(0) != '.' && str.charAt(0) != ','&& str.charAt(0) != '!'&& str.charAt(0) != '"' && str.charAt(0) != ':' && str.charAt(0) != '-' && str.charAt(0) != ';'){
						boolean addFlag = true;
						for(int j=0; j<articleWords.size(); j++){
							if(str.equals(articleWords.get(j))){
								addFlag = false;
								break;
							}							
						}
						if(addFlag)	articleWords.add(str);
					}				
				}				
				for(int i=0; i<articleWords.size(); i++) System.out.println(articleWords.get(i));
				
				double bayesNumber = 0;				
				for(int j=0; j<articleWords.size(); j++){
					int eNum = 0;
					int pNum = 0;
					for(int k=0; k<data.size(); k++){
						if(articleWords.get(j).equals(data.get(k))) eNum = frequency.get(k);
					}
					for(int k=0; k<data2.size(); k++){
						if(articleWords.get(j).equals(data2.get(k))) pNum = frequency2.get(k);
					}
					if (eNum == 0 || pNum == 0){ eNum++; pNum++; }
					bayesNumber += Math.log((double)eNum / (double)pNum);
					System.out.println(bayesNumber);
				}				
				bayes.add(bayesNumber);
				line = br.readLine();
			}		
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void printBayes(){
		System.out.println("bayes size : "+bayes.size());
		try {
			String fname = "D:/bayesResult.txt";
			FileWriter fw = new FileWriter(fname);
			String str = null;
			for(int i=0; i < bayes.size(); i++){
				str = bayes.get(i) + "\n";
				System.out.println(str);
				fw.write(str);
			}
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String [] args){
		FileAnalasys ec = new FileAnalasys("D:/economy_analysis.txt");
		FileAnalasys po = new FileAnalasys("D:/politics_analysis.txt");
		ec.loadAnalysisFile();
		po.loadAnalysisFile();
		
		//testFileCal testE = new testFileCal("D:/economy.txt");
		testFileCal testP = new testFileCal("D:/politics.txt");
		
		//testE.testArticleRead(ec.data, ec.frequency, po.data, po.frequency);
		testP.testArticleRead(po.data, po.frequency, ec.data, ec.frequency);
		
		testP.printBayes();
		
		
	}

}

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:29:13
Processing time 0.0178 sec