요약 ¶
- 가장 느리고 무식한 Linear Search로도 문제해결 했다를 보여주는 의지의 한국인 코드
- 프로그램을 재실행하면 또 오래 기다려야 해서 파일 입출력을 적극 활용
- 고로 이 프로그램을 복붙해서 그냥 실행하면 돌아가지 않습니다
- 이 프로그램은 Bayes Classifier 값을 구하는것 까지이고, 시간 관계상 값의 참/거짓 빈도는 엑셀을 이용해서 계산했습니다.
확률값 분석 ¶
- 다른 분들과 달리, 저는 한 글자인 문자와 특수문자를 첫 글자로 포함하는 단어들은 Train Data 및 Test Data 분석에 포함시키지 않았습니다.
- 때문에, 경제 면에서는 200개의 기사 중 148개의 분류를 성공하는 저조한 성적을 보였습니다.
- 반면, 정치 면에서는 200개의 기사 중 188개의 분류를 성공하여, 94%의 정확도를 보였습니다.
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(); } }