JAVA
[JAVA] 키워드 카운트(keyword count)
징느K
2019. 2. 14. 12:55
이번 포스팅에는 '키워드를 카운트 하는 코드'를 다뤄보려합니다.
코드 목적은 '대량의 문장을 읽어와서, 어떤 단어들이 자주 쓰였는지 카운트 하는 것' 입니다.
코드는 메소드 3개로 구성되어 있으며 내용은 메소드별 설명은 아래와 같습니다.
① getData()
- 메소드 기능 : 문장을 공백 단위로 끊어 rawList에 담음.
- 상세내용 : 대체/제거하고 싶은 특수문자 처리한 뒤, 문장을 공백으로 spilt하여 rawList로 담음.
② getCoreComp()
- 메소드 기능 : 핵심역량 키워드의 카운트
- 상세내용 : rawList에 중복으로 담겨있는 키워드를 뽑아와서 coreCntMap<키워드,카운트>로 담음.
이 때, coreCntMap에 이미 담겨있으면 카운트(value)에 1을 더함.
③ writeFile()
- 메소드 기능 : 파일을 작성하는 메소드
- 상세내용 : <키워드,카운트>가 담긴 맵을 파일로 작성하되, 카운트가 100이 초과되는 경우만 작성.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | package highFrequency; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; public class GetHighFrequency { static String[] coreComp; static ArrayList<String> rawList = new ArrayList<String>(); static HashMap<String, Integer> coreCntMap = new HashMap<String, Integer>(); static String NEWLINE = System.getProperty("line.separator"); // 문장을 공백 단위로 끊어 rawList에 담는 메소드 public static void getData() { File file = new File("C:/data/input/501524.txt"); String line = ""; String tempCore = ""; try { BufferedReader inFiles = new BufferedReader( new InputStreamReader(new FileInputStream(file.getAbsolutePath()), "UTF8")); while ((line = inFiles.readLine()) != null) { // 전처리 ① : 필드명 제거 tempCore = line.replace("core_competence:", ""); // 전처리 ② : 핵심역량에서 특수문자를 제거('replace'활용)한 뒤, // 라인단위("|*|")로 split하여 키워드를 coreComp에 담음 coreComp = tempCore.replace("|*|", " "). replace(".", ""). replace("!", ""). replace(",", " "). replace("(", " "). replace(")", " "). replace("[", " "). replace("]", " "). replace("/", " "). replace("합니다", " ").split(" "); for (int k = 0; k < coreComp.length; k++) { if (coreComp[k].length() != 0) rawList.add(coreComp[k]); } } inFiles.close(); } catch (Exception e) { e.printStackTrace(); } } // 핵심역량 키워드의 카운트를 하는 메소드 public static void getCoreComp() { int cnt = 1; for (int k = 0; k < rawList.size(); k++) { if (coreCntMap.containsKey(rawList.get(k))) { cnt = coreCntMap.get(rawList.get(k)) + 1; } else { cnt = 1; } coreCntMap.put(rawList.get(k), cnt); } } // 파일 작성하는 메소드 public static void writeFile() { String filename = "C:/data/output/coreComp_cnt_result.txt"; try { File output = new File(filename); BufferedWriter writer = new BufferedWriter(new FileWriter(output)); if (output.isFile() && output.canWrite()) { for (String key : coreCntMap.keySet()) { if (coreCntMap.get(key) > 20) { StringBuilder sb = new StringBuilder(); sb.append(key); sb.append(","); sb.append(coreCntMap.get(key)); sb.append(NEWLINE); //System.out.println("sb : " + sb); String resultString = sb.toString(); writer.write(resultString); } } } writer.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { System.out.println("==============데이터 가져오기 시작=============="); getData(); System.out.println("===============키워드 카운트 시작==============="); getCoreComp(); System.out.println("================파일 작성 시작================"); writeFile(); System.out.println("====================끝===================="); } } | cs |
이상입니다.
보시는 것처럼 단어는 띄어쓰기를 기준으로 구분하여 조사, 어미가 깔끔히 제거되지는 못했습니다.
이점 참고 부탁드리며, 추후에 형태소분석기(아마도 twitter)를 이용하여 전처리 한뒤 키워드를 카운팅하 내용도 다루어 보겠습니다.
감사합니다.