개발/Node js

[Node js]웹 크롤러 만들기3(번외)-데이터 시각화(워드 클라우드) D3 Cloud

재근이 2021. 10. 11. 20:23
반응형

크롤링한 데이터 시각화한 최종 결과

👓크롤링한 데이터 시각화

이번 글은 크롤링 기능 자체랑은 연관이 없지만 하면 좋은 데이터 시각화 만들기이다.

크롤링해서 얻은 데이터도 좋지만, 이를 시각화하는 게 사용자에게 내용을 전달하고자 할 때 효과가 좋다.

시각화를 위해서 d3-cloud 라이브러리를 사용할 것이다.

시각화 라이브러리 d3-cloud : https://github.com/jasondavies/d3-cloud

 

🛠데이터 가공(포맷 수정)

d3-cloud 라이브러리에 데이터를 넣기 위해 csv 형식으로 데이터를 가공해줄 것이다.

이전 글에서는 최종 데이터를 Object형식의 문자열로 저장했다. 이 데이터들을 csv형식에 맞게 바꿔주자.

const fs = require('fs');
const path = require('path');

changeFormat();

function changeFormat() {
    const data = readData("word_result");

    //정렬 하기 위해 object 형식을 array로 변환
    let sortable = [];
    for (let name in data) {
        sortable.push([name, data[name]]);
    }

    //횟수가 많은 순으로 정렬
    sortable.sort((a, b) => b[1] - a[1]);

    //순위가 300위 이상은 제거
    sortable = sortable.filter((value, index) => {
        return index > 300 ? false : true;
    });

    //csv 포맷으로 저장
    let writeStream = fs.createWriteStream('./output.csv');
    writeStream.on('open', () => {
        const header = "text,frequency\n";
        writeStream.write(header);
        sortable.forEach(value=>{
            const str = value[0] + "," + value[1] + '\n';
            writeStream.write(str);
        });
        writeStream.end();
    });
}

function readData(fileName) {
    const readFileName = path.join(__dirname, fileName);
    const readData = fs.readFileSync(readFileName);
    return JSON.parse(readData.toString());
}
너무 많은 데이터시각화 방해가 되기에 순위낮은 데이터제거 하자.

너무 많은 데이터로 인해 실패한 시각화

 

📝시각화 (d3-cloud) 코드 작성 - HTML

d3-cloud 라이브러리의 예제 코드참조 해서 작성했다. 원하는 시각화에 맞게 색상, 크기 등을 수정해서 사용하면 된다.

작성한 코드는 HTML 확장자로 저장한다. HTML과 앞에서 가공한 데이터 파일은 같은 경로에 놓는다.(혹은 코드에서 경로 수정)

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <script src="https://d3js.org/d3.v3.min.js"></script>
    <script src="https://rawgit.com/jasondavies/d3-cloud/master/build/d3.layout.cloud.js" type="text/JavaScript"></script>
</head>
<body>
    <script>
        const width = 1000;
        const height = 700;
                
        d3.csv("output.csv", data => show(data));

        function show(data) {
            d3.layout
                .cloud()
                .size([width, height])
                .words(data)
                .rotate(function (d) { return Math.random() * 360; })
                .fontSize((d) => d.frequency/500)
                .on("end", draw)
                .start();
        }

        function draw(words) { 
            d3.select("body")
                .append("svg")
                    .attr("width", width)
                    .attr("height", height)
                .append("g")
                    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")
                .selectAll("text")
                    .data(words)
                .enter().append("text")
                    .style("fill", function (d) {
                        if (parseInt(d.frequency) > parseInt(50000)) return "#dd3333";
                        else if (parseInt(d.frequency) > parseInt(40000)) return "#8224e3";
                        else if (parseInt(d.frequency) > parseInt(30000)) return "#81d742";
                        else if (parseInt(d.frequency) > parseInt(20000)) return "#00c280";
                        else if (parseInt(d.frequency) > parseInt(12000)) return "#1e73be";
                        else if (parseInt(d.frequency) > parseInt(8000)) return "#dd9933";
                        else if (parseInt(d.frequency) > parseInt(3000)) return "#626208";
                        else "#025275";
                    })
                    .style("font-family", "Impact")
                    .attr("text-anchor", "middle")
                    .style("font-size", (d) => d.size + "px")
                    .attr("transform", (d) => "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")")
                    .text((d) => d.text)
        }
        </script>
</body>
</html>

 

🏃🏻실행

작성한 HTML더블클릭해서 실행하면 CORS policy 때문에 오류가 날 수 있다.

웹 페이지 서버를 올려서 까지 확인하는 건 번거로우니 VSCode확장 프로그램인 Live Server를 사용하자.

Live Server를 설치하고 작성한 HTML 파일을 오른쪽 클릭 후 Open with Live Server를 선택한다.

 

🌈결과

실행하게 되면 아래와 같이 Word Cloud 형태의 시각화 자료를 볼 수 있다.
* 상위 순위의 의미 없는 데이터(ex: a, the, of, 숫자(1, 2, 20) etc...)는 수동으로 제거 했다.

반응형