클로이의 데이터 여행기

[JAVA] AR(연관성분석) 알고리즘 본문

JAVA

[JAVA] AR(연관성분석) 알고리즘

징느K 2018. 12. 21. 13:12

오늘 포스팅 내용은 'AR(연관분석) 알고리즘'입니다.

공개된 소스를 사용하려고 했으나 결국 동료 연구원님의 도움을 받아 소스를 작성하게 되었습니다.

이 소스를 활용해서 구직자들의 경력기업리스트를 활용하여 연관기업명을 추출하였습니다. 
동종 업종으로의 이직이 많을 것이라는 가정에서 시작하였습니다.

아래의 소스는 포스팅용으로 간단히 수정한 내용입니다.


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
package test;
 
import java.util.ArrayList;
import java.util.HashMap;
 
public class TestArAlgoti {
 
    public static void main(String[] args) {
        // 구매 아이템리스트
        ArrayList<String> lineArrList = new ArrayList<String>();
        // 하나의 아이템이 전체에서 나온 개수 축적하는 Map
        HashMap<String, Integer> uniqCntMap = new HashMap<String, Integer>();
        // 기준 아이템과 같이 나온 대상 아이템의 개수 축적하는 Map
        HashMap<String, HashMap<String, Integer>> pareCntMap = new HashMap<String, HashMap<String, Integer>>();
 
        // 임시로 넣은 데이터
        lineArrList.add("기저귀,맥주,껌,사과");
        lineArrList.add("기저귀,사과,참치캔,김치,맥주");
        lineArrList.add("맥주,오징어");
        lineArrList.add("과자,맥주,땅콩,사과,버섯");
        lineArrList.add("약과,사과,감,정종,북어포,도라지,시금치,고사리");
        lineArrList.add("맥주");
        lineArrList.add("맥주,땅콩");
 
        String stdItem = "";
        String targetItem = "";
        int cnt = 0;
        int uniCnt = 0;
 
        for (int i = 0; i < lineArrList.size(); i++) {
            // line 하나를 가져와 , 구분자로 split 해서 items 배열에 넣는다.
            String[] items = lineArrList.get(i).split(",");
            // item 개수만큼 for문을 돌린다.
            for (int n = 0; n < items.length; n++) {
                // items가 순서대로 stdItem이 되고
                stdItem = items[n];
 
                // 아이템별 등장 횟수 카운팅하여 uniqCntMap에 (키워드,카운트)형태로 담는다.
                if (uniqCntMap.containsKey(stdItem))
                    uniCnt = uniqCntMap.get(stdItem) + 1;
                else
                    uniCnt = 1;
 
                uniqCntMap.put(stdItem, uniCnt);
        
 
                // pareCntMap에 기준아이템이 있으면
                HashMap<String, Integer> targetCntMap = new HashMap<String, Integer>();
                if (pareCntMap.containsKey(stdItem)) {
                    // 있으면 있는 Map을 가져오고
                    targetCntMap = pareCntMap.get(stdItem);
                } else {
                    // 없으면 새로 Map생성한다.
                    targetCntMap = new HashMap<String, Integer>();
                }
 
                for (int m = 0; m < items.length; m++) {
                    // items가 순서대로 대상 아이템이 된다.
                    targetItem = items[m];
 
                    // 기준 아이템과 대상 아이템이 같으면
                    // 해당 targetItem 에 대한 count 작업은 건너 뛴다.
                    if (stdItem.equals(targetItem))
                        continue;
 
                    // 가져온  targetCntMap에 targetItem이 있으면
                    if (targetCntMap.containsKey(targetItem))
                        cnt = targetCntMap.get(targetItem) + 1;
                    else
                        cnt = 1;
 
                    // targetCntMap에 cnt를 업데이트 해준다.
                    targetCntMap.put(targetItem, cnt);
                }
                // 큰 맵(pareCntMap)에 다시 넣어둔다.
                pareCntMap.put(stdItem, targetCntMap);
            }
        }
        for (String item : uniqCntMap.keySet())
            System.out.println(item + " => " + uniqCntMap.get(item));
        System.out.println("=====================================");
        System.out.println("[아이템 쌍 별 개수]");
        for (String std : pareCntMap.keySet()) {
            HashMap<String, Integer> tarCntMap = pareCntMap.get(std);
            for (String tar : tarCntMap.keySet()) {
                int count = tarCntMap.get(tar);
                System.out.println("[" + std + "->" + tar + "] = " + count);
            }
        }
    }
}
 
cs


이상입니다.

감사합니다.




Comments