DL4J의 Word2Vec을 활용하여 여러가지 실험을 해보고 있습니다.


DL4J 내부적으로 다차원 vector로 처리된 파일을 사람이 인지할 수 있도록 2차원으로 차원을 축소하여 csv 파일로 변환하는 tsne library를 제공하고 있습니다.


해당 tsne로 처리된 csv파일을 이미지화 하기 위해서 DL4J 내부적으로 UIServer를 제공합니다만, 아무리 노력해도 해당서버는 장황한 에러메시지를 뱉아내며 실행이 되지 않습니다.


UIServer의 문제를 해결해볼까 하다가, 그림 그리기가 그리 복잡하지 않은 듯 하여 D3.js를 활용하여, csv 파일 시각화하는 코드를 작성해 보았습니다.


아래는 어느 무협지를 학습시켜서, tsne로 2차원 csv 파일 추출후, 시각화한 화면입니다.




이해할 수 없는 부분이 더 많기는 합니다만, 중간중간 의미적으로 유사성이 높은 단어가 뭉쳐져 있는 모습을 확인 할 수 있습니다.


저같은 시각화로 인한 고민을 하시는 분들이 어딘가엔 계실듯 하여 대충 만들어진 html 파일을 공유합니다. 

csv파일 로딩 때문에 톰켓이나 was에 올려야 동작하며, 적절히 수정해서 쓰시면 될 듯 합니다.

파일처리를 위하여 csv 상단에 아래의 header가 추가되어야 합니다.

 ax,ay,word

1601.4119873046875,2464.052734375,검법 

-5537.662109375,1058.436767578125,독물 

-1954.671142578125,-3149.0380859375,탄로 

57.20676040649414,494.7344970703125,부축 

0.006148473359644413,-0.020917901769280434,시인 

0.001806588377803564,0.13746240735054016,겸허 

-0.039052389562129974,-0.013289138674736023,동료 


....



html 파일


 <html>

<head>

<title>D3 Axis Example</title>

<script src="http://d3js.org/d3.v2.js"></script>

<style type="text/css">

.axis path,

.axis line {

fill: none;

stroke: black;

shape-rendering: crispEdges;

}

.axis text {

font-family: sans-serif;

font-size: 9px;

}


</style>

    </head>

    

    <body>

    

    <script>

        var width = 1000,   // width of svg

            height = 1000,  // height of svg

            padding = 40; // space around the chart, not including labels

       

        var x_domain = [-500, 500],

        y_domain = [-500, 500];

            

        // display date format

        var  date_format = d3.time.format("%d %b");

        

        // create an svg container

        var vis = d3.select("body").

            append("svg:svg")

                .attr("width", width + padding * 2)

                .attr("height", height + padding * 2);

                

        // define the y scale  (vertical)

        var yScale = d3.scale.linear()

        .domain(y_domain) // make axis end in round number

.range([height - padding, padding]);   

            

        var xScale = d3.scale.linear()

        .domain(x_domain)    // values between for month of january

    .range([padding, width - padding]);   

        // define the y axis

        var yAxis = d3.svg.axis()

            .orient("left")

            .scale(yScale);

        

        // define the x axis

        var xAxis = d3.svg.axis()

            .orient("bottom")

            .scale(xScale);

            //.tickFormat(date_format);

            

        // draw y axis with labels and move in from the size by the amount of padding

        vis.append("g")

        .attr("class", "axis")

            .attr("transform", "translate("+ (width/2 ) +",0)")

            .call(yAxis);


        // draw x axis with labels and move to the bottom of the chart area

        vis.append("g")

            .attr("class", "xaxis axis")  // two classes, one for css formatting, one for selection below

            .attr("transform", "translate(0," + (height/2) + ")")

            .call(xAxis);

            

          vis.selectAll(".xaxis text")  // select all the text elements for the xaxis

          .attr("transform", function(d) {

             return "translate(" + this.getBBox().height*-2 + "," + this.getBBox().height + ")rotate(-45)";

         });

    

        vis.append("text")

            .attr("text-anchor", "middle")  // this makes it easy to centre the text as the transform is applied to the anchor

            .attr("transform", "translate("+ (padding/2) +","+(height/2)+")rotate(-90)")  // text is drawn off the screen top left, move down and out and rotate

            .text("Y-axis");


        vis.append("text")

            .attr("text-anchor", "middle")  // this makes it easy to centre the text as the transform is applied to the anchor

            .attr("transform", "translate("+ (width/2) +","+(height-(padding/3))+")")  // centre below axis

            .text("X-axis");

        

        var maxX = 10, 

        maxY = 10;

        var dirX = 1, 

        dirY = 1 ;

        

        // check max value

        d3.csv("visual7.csv", function(data){

        data.forEach(function(d){

        //console.log(d.ax + ' --- ' + maxX + ' === ' + (d.ax > maxX));

        if(Math.abs(d.ax) > maxX) maxX = Math.abs(d.ax);

        if(Math.abs(d.ay) > maxY) maxY = Math.abs(d.ay);

        });

        console.log('max X:Y = ' + maxX + ':' + maxY);

        // draw text

        drawText(vis) ;

        });

               

        function drawText(pannel) {

        d3.csv("visual7.csv", function(data){

            data.forEach(function(d){

              console.log('Word -> ' + d.ax + ',' + d.ay + ':' + d.word);

                        

              pannel.append("text")

          .style("font-size", "10px")

          .attr("x", ((d.ax/maxX) * (width/2) + width/2))

          .attr("y", (height/2 - (d.ay/maxY) * (height/2)))

          .attr("dy", '-10')

          .text(d.word)

          

            });

          });

        }

    </script>

    

    </body>

</html>


다차원을 2차원으로 축소하는 개념이라 왜곡이나 이해 못 할 부분들이 많은 것 같습니다.

t-sne 의 여러 옵션에 대한 이해가 있어야 아름다운 그림이 나올 듯 하네요. 


옵션에 대한 대략적인 이해는 아래 링크를 참조하면 될 듯 하네요.. (결국엔 이것저것 넣어보고 돌려보는게 답일 듯.. -_-)


http://docs.flowjo.com/v9/flowjo-v9-documentation-home/platforms/t-sne/


'Expired > Web Art' 카테고리의 다른 글

Java 물리 시뮬레이션 툴  (0) 2008.11.03
Tree Viewer  (0) 2008.11.02



얼마전 Sun Tech Day에 갔을때, 최근 자바의 화두중 하나가 JavaFX였다.

JavaFX를 위해 특별히 고안된 스크립트 언어로, 잘 사용하기 위해서는 비교적 고급의 객체지향 개념을 알아야 하는 Java Swing이나 Graphics2D를 함수형 컨셉으로 수백라인 나와야 가능한 구현을 불과 몇줄 만에 하는 것을 보고,
괜찮은 툴, 프레임웍이 아닌가 하는 생각도 들었다.

하지만 JavaFX보다 앞서 함수형 스크립트 언어로 자바2D 뿐만아니라 3D까지 강력한 물리엔진 Framework이 있었으니,
그것의 이름은 Processing이다.

http://processing.org

위의 사이트에가면 정확한 내용을 참조할 수 있으며, JavaFX보다 섬세하고 정교한 물리표현이 가능한 것이 특징이다. 자주사용되는 물리법칙에 대해서 플러그인을 만들어, 직접 사용자 정의 물리함수를 생성할 수 도 있다.

JavaFX와 마찬가지로 Processing도 최종배포는 Applet으로도 가능하여, 쉽게 웹사이트에 포스팅이 가능하며, 자체 IDE를 제공하지만, 약간의 작업으로 이클립스에서도 개발이 가능하다는 것도 큰 장점이다.

위의 예제는 3D를 이용하여 50줄 정도의 코드로 복잡한 영상이 구동되고 있는 모습을 보여주고 있다.

오픈소스 툴이 아니라 코드레벨에서의 디버깅이 약간 어렵기는 하지만,
단시간에 특정 java application에 적절한 show가 필요하다면(^^), 괜찮은 툴이 아닐까 생각된다.

'Expired > Web Art' 카테고리의 다른 글

d3.js를 활용한 t-sne 데이터 시각화  (0) 2017.07.21
Tree Viewer  (0) 2008.11.02

To view this content, you need to install Java from java.com

SpaceBar 버튼을 누르면 노드가 하나씩 추가됨..
프린스턴 대학에서 제공하는 traer라는 확장 라이브러리를 이용하여 Spring 형태의 물리적인 움직임을 처리..

'Expired > Web Art' 카테고리의 다른 글

d3.js를 활용한 t-sne 데이터 시각화  (0) 2017.07.21
Java 물리 시뮬레이션 툴  (0) 2008.11.03

+ Recent posts