클로이의 데이터 여행기

[JAVA] 키워드 카운트(keyword count) 본문

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)를 이용하여 전처리 한뒤 키워드를 카운팅하 내용도 다루어 보겠습니다. 


감사합니다.

Comments