<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5074348724364984885</id><updated>2012-02-16T18:49:12.019+09:00</updated><category term='검색 엔진'/><category term='넋두리'/><category term='Image Processing'/><category term='창업 멤버'/><category term='소모적인 setting'/><category term='Machine learning'/><category term='opinion mining'/><category term='textual affect sensing'/><category term='Information Retrival'/><category term='social network'/><category term='IT'/><title type='text'>Channel of Chaos</title><subtitle type='html'>opinion mining, social network, infomation retrivar, blog, web mining, vision등에 관심</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-2994558073675502509</id><published>2010-11-04T21:53:00.001+09:00</published><updated>2010-11-04T21:55:04.201+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><category scheme='http://www.blogger.com/atom/ns#' term='창업 멤버'/><title type='text'>같이 창업하실 창업 멤버 모십니다.</title><content type='html'>&lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;안녕하세요&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;창업을 생각하고 있는&lt;span lang="ko"&gt; 30&lt;/span&gt;대 초반의 청년입니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span lang="ko" style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;현재 몇 가지 아이디어를 가지고 창업을 생각하고 있습니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;그 몇가지 아이디어들 중 가장 관심있는 것을 가지고 프로토 타입 구현에 매진하다가&lt;span lang="ko"&gt;, &lt;/span&gt;같이 창업할 끈끈한 메이트를 구하고 싶어 글을 씁니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;많은 관심 가져주시길 부탁드리겠습니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span lang="ko" style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;저는 전자과를 졸업하고&lt;span lang="ko"&gt;,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;요즘 통섭이라고 하는 분야에서 석사학위를 받았습니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span lang="ko" style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;간단한 하드웨어 작업&lt;span lang="ko"&gt;, &lt;/span&gt;임베디드 작업은 할 줄 알지만&lt;span lang="ko"&gt;,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;전공은 소트프웨어 공학쪽에 가깝습니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span lang="ko" style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;제가 부족한 부분은 디자인 분야&lt;span lang="ko"&gt;, &lt;/span&gt;기획 분야&lt;span lang="ko"&gt;, &lt;/span&gt;그리고 경영쪽 분야입니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;이 중 프로토 타입을 위해서는 디자인 전공 하시는 분과&lt;span lang="ko"&gt;, &lt;/span&gt;기획 하시는 분이 절실히 필요합니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span lang="ko" style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;현재 프로토 타입 작업은&lt;span lang="ko"&gt; 50% &lt;/span&gt;정도 완료가 되었는데요&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;제가 서비스 하고자 하는 것은&lt;span lang="ko"&gt; "&lt;/span&gt;사용자&lt;span lang="ko"&gt; Life Logging&lt;/span&gt;을 이용한 지능형 서비스&lt;span lang="ko"&gt;"&lt;/span&gt;를 테마로 하고 있습니다&lt;span lang="ko"&gt;. &lt;/span&gt;여기에&lt;span lang="ko"&gt; SNS &lt;/span&gt;같은 것들은 이 테마를 강화하고 재미를 두기 위해 차용하고 있습니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span lang="ko" style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;여기에 혹시 관심이 있으신 분들은 제게 이메일을 주시면 감사하겠습니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;전혀 부담 갖지 마시고&lt;span lang="ko"&gt;, &lt;/span&gt;그냥 비슷한 필드에서 인맥을 쌓기 위해 연락주셔도 좋구요&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;혹시 서로 도움을 줄 수 있는 부분들 있을지도 모르니&lt;span lang="ko"&gt;, &lt;/span&gt;차한잔 하자라고 연락주셔도 좋습니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span lang="ko" style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;건강하시구요&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;디자인 고수분들&lt;span lang="ko"&gt;, &lt;/span&gt;기획 고수분들&lt;span lang="ko"&gt;, &lt;/span&gt;개발 고수 분들&lt;span lang="ko"&gt;, &lt;/span&gt;경영 고수 분들&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;정말 많은 관심 부탁드립니다&lt;span lang="ko"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span lang="ko" style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="margin-bottom:10.0pt;text-align:left; line-height:115%;mso-layout-grid-align:none;word-break:keep-all"&gt;&lt;span lang="ko" style="mso-bidi-font-size:10.0pt;line-height:115%;mso-ascii-font-family:&amp;quot;맑은 고딕&amp;quot;; mso-fareast-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-font-kerning: 0pt;mso-ansi-language:#0012"&gt;email : grandsys@icu.ac.kr&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-2994558073675502509?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/2994558073675502509/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=2994558073675502509' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2994558073675502509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2994558073675502509'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2010/11/blog-post.html' title='같이 창업하실 창업 멤버 모십니다.'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-8946346481115952065</id><published>2008-07-17T10:36:00.001+09:00</published><updated>2008-07-17T10:38:10.886+09:00</updated><title type='text'>노무현 대통령이 이명박 대통령에게 보내는 글</title><content type='html'>난 좀 그렇다.&lt;br /&gt;인간적으로도.&lt;br /&gt;이치적으로도.&lt;br /&gt;좀 그렇다...........&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이명박 대통령님, 기록 사본은 돌려드리겠습니다. 사리를 가지고 다투어 보고 싶었습니다. 법리를 가지고 다투어 볼 여지도 있다고 생각했습니다. 열람권을 보장 받기 위하여 협상이라도 해보고 싶었습니다. 그래서 버티었습니다.&lt;br /&gt;&lt;br /&gt;모두 나의 지시로 비롯된 일이니 설사 법적 절차에 들어가더라도 내가 감당하면 될 것이라고 생각했습니다.&lt;br /&gt;그런데 이미 퇴직한 비서관, 행정관 7-8명을 고발하겠다고 하는 마당이니 내가 어떻게 더 버티겠습니까?&lt;br /&gt;내 지시를 따랐던, 힘없는 사람들이 어떤 고초를 당할지 알 수 없는 마당이니 더 버틸 수가 없습니다.&lt;br /&gt;&lt;br /&gt;이명박 대통령님, 모두 내가 지시해서 생겨난 일입니다. 나에게 책임을 묻되, 힘없는 실무자들을 희생양으로 삼는 일은 없도록 해주시기 바랍니다.&lt;br /&gt;기록은 국가기록원에 돌려 드리겠습니다.&lt;br /&gt;　“전직 대통령을 예우하는 문화 하나만큼은 전통을 확실히 세우겠다.”이명박 대통령 스스로 먼저 꺼낸 말입니다. 내가 무슨 말을 한 끝에 답으로 한 말이 아닙니다. 한 번도 아니고 만날 때마다, 전화할 때마다 거듭 다짐으로 말했습니다. 그 말을 듣는 순간에는 자존심이 좀 상하기도 했으나 진심으로 받아들이면서 ‘감사하다’고 말씀드렸습니다. 그리고 은근히 기대를 하기도 했습니다.&lt;br /&gt;&lt;br /&gt;그 말씀을 믿고 저번에 전화를 드렸습니다.“보도를 보고 비로소 알았다”고 했습니다.이때도 전직 대통령 문화를 말했습니다. 그리고 부속실장을 통해 연락을 주겠다고 했습니다. 그래서 선처를 기다렸습니다.&lt;br /&gt;그러나 한참을 기다려도 연락이 없어서 다시 전화를 드렸습니다. 이번에는 연결이 되지 않았습니다. 몇 차례를 미루고 미루고 하더니 결국 ‘담당 수석이 설명 드릴 것이다’라는 부속실장의 전갈만 받았습니다.&lt;br /&gt;&lt;br /&gt;우리 쪽 수석비서관을 했던 사람이 담당 수석과 여러 차례 통화를 시도해 보았지만 역시 통화가 되지 않았습니다.&lt;br /&gt;&lt;br /&gt;지금도 내가 처한 상황을 믿을 수가 없습니다.&lt;br /&gt;“전직 대통령은 내가 잘 모시겠다.” 이 말이 아직도 귀에 생생한 만큼, 지금의 궁색한 내 처지가 도저히 실감이 나지 않습니다.내가 오해한 것 같습니다.이명박 대통령을 오해해도 크게 오해한 것 같습니다.&lt;br /&gt;&lt;br /&gt;이명박 대통령님, 가다듬고 다시 말씀드리겠습니다. 기록은 돌려 드리겠습니다. 가지러 오겠다고 하면 그렇게 하겠습니다.보내 달라고 하면 그렇게 하겠습니다.&lt;br /&gt;　대통령기록관장과 상의할 일이나 그 사람이 무슨 힘이 있습니까? 국가기록원장은 스스로 아무런 결정을 하지 못하는 것 같습니다. 결정을 못하는 수준이 아니라, 본 것도 보았다고 말하지 못하고, 해 놓은 말도 뒤집어 버립니다. 그래서 이명박 대통령에게 상의 드리는 것입니다.&lt;br /&gt;　&lt;br /&gt;&lt;br /&gt;이명박 대통령님, 질문 하나 드리겠습니다.기록을 보고 싶을 때마다 전직 대통령이 천리길을 달려 국가기록원으로 가야 합니까? 그렇게 하는 것이 정보화 시대에 맞는 열람의 방법입니까? 그렇게 하는 것이 전직 대통령 문화에 맞는 방법입니까? 이명박 대통령은 앞으로 그렇게 하실 것입니까? 적절한 서비스가 될 때까지 기록 사본을 내가 가지고 있으면 정말 큰일이 나는 것 맞습니까?&lt;br /&gt;지금 대통령 기록관에는 서비스 준비가 잘되고 있는 것으로 알고 있습니까? 언제 쯤 서비스가 될 것인지 한 번 확인해 보셨습니까?&lt;br /&gt;내가 볼 수 있게 되어 있는 나의 국정 기록을 내가 보는 것이 왜 그렇게 못마땅한 것입니까?&lt;br /&gt;&lt;br /&gt;공작에는 밝으나 정치를 모르는 참모들이 쓴 정치 소설은 전혀 근거 없는 공상소설입니다. 그리고 그런 일이 기록에 달려 있는 것은 더욱 아닙니다.&lt;br /&gt;&lt;br /&gt;이명박 대통령님, 우리 경제가 진짜 위기라는 글들은 읽고 계신지요? 참여정부 시절의 경제를 ‘파탄’이라고 하던 사람들이 지금 이 위기를 어떻게 규정하고 있는지 모르지만, 아무튼 지금은 대통령의 참모들이 전직 대통령과 정치 게임이나 하고 있을 때가 아니라는 사실 정도는 잘 알고 계시리라 믿습니다.&lt;br /&gt;&lt;br /&gt;저는 두려운 마음으로 이 싸움에서 물러섭니다.&lt;br /&gt;하느님께서 큰 지혜를 내리시기를 기원합니다.&lt;br /&gt;　&lt;br /&gt;2008년 7월 16일 16대 대통령 노 무 현&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-8946346481115952065?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/8946346481115952065/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=8946346481115952065' title='42개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/8946346481115952065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/8946346481115952065'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2008/07/blog-post.html' title='노무현 대통령이 이명박 대통령에게 보내는 글'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>42</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-2238854579701256394</id><published>2007-09-06T16:25:00.000+09:00</published><updated>2007-09-06T16:27:04.012+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='넋두리'/><title type='text'>SQL 답답</title><content type='html'>Data를 뽑은 지 일주일 째...&lt;br /&gt;&lt;br /&gt;Database를 두고 작업 하는 걸 너무 만만하게 본 경향이 있는 듯 하기도 하다.&lt;br /&gt;&lt;br /&gt;truncate id_table;&lt;br /&gt;truncate thread_table;&lt;br /&gt;truncate reply_table;&lt;br /&gt;&lt;br /&gt;select count(distinct(id)) from id_table;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-2238854579701256394?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/2238854579701256394/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=2238854579701256394' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2238854579701256394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2238854579701256394'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/09/sql.html' title='SQL 답답'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-7415611977732832894</id><published>2007-09-05T16:38:00.000+09:00</published><updated>2007-09-05T16:47:02.097+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='소모적인 setting'/><title type='text'>acrobat없이 pdf파일 만들기</title><content type='html'>이글의 출처는 &lt;a href="http://www.javala.net/zero/view.php?id=store_01&amp;page=1&amp;amp;sn1=&amp;divpage=1&amp;amp;sn=off&amp;ss=on&amp;amp;sc=on&amp;select_arrange=headnum&amp;amp;desc=asc&amp;no=5"&gt;이곳&lt;/a&gt; 입니다&lt;br /&gt;&lt;br /&gt;--&gt;&lt;br /&gt;[STEP 1] 이미지 프린터 추가&lt;br /&gt;1-1) 제어판 -&gt; 프린터추가 -&gt; 로컬검색 -&gt; Apple -&gt; Color LaserWrite 12/660 PS&lt;br /&gt;(반드시 포스트스크립트가 지원되는 프린터를 선택한다)&lt;br /&gt;&lt;br /&gt;[STEP 2] 인쇄 고급항목 설정&lt;br /&gt;2-1) 트루타입폰트 : 소프트글꼴 다운로드&lt;br /&gt;2-2) 포스트스크립트옵션에서 트루타입폰트 다운로드옵션 : 윤곽선&lt;br /&gt;&lt;br /&gt;[STEP 3] 파일 설치&lt;br /&gt;3-1) gs800w32.exe 파일 실행하여 고스트스크립트 설치 (기본값을 그대로 적용)&lt;br /&gt;3-2) makepdf-0.03.exe 파일을 설치하고 "파일" 메뉴에서 "AutoConfig"를 선택(1번만)&lt;br /&gt;&lt;br /&gt;[STEP 4] 변환&lt;br /&gt;4-1) 변환하고자 하는 원본파일을 열고 위에서 설치한 ps 프린터로 "파일출력" 옵션으로 출력&lt;br /&gt;--&gt; 보통 *.prn 이나 *.ps 로 출력&lt;br /&gt;4-2) makepdf.exe 파일을 실행하여 앞서 만들어진 *.ps 혹은 *.prn 파일을 마우스로 드래그하여 집어넣음&lt;br /&gt;&lt;br /&gt;[STEP 5] 끝 (자동으로 pdf 파일 생성)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-7415611977732832894?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/7415611977732832894/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=7415611977732832894' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/7415611977732832894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/7415611977732832894'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/09/acrobat-pdf.html' title='acrobat없이 pdf파일 만들기'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-106364560511001670</id><published>2007-09-04T17:48:00.000+09:00</published><updated>2007-09-04T19:14:43.626+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Machine learning'/><title type='text'>Issues in Machine Learning : Machine learning1 - 3</title><content type='html'>이번 장에서는 머신 러닝 분야에 있어서 혹은 머신 러닝을 프로젝트에 적용할 때 중요한 이슈가 되는 점들에 대해서 간단히 정리해 보도록 한다. 이 부분은 Tom M. Mitchell의 책 Machine Learning의15page에 해당하는 부분의 해석이라고 해도 무방하다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. 특정한 trainig examples에 대해서 범용적으로 사용될 수 있는 target function으로는 어떠한 것들이 있을 수 있을까? 그리고 충분한 training data가 주어졌다고 가정할 때, 어떤 알고리즘이 target function의 기능을 하기 위해 어떠한 setting들이 필요한가? problems와 representations의 유형들에 대해서 어떤 알고리즘들이 가장 효과적인가?&lt;br /&gt;&lt;br /&gt;2. training data는 얼마정도가 적당한가? training data에 대해서 일반적으로 통용될 수 있는 boundary가 있는가?&lt;br /&gt;&lt;br /&gt;3. 사전 지식이 언제, 그리고 어떻게 examples를 generalization하는데 이용될 수 있는가? 만약, 사전 지식이 잠정적으로 옳다고 생각되는 경우에도(절대적이 아닌) 도움이 될 수 있는가?&lt;br /&gt;&lt;br /&gt;4. 가장 효과적으로 다음 training experiences를 선택하는 방법은 무엇인가? 그리고 이러한 방법이 learning problem의 복잡성을 어떻게 줄이는가?&lt;br /&gt;&lt;br /&gt;5. learning task를 하나 이상의 function aproximation problems으로 바꾸는 가장 좋은 방법은 무엇인가?(즉, 학습을 target function을 설계하고 traning하는 실제적인 문제로 변환할 때 가장 좋은 방법은?) 시스템이 학습해야 하는 어떤 특별한 function들이 있는가? 그리고 이러한 과정은 자동적으로 수행되어질 수 있는가?&lt;br /&gt;&lt;br /&gt;6. learner가 자동적으로 문제들을 target function으로 표현하고 학습하도록 할려면 어떻게 해야 하는가?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-106364560511001670?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/106364560511001670/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=106364560511001670' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/106364560511001670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/106364560511001670'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/09/issues-in-machine-learning-machine.html' title='Issues in Machine Learning : Machine learning1 - 3'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-737203399924894687</id><published>2007-08-30T14:39:00.000+09:00</published><updated>2007-08-31T15:18:38.170+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='소모적인 setting'/><title type='text'>이클립스 디버그</title><content type='html'>언제까지 System.out.println()으로 버그를 잡으려 할 것인가.&lt;br /&gt;&lt;br /&gt;이클립스에서 VC처럼 디버깅을 하자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;사실 디버깅은 처음 접하는 사람에겐 쉽지 않다.&lt;br /&gt;책을 보고 따라하면 너무나 쉬운데 막상 프로그래밍하면서 적용하다 보면 애를 먹고는 한다.&lt;br /&gt;그러다 과감하게 난 System.out.println()의 강력함을 알고 있다며 중요 요소에 값을 찍는다.&lt;br /&gt;그러다 어디가 어디서 나오는 값인지 몰라서 갑갑하게 돼고,&lt;br /&gt;그러다 이번 프로그래밍엔 문제가 많았어. 다시 짜지 뭐. 난 부지런하니까... 하게 돼고...&lt;br /&gt;그러다 다시 디버깅 책을 찾아 따라하게 돼고....&lt;br /&gt;&lt;br /&gt;그렇지만, 언젠가 좋아지겠지 하며 오늘도 이런 악순환을 계속해본다.&lt;br /&gt;정말 언젠간 좋아지겠지.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이클립스에서 디버깅을 해본 사람은 알 것이다.&lt;br /&gt;무료인데도 정말 너무나 훌륭한 녀석이다.&lt;br /&gt;&lt;br /&gt;정말 고마운 분들이 세상엔 많이 계시고, 그 분들로 인하여 영광을 입은 이클립스 사용자들이 이클립스에서 디버깅을 위해서 가장 먼저 해야 할 것은 어디가 문제가 될 것인가를 아는 눈이다. 이건 그 사람의 내공의 깊이에 달려있는 문제이긴 하지만, 효과적인 툴의 도움을 받는다면 더욱 문제 해결의 실마리를 찾기 쉽게 된다.&lt;br /&gt;&lt;br /&gt;.이클립스에서 디버깅을 하기 위해서 가장 먼저 문제가 될 만한 곳을 찾아라.&lt;br /&gt;-&gt;결과(console 창)가 보이는 화면에서 Exception이나 오류가 발생했을 때의 해당 위치,&lt;br /&gt;-&gt;논리적으로 뭔가 애매 모호한 프로그램 부근&lt;br /&gt;-&gt;업무 시간이 끝날 때 즈음 급하게 나갈려고 대충 짠 부근&lt;br /&gt;등이 주요 타겟이다.&lt;br /&gt;&lt;br /&gt;1.브레이크포인트&lt;br /&gt;의심이 되는 위치에 추가한다.&lt;br /&gt;- 변수명에 설정하면 프로그램에서 이 변수를 사용할 때마다 프로그램이 정지한다.&lt;br /&gt;- 프로그램 라인에 설정하면 해당 프로그램 라인을 지날 때 프로그램이 정지한다.&lt;br /&gt;&lt;br /&gt;브레이크 포인트를 여러개 추가한 상태에서 포인트는 그대로 둔채 몇개를 잠시 끄고 싶을 때는 마우스 왼쪽 클릭해서 Disable Breakpoint를 설정하면 된다.(반대는 Enable Breakpoint)&lt;br /&gt;&lt;br /&gt;2.Hit Count&lt;br /&gt;브레이크 포인트가 추가되었을때 변수나 프로그램 라인이 몇번 째 호출 되었을때 멈추라는 명령은 Hit Count를 설정함으로서 수행할 수 있다. 이런 경우는 보통 for나 while문에서 몇번의 루프 반복 이후에 문제가 발생할 때 보다 편리하게 이용할 수 있다. '한 100번 쯤 뒤에 문제가 발생하던데' 하면 Hit Count를 95정도로 설정하면 될 테지.&lt;br /&gt;&lt;br /&gt;3.멀티 쓰레드 디버깅&lt;br /&gt;멀티 쓰레드 디버깅을 해보신적이 있으신가... 그렇다면 이 문서 자체가 유용하지 않으실 정도로 내공이 쌓인 분이시겠지만... 멀티 쓰레딩을 디버깅하는 아픔을 겪어보신 분이 아니라면, 그런 문제에 부딪히기 전에 이클립스에서 가상 머신(VM)을 아예 멈춰서 전체 쓰레드 동작을 정지시키는 훌륭한 옵션이 있음을 꼭 알고 계시길 바란다.&lt;br /&gt;이 기능은 breakpoint를 설정한 상태에서 컨텍스트 메뉴에서 Suspend VM을 선택하면 된다. Suspend Thread는 원래대로 해당 Thread만 멈추게 된다. 혹 이해가 잘 안되는 사람을 위해 추가로 얘길 한다면 일반적으로 Thread programming을 하지 않고 static void main()을 이용한 기본적인(?) 프로그래밍을 하는 경우는 main이라는 one Thread만 동작하기 때문에 Suspend Thread나 Suspend VM이나 똑같은 작동을 한다.(신경쓰지 않아도 된다는 얘기다.)&lt;br /&gt;&lt;br /&gt;4.스텝 단위 디버깅&lt;br /&gt;성격이 급하신 분들이나, VC를 사용하다 이클립스를 쓰는 분들은 당장 이것들이 필요할 것이다.&lt;br /&gt;Step Into(F5키):프로그램을 한 스텝진행, 다음 실행 문이 함수 안이면 함수 안으로 들어감.&lt;br /&gt;Step Over(F6키):함수 호출을 지나치고 현재 위치에서 한 스텝씩 진행&lt;br /&gt;Step Return(F7키):현재 함수 끝까지 바로 가서 리턴한 후 함수 호출부로 되돌아 간다.&lt;br /&gt;Resume(F8키):멈추어 있던 쓰레드를 다시 진행시키고 다음 브레이크포인트까지 실행&lt;br /&gt;Suspend:쓰레드를 일시 정지한다. 강제로 breakpoint를 현재 수행문에 지정한 것과 같다.&lt;br /&gt;Drop to Frame:선택한 스택 프레임의 첫 행으로 실행 포인트를 옮긴다. 특정 함수를 실행하다 그 함수의 처음부터 다시 디버깅하려고 할때.&lt;br /&gt;Terminate:종료&lt;br /&gt;&lt;br /&gt;Run to Line(Ctrl+R):쓰레드가 정지된 상태에서 테스트 하고 싶은 곳을 에디터로 소스에서 선택한 뒤 Run to Line을 실행 하면 그 곳까지 프로그램 수행 후 자동 정지한다.&lt;br /&gt;&lt;br /&gt;5. 스텝 필터링&lt;br /&gt;F5키를 눌러 한 스텝씩 진행하다 보면 java가 제공하는 라이브러리 내부로 들어가는 경우가 발생한다. F6만 누른 다면 문제가 발생하지 않겠지만, 내가 만든 함수 안으로는 들어가보고 싶을 때 신경써서 F5, F6, F7을 누르는 건 상당히 피곤한 일이다. 이럴 때 사용할 수 있는 기능이 스텝 필터링이다. 말 그대로 한 발짝 움직일 때 하지 않았으면 하는 일을 지정해 주는 것이다. 이를 위해서 스텝 필터를 먼저 설정해야 한다.&lt;br /&gt;&lt;br /&gt;6.Display&lt;br /&gt;디버깅 중, 내가 만든 함수를 이용해 현재의 결과를 보고 싶어 할 수 있다. 예를 들면, isInteger()라는 함수를 만들었고, 이 함수가 함수 인자가 Integer형인지를 리턴 한다고 할때 디버깅 상황에서 현재 상태에 이 함수의 결과를 알고 싶다면, 디버깅을 중단하고 나가서 isInteger()코드를 추가하지 말아라.&lt;br /&gt;단지, Window메뉴의 Show View메뉴의 Display를 켜고 isInteger()를 치고 눌러보자.&lt;br /&gt;이 Display는 내가 만든 함수 뿐만 아니라 확인하고 싶은 수식을 직접 입력할 수도 있다.&lt;br /&gt;&lt;br /&gt;7.Drop to Frame&lt;br /&gt;F6키를 사정없이 눌러서 내가 보고 싶어하는 소스 코드 부분을 지나친 적이 있는가. 이럴 때 당신에게 필요한 기능이 Drop to Frame이다. Drop to Frame을 사용하면 현재 메서드의 첫 행으로 되돌아 간다.&lt;br /&gt;&lt;br /&gt;8.Detail Formatter&lt;br /&gt;String 객체의 배열을 다루는 class를 사용할 때 너무 많은 String 배열로 인해서 내가 원하는 부분을 찾는 데 어려웠던 적이 있는가? 예를 들면, 한 String 객체의 전체 문자열을 각 array 별로 보여주도록 (ex)S[0] = "나는 언제나")) 하기를 바랬던 적이 있냐 하는 말이다. 이럴 경우 Java메뉴의 Debug메뉴의 Detail Formatters를 통해서 내가 원하는 형태로 객체가 표시되도록 할 수 있다. 복잡한 코드에서는 강력한 기능을 발휘하는 메뉴이다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-737203399924894687?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/737203399924894687/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=737203399924894687' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/737203399924894687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/737203399924894687'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/blog-post_30.html' title='이클립스 디버그'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-2369331832277618293</id><published>2007-08-14T21:16:00.000+09:00</published><updated>2007-08-14T21:18:25.771+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social network'/><title type='text'>소셜 네트워크 서비스 관련 글</title><content type='html'>이 글은 IR 그룹의 하얀 눈길님이 작성하신 글입니다.&lt;br /&gt;&lt;br /&gt;원문은 &lt;a href="http://irgroup.org/zb5/trackback.php?article_srl=13947"&gt;여기&lt;/a&gt;에 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;소셜 네트워크 서비스에 대한 관련글들입니다.지속적으로 추가할 예정입니다.&lt;br /&gt;&lt;br /&gt;* &lt;a href="http://podcast.co.kr/entry/소셜-네트워크-서비스의-7가지-요소" target="_blank"&gt;소셜 네트워크 서비스의 7가지 요소&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://ittrend.egloos.com/3157402" target="_blank"&gt;소셜 네트워크와 광고&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://likle.tistory.com/2" target="_blank"&gt;소셜네트워크서비스 측면에서 라이클 기획의도&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://www.dal.co.kr/col/organ/20041001_kcc.html" target="_blank"&gt;블로그, 소셜네트워크는 어떻게 진화할 것인가?&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://chaniworld.tistory.com/1165303597"&gt;주목받는 해외서비스로 알아본 2007년 인터넷 트렌드&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://betanews.mm.co.kr/bbs/read.html?tkind=2&amp;lkind=18&amp;amp;mkind=353&amp;num=321752&amp;amp;tmp=Tue%20Jan%203%2011:41:51%20UTC+0900%202006" target="_blank"&gt;인터넷 북마크 서비스 딜리셔스를 아세요?&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://www.hatena.co.kr/112"&gt;일본의 신세대 인터넷 기업들&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://kidbs.itfind.or.kr/UWZIN/%C0%A52.0%B0%FA%20%BC%D2%BC%C8%20%B3%D7%C6%AE%BF%F6%C5%A9.pdf" target="_blank"&gt;웹2.0과 소셜 네트워크&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://news.empas.com/show.tsp/cp_nm/20070517n08650/" target="_blank"&gt;[커버스토리]누가 웹2.0 비즈니스 주도하는가?&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://www.hatena.co.kr/238" target="_blank"&gt;소셜북마크 사이트와 포털의 소셜북마크 서비스의 차이&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;* &lt;a href="http://mar.gar.in/tag/%25EC%2586%258C%25EC%2585%259C%25EB%2584%25A4%25ED%258A%25B8%25EC%259B%258C%25ED%2582%25B9" target="_blank"&gt;마가린 : 소셜네트워킹 태그&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://tag.allblog.net/%EC%86%8C%EC%85%9C%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC" target="_blank"&gt;올블로그 : 소셜네트워크 태그&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-2369331832277618293?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/2369331832277618293/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=2369331832277618293' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2369331832277618293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2369331832277618293'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/blog-post_14.html' title='소셜 네트워크 서비스 관련 글'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-5794724043991026489</id><published>2007-08-14T13:22:00.000+09:00</published><updated>2008-12-11T23:44:02.125+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='검색 엔진'/><title type='text'>trie</title><content type='html'>&lt;div&gt;IR group의 하얀 눈길님이 적으신 글 중 trie에 대한 설명이 있어서 스크랩 해 왔다.&lt;br /&gt;&lt;br /&gt;원문은 &lt;a href="http://irgroup.org/zb5/trackback.php?article_srl=4259"&gt;여기&lt;/a&gt;서 볼 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;array-based trie&lt;br /&gt;trie란 바이너리 트리의 특이한 경우로 보면 되겠다. 보통 문자열을 처리하기 위해 사용되며, 속도가 빠르고 공간을 적게 차지하기 때문에 검색엔진에서는 사전과 역화일의 인덱스 정보를 저장하는데 주로 사용한다. 여기서 구현할 trie의 구조는 다음과 같다.&lt;br /&gt;&lt;br /&gt;예) “추석, 추억, 가을, 가나, 가나다라”을 저장하는 트라이&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_ECA08t3QSQ0/RsEwUzE2nDI/AAAAAAAAAB4/fsajxQQD9C8/s1600-h/1111.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5098409387026193458" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_ECA08t3QSQ0/RsEwUzE2nDI/AAAAAAAAAB4/fsajxQQD9C8/s400/1111.jpg" border="0" /&gt;&lt;/a&gt;문자열에서 각 음절을 하나의 depth(자식노드)로 볼 수 있으며 같은 depth의 음절은 바로 앞의 음절이 같을 경우 형제노드로 볼 수 있다.&lt;br /&gt;위 예에서 보면 처음 “추석”이 저장될 때 ‘추’ 가 루트가 되어고 ‘석’이 추의 자식노드로 저장된다. 다음에 “추억”이 저장될 때 ‘추’가 루트에 있으므로 첫음절은 같은 부모노드를 공유하고 ‘억’을 자식노드로 저장한다. 이때 자식노드에 이미 ‘석’이 있고 ‘석’과 ‘억’은 형제노드 관계에 있으므로 ‘석’의 오른쪽 노드에 ‘억’을 저장하게 된다.&lt;br /&gt;다음에 “가을”을 저장할 때 ‘가’는 첫음절이므로 루트노드와 비교를 하고, 이미 ‘추’가 있으므로 ‘추’와 ‘가’는 형제노드가 되며, ‘가’가 더 작은 값이기 때문에 ‘추’의 앞에 ‘가’를 삽입하고 ‘가’의 오른쪽 노드를 ‘추’로 지정해 준다. 그리고 나서 ‘을’을 저장할 때 ‘가’의 자식노드가 되므로 왼쪽 노드를 추가하고 ‘을’을 저장한다.&lt;br /&gt;다음에 “가나”가 입력되면, ‘가’가 루트노드에 존재하므로 ‘을’을 저장할 때 ‘가’와 같은 부모를 갖게 하고 자식노드를 삽입한다. 이때 자식노드에 이미 ‘을’이 있으므로 ‘나’와 ‘을’은 형제관계가 되고 ‘나’를 ‘을’ 앞에 삽입하게 된다.&lt;br /&gt;“가나다라”가 입력되면, 마찬가지 방식으로 trie에 저장되게 된다.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-5794724043991026489?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/5794724043991026489/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=5794724043991026489' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5794724043991026489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5794724043991026489'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/trie.html' title='trie'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ECA08t3QSQ0/RsEwUzE2nDI/AAAAAAAAAB4/fsajxQQD9C8/s72-c/1111.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-5406347247022963062</id><published>2007-08-14T12:53:00.000+09:00</published><updated>2007-08-14T12:58:58.887+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='검색 엔진'/><title type='text'>웹 로봇 3 - 로봇 배제 표준</title><content type='html'>&lt;a href="http://irgroup.org/"&gt;IR 그룹&lt;/a&gt;의 하얀 눈길 님께서 올리신 글입니다.&lt;br /&gt;출처는 네이버의 8core님의 블로그입니다. &lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;span style="font-size:0;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;네이버의 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;8core&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;님의 블로그에서 퍼왔습니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;잘 정리가 되어 있어서 이번 강좌는 그냥 두리뭉실 넘어가겠습니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;~ &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;출처 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;: &lt;/span&gt;&lt;/span&gt;&lt;a href="http://blog.naver.com/8core.do?Redirect=Log&amp;logNo=20001644843"&gt;&lt;u&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#0000ff;"&gt;http://blog.naver.com/8core.do?Redirect=Log&amp;amp;logNo=20001644843&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;b&gt;===========================================================&lt;/b&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="center"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;b&gt;&lt;span style="color:#ff6600;"&gt;`&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;b&gt;&lt;span style="color:#ff6600;"&gt;인터넷 검색엔진 배제표준&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;b&gt;&lt;span style="color:#ff6600;"&gt;`&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;b&gt;&lt;span style="color:#ff6600;"&gt;을 따르는 방법&lt;/span&gt;&lt;/b&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="center"&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="center"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:9;"&gt;&lt;span lang="ko-KR"&gt;&lt;b&gt;검색엔진에서 내홈페이지가 서치당하지 않기위해 쓰는 방법&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-TOP: 0.19in; MARGIN-BOTTOM: 0.19in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;최근 웹 검색엔진의 성능이 월등히 향상되면서 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;HTML&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;로 작성된 웹페이지의 내용은 물론 웹사이트에 올려놓은 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;PDF&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;나 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;DOC&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;같은 문서파일 내용까지 검색이 가능합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;.&lt;/span&gt;&lt;/span&gt; &lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;이런 정보유출 방지 대책의 일환으로 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;인터넷 검색엔진 배제표준&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;(Robots Exclusion Protocol)'&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;을 적용하시기 바랍니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;.&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-TOP: 0.19in; MARGIN-BOTTOM: 0.19in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;이를 이용하여 사이트의 모든 페이지에 대하여 노출은 차단할 수 있고&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;차단을 원하는 페이지에 대해서만 노출차단도 가능합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;.&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-TOP: 0.19in; MARGIN-BOTTOM: 0.19in" align="left"&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;b&gt;&lt;span style="color:#0000ff;"&gt;인터넷 검색엔진 배제표준이란&lt;/span&gt;&lt;/b&gt; 보안이 필요한 내용이 검색엔진에 유출 되지 못하도록 웹페이지를 작성하는 방법을 기술한 국제기술표준입니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;.&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN: 0.19in 0.31in" align="left"&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-TOP: 0.19in; MARGIN-BOTTOM: 0.19in" align="left"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:11;"&gt;&lt;b&gt;robots.txt &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="ko-KR"&gt;&lt;b&gt;작성방법&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-TOP: 0.19in; MARGIN-BOTTOM: 0.19in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;1. robots.txt&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;를 웹 서버의 홈페이지 최상위 디렉토리에 저장&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;사이트가 특정 호스트&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;(host)&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;와 포트&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;(port) &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;번호에서 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;HTTP &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;서버로 운영되는 것으로 정의되었으면&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;로봇은 단순히 사이트 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;URl&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;에서 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;"/robots.txt"&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;를 찾을 것입니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;. robots.txt&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;의 위치 예제입니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;사이트 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;URI robots.txt&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;의 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;URI&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.w3.org/" target="_blank"&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#0000ff;"&gt;http://www.w3.org/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.w3.org/robots.txt" target="_blank"&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#0000ff;"&gt;http://www.w3.org/robots.txt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.w3.org/" target="_blank"&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#0000ff;"&gt;http://www.w3.org:80/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.w3.org/robots.txt" target="_blank"&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#0000ff;"&gt;http://www.w3.org:80/robots.txt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://w3.org/" target="_blank"&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#0000ff;"&gt;http://w3.org/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href="http://w3.org/robots.txt" target="_blank"&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#0000ff;"&gt;http://w3.org/robots.txt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;싸이트에는 하나의 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;"/robots.txt" &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;만을 가질 수 있습니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;구체적으로&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;, "robots.txt" &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;화일들은 로봇이 그것을 사용자 디렉토리에서 찾지 않기 때문에&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;사용자 디렉토리에 위치시켜서는 안됩니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;사용자가 자신의 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;"robots.txt"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;를 만들기를 원하면&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;단일 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;"/robots.txt" &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;안에 모두 통합&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;(merge)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;할 필요가 있습니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-TOP: 0.19in; MARGIN-BOTTOM: 0.19in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;2. robots.txt&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;의 내용&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN: 0.19in 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;- &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;모든 로봇에 대한 모든 디렉토리 검색 거부시&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN: 0.19in 0.31in 0.19in 0.52in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;User-agent:*&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN: 0.19in 0.31in 0.19in 0.52in" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;Disallow:/&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN: 0.19in 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;- &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;모든 로봇에 대한 서버 일부분만 검색거부시&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN: 0.19in 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;예&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;: /secure &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;디렉토리&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;, /policy &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;디렉토리만 검색거부&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN: 0.19in 0.31in 0.19in 0.52in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;User-agent:*&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN: 0.19in 0.31in 0.19in 0.52in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;Disallow:/secure/&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN: 0.19in 0.31in 0.19in 0.52in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;Disallow:/policy/&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN: 0.19in 0.31in 0.19in 0.52in" align="left"&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;URI&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;는 대소문자 구별&lt;/span&gt;하며&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;, &lt;span style="color:#800080;"&gt;"/robots.txt" &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;문자열은 모두 소문자&lt;/span&gt;이어야 하며&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;공백은 허용되지 않습&lt;/span&gt;니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;만일 그 값이 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;"*" &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;이면&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;그 레코드는 다른 레코드들과 하나도 맞지 않는 어떤 로봇에서나 가능한 디폴트 접속&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;(access) &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;정책&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;(policy)&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;을 나타냅니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;. "/robots.txt" &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;안에서 여러개의 그러한 레코드를 갖는 것은 허용되지 않습니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#800080;"&gt;"Disallow"(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;허용 안함&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;) &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;필드는 방문 할 수 없는 부분 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;URI&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#800080;"&gt;를 지정&lt;/span&gt;합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;이는 완전 경로&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;(full path) &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;또는 부분 경로가 될 수 있습니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;이 값으로 시작되는 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;URI&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;는 읽혀지지 않을 것입니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;예를 들어 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.42in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;br /&gt;&lt;span style="color:#800080;"&gt;Disallow: /help &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.42in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;/help.html&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;과 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;/help/index.html &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;둘 다 허용 안함&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.42in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;br /&gt;&lt;span style="color:#800080;"&gt;Disallow: /help/ &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.42in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;/help/index.html&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;는 허용 안하나&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;, /help.html&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;은 허용 됨&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;"Disallow"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;에서 빈 값은&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;모든 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;URI&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;들이 읽혀 질 수 있슴을 가리깁니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;. robots.txt &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;화일에는 최소한 한개의 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;"Disallow" &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;필드&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;(field)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;가 있어야 합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:9;"&gt;&lt;b&gt;robots.txt &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:9;"&gt;&lt;span lang="ko-KR"&gt;&lt;b&gt;생성 예시&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;table cellspacing="3" cellpadding="10" width="586" border="1"&gt;&lt;colgroup&gt;&lt;col width="558"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="558"&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0.19in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:9;"&gt;# http://www.xxx.com/&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:9;"&gt;&lt;span lang="ko-KR"&gt;에 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;/robots.txt &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="ko-KR"&gt;파일을 생성하는 예시&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;User-agent: webcrawler &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;Disallow: &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;처음 두라인은 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;'&lt;span style="color:#990099;"&gt;#'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;로 시작&lt;/span&gt;하는 데&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;이것들은 &lt;span style="color:#990099;"&gt;코멘트&lt;/span&gt;이므로 로봇들이 무시합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;webcrawler&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;라는 로봇에 대해&lt;/span&gt; &lt;span style="color:#990099;"&gt;아무것도 불허하지 않는다&lt;/span&gt;는 것을 얘기합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;다시말해 어디에나 갈 수 있다고 허락하는 것입니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;/p&gt;&lt;table cellspacing="3" cellpadding="10" width="586" border="1"&gt;&lt;colgroup&gt;&lt;col width="558"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="558"&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;User-agent: lycra &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;Disallow: / &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;lycra&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;라는 로봇에 대해&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;, '/'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;에 상대적으로 아래 있는 모든 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;URL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;에 대해 접근을 제한&lt;/span&gt;하겠다는 뜻입니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;모든 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;URL&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;은 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;'/'&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;로부터 시작되므로 이것은 이 로봇에 이 사이트 전체를 불허하겠다는 뜻입니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;/p&gt;&lt;table cellspacing="3" cellpadding="10" width="586" border="1"&gt;&lt;colgroup&gt;&lt;col width="558"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="558"&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;User-agent: * &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;Disallow: /tmp &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;Disallow: /logs &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; LINE-HEIGHT: 180%; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;모든 로봇들에 대해 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;/tmp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;나 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;/logs&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;로 시작하는 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;URL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#990099;"&gt;을 읽어가지 못하도록 막는 것&lt;/span&gt;을 얘기 합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;. . &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;3. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;웹문서를 만드는 개인이 할 수 있는 배제 수단은 아래와 같은 메타태그를 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;HTML &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;문서 작성시 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&amp;lt;head&amp;gt; &amp;lt;/head&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;태그 사이에 넣으면&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;입력하면&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;) &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;됩니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;.&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-TOP: 0.19in; MARGIN-BOTTOM: 0.19in; MARGIN-LEFT: 0.31in" align="left"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&amp;lt;meta NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;b&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000ff;"&gt;메타태그 적용 예시&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;table cellspacing="3" cellpadding="10" width="586" border="1"&gt;&lt;colgroup&gt;&lt;col width="558"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="558"&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="ko-KR"&gt;한국해양대학교&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;meta NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;test&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.31in; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-LEFT: 0.31in; MARGIN-RIGHT: 0.31in" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="western" style="MARGIN-TOP: 0.19in; MARGIN-BOTTOM: 0.19in" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;br /&gt;* &lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;자세한 로봇배제에 대한 표준은 인터넷&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.robotstxt.org/" target="_blank"&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#0000ff;"&gt;www.robotstxt.org&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span lang="ko-KR"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;을 이용하시기 바랍니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;.&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ko-KR"&gt;&lt;b&gt;참고사이트 &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;a href="http://users.unitel.co.kr/meeki/robot/ksfaq.html" target="_blank"&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#0000ff;"&gt;http://users.unitel.co.kr/meeki/robot/ksfaq.html&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in; LINE-HEIGHT: 180%" align="left"&gt;&lt;a href="http://www.searchengineworld.com/robots/robots_tutorial.htm" target="_blank"&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:굴림, Gulim, monospace;"&gt;&lt;span style="color:#0000ff;"&gt;http://www.searchengineworld.com/robots/robots_tutorial.htm&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt; &lt;/p&gt;&lt;p class="western" style="MARGIN-BOTTOM: 0in"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-5406347247022963062?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/5406347247022963062/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=5406347247022963062' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5406347247022963062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5406347247022963062'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/ir_2233.html' title='웹 로봇 3 - 로봇 배제 표준'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-695554364376163523</id><published>2007-08-14T04:03:00.000+09:00</published><updated>2008-12-11T23:44:03.361+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='검색 엔진'/><title type='text'>웹 로봇 2 - HTML Parser</title><content type='html'>&lt;p&gt;&lt;a href="http://irgroup.org/"&gt;IR 그룹&lt;/a&gt;의 하얀 눈길 님께서 작성하신 글입니다.&lt;br /&gt;&lt;br /&gt;원문은 &lt;a href="http://irgroup.org/zb5/trackback.php?article_srl=4287"&gt;여기&lt;/a&gt;를 누르시면 볼 수 있습니다.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;소스를 vc++6.0로 바꾸려니 꽤나 갑갑하네요..&lt;br /&gt;프로젝트 압축화일은 자료실에 올리겠습니다.&lt;/p&gt;&lt;p&gt;=================================================================================&lt;br /&gt;HTML이란 Hypertext Markup Language의 약자로서 플랫폼에 의존되지 않는 하이퍼텍스트 문서를 생성할 때 사용되는 구조화된 마크업 언어이다.&lt;br /&gt;현재 버젼 4.01까지 나와 있는 상태이며, 4.01에 대한 자세한 내용은 &lt;a href="http://www.w3.org/MarkUp/"&gt;http://www.w3.org/MarkUp/&lt;/a&gt;를 참조하기 바란다.&lt;br /&gt;또한 RFC 1866 문서(&lt;a href="http://www.rfc-editor.org/rfc/rfc1866.txt"&gt;http://www.rfc-editor.org/rfc/rfc1866.txt&lt;/a&gt;)를 보면 HTML에 대한 문법 및 구조를 정확히 파악할 수 있다.&lt;/p&gt;&lt;p&gt;이 강좌에서는 문법에 대해서 논하기 보다 파서를 구현함에 있어서 알아야 할 기본적인 구조에 대해서만 설명하겠다. 프로그램은 c++로 구현하겠다. 참고로 필자는 c++을 c처럼 쓰는 사람이라 c++에 대한 오류나 더 쉬운 방법이 있다면 제안해 주기 바란다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;다음 예를 보자.&lt;/p&gt;&lt;p&gt;&amp;lt;!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN"&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;HTML 테스트&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;테스트 페이지입니다.&amp;lt;em&amp;gt;&amp;amp;#42;^_^*&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;&lt;p&gt;예1. html 코드 예제&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;위 예1. 을 파서가 해석한다면 다음과 같은 형태로 인식하게 될 것이다.&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/_ECA08t3QSQ0/RsEgTjE2nAI/AAAAAAAAABg/vSEFvxW4cAo/s1600-h/1111.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5098391773365312514" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_ECA08t3QSQ0/RsEgTjE2nAI/AAAAAAAAABg/vSEFvxW4cAo/s400/1111.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;1. 시작태그 : title&lt;br /&gt;2. 데이타 문자들 : "HTML 테스트"&lt;br /&gt;3. 종료태그 : title&lt;br /&gt;4. 시작태그 : p&lt;br /&gt;5. 데이타 문자들 : "테스트 페이지입니다."&lt;br /&gt;6. 시작태그 : em&lt;br /&gt;7. 데이타 문자들 : "*^_^*"&lt;br /&gt;8. 종료태그 : em&lt;br /&gt;9. 종료태그 : p&lt;/p&gt;&lt;p&gt;처음 "&amp;lt;!DOCTYPE..." 은 주석이므로 큰 의미가 없다. 단지 사용자 에이전트가 알 수 있도록 HTML의 버젼과 범용적인 정보를 표시한 것이다. 여기서 7의 항목은 HTML을 위해 정의된 SGML 문법에 따라 *가 "*"로 변환 된 것이다.&lt;/p&gt;&lt;p&gt;위 시퀸스들을 파싱하게 되면 다음 구조가 된다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;도표 1을 보면 html 자체를 하나의 트리로 파싱될 수 있음을 알 수 있다.&lt;br /&gt;HTML, HEAD, BODY 태그는 예1에 존재하지 않지만 HTML 문법상 기본적인 구조를 이루는 것이므로 파싱된 결과에 태그는 없다 하더라도 반영된 것을 볼 수 있다. 이런 식으로 HTML 전체 문서를 파싱하여 트리를 만드는 것으로 파싱 프로그램을 구현하도록 하겠다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;HTML의 기본적인 구조가 있다고 하더라도 원문에 없을 경우 뼈대를 생성할 이유는 없다고 본다. html 문서를 만드는 대부분의 사용자들이 이런 뼈대에 별로 민감하지 않다. 없는 경우도 많고 어떤 경우는 HTML 태그 자체도 여러번 나타날 수 있다. 그래서 이 강좌에서 구현할 파서를 위해 도표1 을 좀더 단순화 하겠다.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_ECA08t3QSQ0/RsEg6jE2nBI/AAAAAAAAABo/-sBywOjl2yM/s1600-h/1111.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5098392443380210706" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_ECA08t3QSQ0/RsEg6jE2nBI/AAAAAAAAABo/-sBywOjl2yM/s400/1111.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;도표 2.를 보면 예1의 시퀸스와 부합되어 더 쉽게 이해할 수 있을 것이라 본다. &lt;/p&gt;&lt;p&gt;불필요한 뼈대를 모두 제거했다.&lt;/p&gt;&lt;p&gt;그리고 태그들의 정보와 문자들을 단순한 트리에 연결시킨 것이다.&lt;/p&gt;&lt;p&gt;다음 예2는 예1을 좀더 확장한 것이다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;title&amp;gt;HTML 테스트&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;p id=t1 align=right&amp;gt;테스트 페이지입니다.&amp;lt;em&amp;gt;&amp;amp;#42;^_^*&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;&lt;p&gt;예2. 확장된 HTML 코드 예제&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;예2에서 확장된 것은 p 태그에 대한 것이다.&lt;/p&gt;&lt;p&gt;태그는 속성을 가질 수 있으며 여러개의 속성을 가질 경우 위 예와같이 계속적으로 나열하여 태그를 구성할 수 있다. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;이러한 태그의 속성까지 파싱한 것이 다음 도표 3이다.&lt;/p&gt;&lt;p&gt;다음 그림 도표 3을 보자.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;a href="http://1.bp.blogspot.com/_ECA08t3QSQ0/RsEhZzE2nCI/AAAAAAAAABw/Lk1kS6hVFkg/s1600-h/1111.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5098392980251122722" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_ECA08t3QSQ0/RsEhZzE2nCI/AAAAAAAAABw/Lk1kS6hVFkg/s400/1111.jpg" border="0" /&gt;&lt;/a&gt; &lt;p&gt;우리의 최종 목표는 도표3과 같은 형태로 파싱하기 위한 파서를 만드는 것이다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;도표 3의 트리는 이진트리로서 왼쪽 노드는 다음 태그를 가리키게 되고, 오른쪽 노드는 현재 태그의 속성을 가리키게 된다. 하나의 오른쪽 노드(속성)는 왼쪽 노드를 가질 수 없으며 다음 속성을 가리키기 위해 계속 오른쪽 노드만 추가하게 된다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;알고리즘은 다음과 같다.&lt;br /&gt;1. 원문에서 처리되지 않은 처음 문자를 읽는다. 그렇지 않으면 종료한다.&lt;br /&gt;2. 공백이면 스킵하고 1로 돌아간다.&lt;br /&gt;3. 종료태그이면 스킵하고 1로 돌아간다.&lt;br /&gt;4. 유효한 시작태그이면 트리에 새로운 태그노드를 삽입한다. 그렇지 않으면 6으로 건너뛴다.&lt;br /&gt;5. 태그 속성을 파싱하여 태그노드에 속성을 연결한후 1로 돌아간다.&lt;br /&gt;6. 데이타 문자열에 현재 문자를 추가한 후 1로 돌아간다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;그럼 지금 부터 실제 코드를 보자.&lt;/p&gt;&lt;p&gt;사실 HTML Parser와 관련된 많은 오픈 소스들이 배포되었고 좋은 성능을 내고 있다. 실제 개발 과정에서는 이러한 라이브러리를 찾아 써도 상관 없지만, 기본적인 개념을 알고 있어야 효과적으로 제어하고 활용할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;파싱 트리를 표현하기 위한 클라스는 다음과 같다.&lt;/p&gt;&lt;p&gt;class HtmlTag&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;// Member Variables&lt;br /&gt;HtmlTag *nextHtmlTag; // 다음번 HtmlTag를 가리킴&lt;br /&gt;TagVar *firstTagVar; // HtmlTag안의 첫번째 Variale이 저장될 TagVar를 가리킴&lt;br /&gt;TagVar *lastTagVar; // HtmlTag안의 첫번째 Variale이 저장될 TagVar를 가리킴&lt;/p&gt;&lt;p&gt;HtmlTag();&lt;br /&gt;~HtmlTag();&lt;/p&gt;&lt;p&gt;// get Function&lt;br /&gt;TagVar *getTagVar(char *szName) const;&lt;br /&gt;char *getTagName() const; &lt;/p&gt;&lt;p&gt;// set Function&lt;br /&gt;int setTagName(char *name);&lt;/p&gt;&lt;p&gt;// ETC.&lt;br /&gt;int addTagVar(TagVar *tv);&lt;br /&gt;void print() const;&lt;/p&gt;&lt;p&gt;private:&lt;br /&gt;char szTagName[NAME_SIZE]; // Tag Name 저장&lt;/p&gt;&lt;br /&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;태그의 속성을 표시하기 위한 클라스는 다음과 같다.&lt;/p&gt;&lt;p&gt;class TagVar&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;// Member Variables&lt;br /&gt;TagVar *nextTagVar; &lt;/p&gt;&lt;p&gt;TagVar();&lt;br /&gt;~TagVar();&lt;/p&gt;&lt;p&gt;// set Function&lt;br /&gt;int setVar(char *var);&lt;br /&gt;int setVal(char *val);&lt;/p&gt;&lt;p&gt;// get Function&lt;br /&gt;char *getVar() const;&lt;br /&gt;char *getVal() const;&lt;/p&gt;&lt;p&gt;private:&lt;br /&gt;char *szVar, *szVal; // 변수이름과 값을 저장&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;HtmlTag 클라스는 한개의 태그에 대한 정의이다. 이 클래스의 내용을 보면 다음 태그를 트리로 연결하기 위해 멤버변수로 HtmlTag 타입의 nextHtmlTag 포인터를 가지고 있다. 이는 도표 3.의 왼쪽 노드가 된다. &lt;/p&gt;&lt;p&gt;태그의 속성을 표시하기 위해 TagVar 클라스 포인터를 멤버 변수로 가지고 있다. firstTagVar 포인터가 바로 그것이며 이 녀석이 태그의 첫번째 속성을 가지게 된다.&lt;br /&gt;TagVar 클래스의 내용을 보면 다음 속성을 가지기 위해 nextTagVar 포인터를 멤버변수로 가지고 있는 것이 보인다. 이것이 도표3에서의 오른쪽 노드가 되는 것이며 실제는 링크드리스트로 구현된다.&lt;/p&gt;&lt;p&gt;다음은 위 두개의 클래스를 묶어서 전체 HtmlParser 클래스로 정의된 클래스이다.&lt;/p&gt;&lt;p&gt;class HtmlParser&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;HtmlTag *firstHtmlTag; // 문서의 첫번째 HtmlTag를 가리킴.&lt;br /&gt;HtmlTag *lastHtmlTag; // 문서의 첫번째 HtmlTag를 가리킴.&lt;/p&gt;&lt;p&gt;HtmlParser();&lt;br /&gt;~HtmlParser();&lt;/p&gt;&lt;p&gt;int exeParser(char *szHtmlTxt);&lt;br /&gt;void print() const;&lt;/p&gt;&lt;p&gt;private:&lt;br /&gt;int addHtmlTag(HtmlTag *ht);&lt;br /&gt;HtmlTag *parseHtmlTag(char **buf);&lt;br /&gt;HtmlTag *parseTextData(char **buf);&lt;br /&gt;HtmlTag *parseComment(char **buf);&lt;br /&gt;int parseVarVal(HtmlTag *ht, char **buf);&lt;br /&gt;};&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;HtmlParser 클래스는 Htmltag 클래스를 멤버변수로 가진다. 이 멤버는 html의 처음 태그 위치를 나타내게 된다. lastHtmlTag 멤버는 큰 의미는 없다.&lt;/p&gt;&lt;p&gt;실제 파싱을 수행하는 메소드가 exeParser로서 html 문자열을 입력받아 순차적으로 처리하게 된다. 이 메서드가 위에서 설명한 파싱 알고리즘을 처리하는 부분이다.&lt;br /&gt;print 메소드는 결과 검증을 위해 화면에 출력하도록 만든 테스트용이다.&lt;br /&gt;private의 메소드들은 모두 exeParser 메소드에서 필요에 의해 호출하는 함수들로 세부 내용은 피하도록 하겠다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;다음은 exeParser의 내용이다.&lt;/p&gt;&lt;p&gt;int HtmlParser::exeParser(char *szHtmlTxt)&lt;br /&gt;{&lt;br /&gt;HtmlTag *ht;&lt;/p&gt;&lt;p&gt;if(!szHtmlTxt)&lt;br /&gt;return 0;&lt;/p&gt;&lt;p&gt;while(szHtmlTxt)&lt;br /&gt;{&lt;br /&gt;if(*szHtmlTxt == '' *szHtmlTxt == EOF)&lt;br /&gt;break;&lt;br /&gt;ht = NULL;&lt;br /&gt;skipBlank(&amp;szHtmlTxt);&lt;/p&gt;&lt;p&gt;if(!*szHtmlTxt)&lt;br /&gt;break;&lt;/p&gt;&lt;p&gt;if(*szHtmlTxt == CLOSE_TAG)&lt;br /&gt;{&lt;br /&gt;szHtmlTxt++;&lt;br /&gt;skipBlank(&amp;szHtmlTxt);&lt;br /&gt;continue;&lt;br /&gt;}&lt;br /&gt;else if(*szHtmlTxt == OPEN_TAG)&lt;br /&gt;{&lt;br /&gt;szHtmlTxt++;&lt;br /&gt;skipBlank(&amp;szHtmlTxt);&lt;/p&gt;&lt;p&gt;switch(whatIsTag(szHtmlTxt))&lt;br /&gt;{&lt;br /&gt;// COMMENT TAG&lt;br /&gt;case COMMENT_TAG:&lt;br /&gt;ht = this-&gt;parseComment(&amp;szHtmlTxt);&lt;br /&gt;break;&lt;br /&gt;&lt;br /&gt;// 여기에선 VALID, INVALID 모두 처리한다.&lt;br /&gt;case VALID_TAG:&lt;br /&gt;case INVALID_TAG:&lt;br /&gt;ht = this-&gt;parseHtmlTag(&amp;szHtmlTxt);&lt;br /&gt;break;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// ETC.&lt;br /&gt;default:&lt;br /&gt;continue;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;// OPEN_TAG가 아니면 TEXT_DATA로 간주한다.&lt;br /&gt;else&lt;br /&gt;ht = this-&gt;parseTextData(&amp;szHtmlTxt);&lt;/p&gt;&lt;p&gt;if(ht)&lt;br /&gt;this.addHtmlTag(ht);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;return 1;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;함수에서 인자로 받는 것은 HTML 스트링이다.&lt;br /&gt;while 루프를 보면 처음에 skipBlank 함수가 있다. &lt;/p&gt;&lt;p&gt;이것은 현재 처리중인 문자가 공백인 것을 무시하고 다음 문자로 넘어가는 것이다.&lt;br /&gt;'CLOSE_TAG'는 '&gt;'를 재정의 한 것이다. OPEN_TAG는 '&lt;'를 재정의 한 것이다. 태그를 분석하는 단계를 3가지로 분류하여 두었다. if 구문을 보면 알 수 있듯이, CLOSE_TAG, OPEN_TAGE, 그외의 일반 데이타로 분리하여 조건문으로 처리하였다. 1. 처음 시작하자마자 CLOSE_TAG가 나타난다면 태그로서 의미를 가지지 않는 일반 텍스트와 동일하다고 보고 루프의 처음으로 돌아가게 된다. 2. OPEN_TAG가 나타나게 되면 OPEN_TAG 바로 다음에 공백이 나올경우를 위해 skipBlank를 한번더 해주고 실제 태그를 파싱하게 된다. Comment tag같은 경우 모양이 약간 틀리기 때문에 case 구문으로 구분하여 별도 처리하였다. 유효한 태그인지 아닌지는 parseHtmlTag 함수에서 처리하며 유효할 경우는 생성된 태그 클라스를, 그렇지 않으면 널값을 리턴한다. 3. Open 태그가 아닐경우는 Text 데이타로 간주하고 다음 Open Tag가 나타날 때 까지를 파싱하여 결과를 저장해 둔다.&lt;/p&gt;&lt;p&gt;마지막으로 위 3가지 조건을 처리하였을 때 새로 생성된 태그가 있다면 html 클라스에 새로운 태그를 추가한다. 이 역할을 addHtmlTag 함수가 수행하게 된다.&lt;/p&gt;&lt;p&gt;Html을 파싱하는 전체 골격은 위와 같이 아주 간단하다.&lt;br /&gt;그렇다면 Valid, Invalid, Text 태그를 파싱하는 함수들을 살펴보자. &lt;/p&gt;&lt;p&gt;우선 parseHtmlTag 함수이다.&lt;/p&gt;&lt;p&gt;HtmlTag * HtmlParser::parseHtmlTag(char **buf)&lt;br /&gt;{&lt;br /&gt;HtmlTag *ht;&lt;br /&gt;char name[NAME_SIZE+1], *tmp;&lt;br /&gt;int nIdx=0;&lt;/p&gt;&lt;p&gt;// Tag Name이 나오기 전까지의 공백 문자를 무시한다.&lt;br /&gt;skipBlank(buf);&lt;/p&gt;&lt;p&gt;// Tag Name을 저장한다.&lt;br /&gt;// Tag Name은 공백이 나오거나 CLOSE_TAG '&gt;'가 나오거나&lt;br /&gt;// '' 문자가 나올때까지.... 읽어서 저장한다.&lt;br /&gt;*********************************************************/&lt;br /&gt;while(**buf != ' ' &amp;amp;&amp; **buf != ' ' &amp;amp;&amp; **buf != CLOSE_TAG &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;&amp; **buf)&lt;br /&gt;{&lt;br /&gt;// Tag 중간에 새로운 Tag가 시작하면...&lt;br /&gt;if(**buf == OPEN_TAG)&lt;br /&gt;{&lt;br /&gt;tmp = *buf;&lt;br /&gt;(*buf)++;&lt;br /&gt;skipBlank(buf);&lt;br /&gt;if(whatIsTag(*buf) == VALID_TAG)&lt;br /&gt;{&lt;br /&gt;*buf = tmp;&lt;br /&gt;ht = new HtmlTag();&lt;br /&gt;if(!ht)&lt;br /&gt;return NULL;&lt;/p&gt;&lt;p&gt;// 생성된 HtmlTag의 이름을 세팅.&lt;br /&gt;name[nIdx] = '';&lt;br /&gt;ht-&gt;setTagName(name);&lt;br /&gt;ht-&gt;nextHtmlTag = NULL;&lt;br /&gt;return ht;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;*buf = tmp;&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;name[nIdx++] = **buf;&lt;br /&gt;(*buf)++;&lt;/p&gt;&lt;p&gt;// 이름이 NAME_SIZE보다 커질경우 예외처리....&lt;br /&gt;// CLOSE_TAG가 나올때까지.. 무시한다!&lt;br /&gt;if(nIdx &gt;= NAME_SIZE)&lt;br /&gt;{&lt;br /&gt;skipUntilCloseTag(buf);&lt;br /&gt;return NULL;&lt;br /&gt;}&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;ht = new HtmlTag();&lt;br /&gt;if(!ht)&lt;br /&gt;return NULL;&lt;/p&gt;&lt;p&gt;// 생성된 HtmlTag의 이름을 세팅.&lt;br /&gt;name[nIdx] = '';&lt;br /&gt;ht-&gt;setTagName(name);&lt;/p&gt;&lt;p&gt;this-&gt;parseVarVal(ht, buf);&lt;/p&gt;&lt;p&gt;return ht;&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;&lt;p&gt;처음 while 루프에서는 태그의 이름을 잘라내기 위한 부분이다. '&lt;' 다음에 또다시 '&lt;'가 나오는 경우 처리를 위해 한번더 조건문 처리를 해 주었다. while 루프의 조건이 인 경우 ' ' 인 경우 CLOSE_TAG 인경우, NULL인 경우 까지를 잘라낸다. 한 문자씩 잘라내면서 name 배열에 저장하여 두고 만일 태그 명의 길이가 너무 길어지게 되면 태그로 보지 않고 버리게 된다. while 루프가 끝나게 되면 태그명을 제대로 잘라낸 것이다. 이후에 HtmlTag 클라스를 하나 할당 받은후 setTagName 함수로 태그명을 세팅하고 태그의 하위 변수들이 정의되어 있다면 parseVarVal함수를 사용하여 해당하는 변수들을 잘라내고 세팅하게 된다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;다음은 Text 데이타를 파싱하는 함수이다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;HtmlTag * HtmlParser::parseTextData(char **buf)&lt;br /&gt;{&lt;br /&gt;char *begin, *end, *szVal;&lt;br /&gt;HtmlTag *ht;&lt;br /&gt;TagVar *tv;&lt;br /&gt;int nSize;&lt;br /&gt;&lt;br /&gt;skipBlank(buf);&lt;br /&gt;if(**buf &amp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; **buf != OPEN_TAG)&lt;br /&gt;{&lt;br /&gt;begin = *buf;&lt;/p&gt;&lt;p&gt;while((end=getTerm(buf, "&lt;"))) { (*buf)++; skipBlank(buf); if(**buf == '&lt;') continue; if(whatIsTag(*buf) != INVALID_TAG) break; } *buf = end;&lt;/p&gt;&lt;p&gt;if(!begin)&lt;br /&gt;return NULL;&lt;br /&gt;if(!end)&lt;br /&gt;{&lt;br /&gt;szVal = new char [strlen(begin)+1];&lt;br /&gt;if(!szVal)&lt;br /&gt;return NULL;&lt;br /&gt;strcpy(szVal, begin);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;nSize = (unsigned int)(end) - (unsigned int)(begin);&lt;br /&gt;if(nSize &amp;lt; 1)&lt;br /&gt;return NULL;&lt;br /&gt;szVal = new char [nSize+1];&lt;br /&gt;if(!szVal)&lt;br /&gt;return NULL;&lt;br /&gt;strncpy(szVal, begin, nSize);&lt;br /&gt;szVal[nSize] = '';&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// 새로운 태그 추가&lt;br /&gt;ht = new HtmlTag();&lt;br /&gt;if(!ht)&lt;br /&gt;{&lt;br /&gt;if(szVal)&lt;br /&gt;delete szVal;&lt;br /&gt;return NULL;&lt;br /&gt;}&lt;br /&gt;ht-&gt;setTagName("TEXT_DATA");&lt;br /&gt;ht-&gt;nextHtmlTag = NULL;&lt;/p&gt;&lt;p&gt;// 태그에 텍스트 데이터 연결&lt;br /&gt;tv = new TagVar();&lt;br /&gt;if(!tv)&lt;br /&gt;{&lt;br /&gt;if(szVal)&lt;br /&gt;delete szVal;&lt;br /&gt;if(ht)&lt;br /&gt;delete ht;&lt;br /&gt;return NULL;&lt;br /&gt;}&lt;br /&gt;tv-&gt;setVar("TEXT");&lt;br /&gt;tv-&gt;setVal(szVal);&lt;br /&gt;tv-&gt;nextTagVar = NULL;&lt;br /&gt;ht-&gt;addTagVar(tv);&lt;br /&gt;delete szVal;&lt;br /&gt;}&lt;br /&gt;return ht;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;이 함수의 용도는 텍스트 데이타도 하나의 태그로 인식하도록 하기 위한 함수이다.&lt;br /&gt;그래서 태그명을 'TEXT_DATA'로 붙여주고, 실제 데이타를 TEXT_DATA 태그의 한 변수로서 'TEXT'라는 변수를 부여하고 이 변수의 값에 실제 데이타를 넣게 된다.&lt;br /&gt;이러한 복잡한 과정을 거치지 않고 직접 넣어도 무방하겠지만 전체 html 트리를 순회하는 동안 모든 태그들을 HtmlTag라는 클라스 하나로 제어하기 위해 이런방식으로 통일하였다.&lt;br /&gt;함수 내부에서 특이할 만한 사항은 택스트 태그가 종료되는 시점은 html 문자열의 끝이나 OPEN_TAG가 나타나는 시점이라는 것이다. while 루프 안에서 이러한 위치를 찾은 후&lt;br /&gt;실제 태그를 parseHtmlTag와 같은 방식으로 추가해 주게 된다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;여기까지 파싱 방법이나 소스상에 중요한 부분에 대한 설명을 마치도록 하겠다.&lt;br /&gt;세부 내용은 실제 소스를 자료실에 올려 놓을 예정이니 참고하기 바란다.&lt;br /&gt;필자는 로봇 프로그램을 작성할 때 이 소스를 개선하여 html 파싱을 전담하도록 하였다.&lt;br /&gt;성능은 그리 빠른 편은 아니나 앵커를 추출하거나 기타 부가 정보를 추출할 때 아주 쉽게 구현 할 수 있었다.&lt;br /&gt;무엇보다 기존 모듈이나 소스를 파악해서 내 것으로 소화하는 것보다 내 맘대로 만든 것이라 내맘대로 조작하는데 편해서&lt;br /&gt;html 파싱에 관련한 부분이 필요하면 이 소스를 응용하고 있다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;이 프로그램은 사실 최적화 된 것이 아니며 여러 부분에서 성능 개선의 여지가 있다.&lt;br /&gt;이런 것은 개발자들이 실제 사용하면 해결해 보는 것도 재미있을 것 같다. ^_^&lt;br /&gt;끝.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;==============================================================================================&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;오늘 강좌는 여기서 끝내겠습니다.&lt;br /&gt;이론과 소스를 설명하려니 꽤 양이 많아졌습니다. 첨부터 훓어보니 사실 그리 많은 내용이 아닌듯 하긴 하네요...&lt;br /&gt;물론 버그도 있습니다~ ^_^; 알아서 해결해 보시길..&lt;/p&gt;&lt;p&gt;그럼 좋은 하루 되세요~&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-695554364376163523?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/695554364376163523/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=695554364376163523' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/695554364376163523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/695554364376163523'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/ir_14.html' title='웹 로봇 2 - HTML Parser'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ECA08t3QSQ0/RsEgTjE2nAI/AAAAAAAAABg/vSEFvxW4cAo/s72-c/1111.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-1448181499923640201</id><published>2007-08-14T03:29:00.000+09:00</published><updated>2007-08-14T03:32:45.544+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='검색 엔진'/><title type='text'>웹 로봇 1 - 개요</title><content type='html'>&lt;a href="http://irgroup.org/"&gt;IR 그룹&lt;/a&gt;의 하얀 눈길 님께서 작성하신 글입니다.&lt;br /&gt;&lt;br /&gt;원문은 &lt;a href="http://irgroup.org/zb5/trackback.php?article_srl=4287"&gt;여기&lt;/a&gt;를 누르시면 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;웹 로봇에 대한 강좌를 시작하겠습니다.&lt;br /&gt;대용량 웹문서 수집용 분산처리 로봇을 구현 하려면 사실 많은 부분에서 어려움이 있습니다. 필요한 장비도 없는 실정이네요.. T.T 그래서 최종 목표를 멀티쓰래드를 활용한 기본적인 로봇구현으로 정하겠습니다.차근차근 한단계씩 밟아가 보지요...&lt;br /&gt;&lt;br /&gt;강의 계획은 다음과 같습니다.&lt;br /&gt;1. 개요&lt;br /&gt;2. html 기본구조 및 파서 작성&lt;br /&gt;3. http 구조&lt;br /&gt;4. 로봇 배제표준&lt;br /&gt;5. 기본 라이브러리 작성 - 동적 array, tree, trie, socket, thread&lt;br /&gt;6. 소켓 타임아웃에 대하여&lt;br /&gt;7. single thread robot&lt;br /&gt;8. multi thread robot&lt;br /&gt;9. 대용량 처리를 위한 자료구조 제안&lt;br /&gt;&lt;br /&gt;적어보니 꽤 양이 많네요...한달 분량은 되지 않을까 싶습니다.&lt;br /&gt;프로그램 부분은 리눅스에서 gnu c++을 사용할 예정입니다. 문제는 제가 장비가 없네요.. T.T실제 돌려보지는 못하고.. 있는 소스를 설명하는 수준으로 진행하겠습니다.물론 예전에 잘 돌던 프로그램이구요~ ^_^&lt;br /&gt;&lt;br /&gt;각설하고...강의를 시작하겠습니다.&lt;br /&gt;&lt;br /&gt;==================================================================================================웹 로봇을 개발하자!&lt;br /&gt;&lt;br /&gt;1. 개요&lt;br /&gt;검색엔진에서 말하는 로봇이란 다음과 같이 정의할 수 있다.&lt;br /&gt;&lt;br /&gt;컴퓨터를 사용하여 주기적, 비 주기적으로 데이타를 능동적으로 수집하는 자동화된 프로그램.&lt;br /&gt;&lt;br /&gt;여기서 "수많은 정보"들은 단순한 HTML문서가 될 수도 있고, XML, 워드문서, 이미지, 멀티미디어 정보, DB 데이타등도 포함된다. "주기적, 비주기적"이란 말은 로봇이 특정 대상을 지속적으로 감시하면서 데이타를 수집할 수도 있고, 그렇지 않을 수도 있다는 것이다. "능동적으로 수집"한다는 의미는 어떤 정보로부터 새로운 정보를 얻어내어 연관된 다른 정보를 스스로 찾아다닌다는 것을 말한다.&lt;br /&gt;한가지 예를 들면, 매체사로부터 뉴스기사를 전송받아 DB에 저장하는 데몬이 있다고 하자. 이러한 녀석도 데이타를 수집하기 위한 장치임에 분명하나 로봇이라 부르지 않는다. 이유는 매체로부터 전송된 데이타를 수동적으로 받는 입장이며, 새롭게 받은 데이타에서 추가적인 정보를 유추해 내어 새로운 정보를 찾아내지도 않는다. 물론 로봇도 새로운 정보를 찾지 않고 이미 입력된 몇몇의 시드만을 사용하여 데이타를 수집하도록 할 수 있다. 그렇더라도 수집의 주체인 로봇 자체가 능동적으로 해당 데이타를 찾아가서 전송받게 된다는 것이 위의 예와는 차이라 볼 수 있다. IE와 같은 웹브라우져도 넓은 의미에서는 로봇이라 볼 수 있다. 보통은 agent라는 용어를 쓰기도 하지만 브라우져 또한 로봇과 다를게 없다. 위 의미에 맞춰 생각해보면 이해할 수 있으리라 본다.&lt;br /&gt;&lt;br /&gt;위 의미를 좀더 확장하여 웹로봇을 정의하면 다음과 같이 말할 수 있겠다. 인터넷상에 존재하는 수많은 정보들을 주기적 또는 비 주기적으로 수집하는 자동화된 프로그램.&lt;br /&gt;&lt;br /&gt;위 정의의 의미는 로봇은 로봇인데 특정한 DB에 직접 접속하여 정보를 수집하는 것이 아니라 인터넷을 사용하여 인터넷 상에 존재하는 정보를 수집하는 로봇을 웹로봇이라고 보겠다는 것이다.&lt;br /&gt;얼마전 필자는 로봇과 크롤러, 에이전트의 차이점에 대한 질문을 받은 적이 있다. 솔직히 세분하자면 용어를 사용한 사람들의 말을 직접 들어 봐야 할 것이다. 그러나 일반적인 통념상 로봇, 크롤러, 에이전트, 게더러 등등은 동일한 말이라 봐도 무방할 것이다. 단지 세분화 한다면 인터넷의 데이타를 수집하는 것은 웹로봇, 웹크롤러 등등으로 말하고 DB정보를 수집하는 것을 DB 로봇, DB 크롤러등으로 명명하는 것이 보통이다.&lt;br /&gt;&lt;br /&gt;* 다음은 "효율적인 웹 로봇의 설계 및 구현에 관한 연구" 1997. 심해청 학위논문에서 발취한 내용이다. 웹로봇의 필요성에 대한 간략한 설명이라고 보면 되겠다.&lt;br /&gt;하루가 다르게 변하는 정보화 사회에서 인터넷이라는 거대한 공간 속에서 노아의 홍수와 같은 엄청난 정보가 넘쳐나고 있다. 이러한 정보의 홍수 속에서 사용자가 원하는 정보를 찾는다는 것은 모래사장에서 바늘 찾기 보다 더 어렵다. 검색도구는 이렇게 찾기 힘든 정보를 쉽게 찾을 수 있도록 도와주는데 큰 도움을 주고 있으며 그 위치는 하루가 다르게 높아가고 있다. 그래서 인터넷 상에는 많은 검색 도구들이 등장하고 있다. 이러한 검색 도구들은 수동, 또는 웹로봇을 이용하여 자동으로 정보를 수집하는데 지금은 거의 웹 로봇을 사용하고 있다.그러나 대부분 상업적인 목적으로 인하여 그 기술이나 특징에 대해 공개되지 않아 검색 도구의 특징을 보고 어림잡을 뿐이다. 검색 도구들은 보통 정보를 수집하기 위한 웹 로봇(Web Robot, Robot agent)과 수집되 자료에서 정보를 검색하는 검색엔진 부로 이루어져 있다.검색엔진부는 정보검색이라는 분야로서 많은 연구가 이루어져 있으나 웹로봇은 그다지 맣은 연구가 이루어지지 않았다. 또한 이러한 웹로봇은 쉽게 작성할 수 있다는 이유로 아주 작은 부분으로 취급되어 지기도 한다. 그러나 검색엔진부는 수집된 자료가 있어야만 수행되어질 수 있으며 수집된 자료가 빈약할 경우 당연히 서비스의 질이 떨어지게 된다. 그러므로 웹 로봇의 위치는 아주 중요한 위치에 있는 것이다.&lt;br /&gt;&lt;br /&gt;* 웹로봇의 구성요소&lt;br /&gt;웹로봇에는 HTML 파서, HTTP 프로토콜, 소켓, 쓰래드, 대용량 데이타 저장 구조 등이 필요하다. HTML 파서는 html안에서 새로운 url을 추출하여 반복적인 데이타 수집을 하기 위해 필요하다. 웹로봇용으로 쉽게 파서를 구현하려면 strstr함수를 사용하여 href만 찾아내어 문자열을 짤라내어 버리면 된다. html 구조 자체가 간단하다 하더라도 초보자가 html 파서를 제작하는 것은 조금 버거운 일일 수 있다. 그래서 많은 프로그래머들이 공개된 소스나 모듈들을 많이 사용하고 있다. 그러나 이 강의에서는 html 파서를 직접 제작할 것이다. 누누히 강조하지만 원리를 모르는 상태에서 있는 모듈을 쓰기만 하는 프로그래머는 프로그래머가 아니다. 단지 코더일 뿐이다. HTTP 프로토콜은 웹로봇 자체가 인터넷의 정보를 수집하는 기능이기 때문에 반드시 필요한 것이다. 이 프로토콜도 아주 잘 만들어진 오픈소스나 모듈들이 많이 있다. 그러나 만들것이다. ^_^; 소켓은 HTTP프로토콜 자체가 tcp/ip기반으로 동작하는 프로토콜이므로 반드시 필요한 부분이다. tcp/ip에 대해서는 본 강의 범위를 넘어서게 되므로 관련 책자를 참고하기 바란다. 이 강의에서는 소켓라이브러의 사용법과 멀티 쓰래딩 시의 타임아웃 처리에 대해 집중적으로 다룰 것이다. 쓰래드는 고속 처리를 위해서는 반드시 사용해야 할 구조이다. 웹로봇의 특성상 수천만건의 데이타를 빠른 시일안에 수집하기 위해서는 단일 쓰래드로는 무리가 있다. 만일 단일 쓰래드로 로봇을 만든다면 하루종일 데이타를 수집해도 10000~30000개의 문서를 수집하기도 힘들 것이다. 대용량 데이타 저장구조는 소량의 데이타를 수집할 목적의 로봇이라면 필요치 않다. 그러나 웹로봇의 경우는 앞서말한 모든 기술적 이슈보다도 오히려 큰 문제로 대두된다. 웹로봇 수행시간에서 가장 많은 시간을 소모하는 것이 url을 저장하고 관리하는 부분이다. 보통 천만개의 문서를 수집한다면 처리해야 할 url의 개수는 적개는 수억에서 많게는 수십, 수백억개의 url이 될 수 있다. 이는 개수 뿐만이 아니라 용량에도 아주 많은 영향을 받게 된다. 본 강의에서는 대용량 데이타 저장구조에 대한 제안을 하는 것으로 가름하고 실제 구현은 여러분에게 맡기겠다.(이 부분의 소스는 공개되면 안되는 이유가 있어서.. 양해바란다.) 참고로 대량의 데이타를 처리할 경우는 DB를 사용하지 않기를 권한다.&lt;br /&gt;&lt;br /&gt;=================================================================================================두서없이 적은 글이라 많이 어지럽네요...오류나 문제제기 할 것이 있으면 사소한 것이라도 질문하시기 바랍니다.&lt;br /&gt;&lt;br /&gt;그럼 좋은 하루 되세요..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-1448181499923640201?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/1448181499923640201/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=1448181499923640201' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/1448181499923640201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/1448181499923640201'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/1_14.html' title='웹 로봇 1 - 개요'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-3779435317451790939</id><published>2007-08-13T22:26:00.000+09:00</published><updated>2007-08-13T22:30:04.545+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='검색 엔진'/><title type='text'>검색 엔진 5 - 검색기 구조</title><content type='html'>&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em"&gt;&lt;a href="http://irgroup.org/"&gt;IR 그룹&lt;/a&gt;의 하얀 눈길 님께서 작성하신 글입니다. &lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em"&gt;원문은 &lt;a href="http://irgroup.org/zb5/trackback.php?article_srl=4287"&gt;여기&lt;/a&gt;를 누르시면 볼 수 있습니다. &lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em"&gt;참고로 그림은 원문에서 찾을 수 없어서 이미지 검색을 통해서 얻은 그림으로 대치되었습니다. 따라서 원래 이미지와 맞지 않는 쌩뚱맞는 것일수도 있지만, 읽어본 결과 맞는 것 같습니다. &lt;/div&gt;&lt;p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em" align="center"&gt;&lt;img src="http://docs.google.com/File?id=ddvzq6wf_19gj7x83gc" /&gt;&lt;/p&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em"&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;왼쫀 아래에 보면 dic(사전)들이 있습니다. 이것은 형태소분석기에서 사용하는 사전으로 색인시에 사용했던 사전들과 동일한 구조로 되어 있는 것이 바람직합니다. 물론 서비스 구성에 따라 형태소분석기 세팅 자체를 서로 다르게 할 수도 있습니다. 바로 옆에 있는 시소러스 사전은 별도로 동작하게 할 수도 있으나 대부분 형태소 분석기에서 사전과 같이 처리하는 것이 일반적인 예입니다. 이런 시소러스사전류는 검색시 입력되는 질의를 확장한다거나 할 경우 많이 사용됩니다. &lt;/p&gt;&lt;p&gt;여기서 질의를 확장한다라는 의미는 뭘까요? 쇼핑몰 검색을 예로 봅시다. 어떤 구매자가 나이키의 조깅화를 구입하려 하는데 갑자기 조깅화란 단어가 떠오르지 않는다면 어떤식으로 질의를 입력 할까요? 보통 나이키, 아니면 운동화 정도로 우선 검색을 할 것입니다. 이때 운동화라는 개념을 좀더 확장하여 조깅화, 런닝화, 축구화, 등등의 키워드들을 추가하여 검색하게 된다면 보다 쉽게 최종 결과에 도달할 수 있을 것입니다. 단, 부적절한 질의확장은 검색성능이나 결과 개수에 악영향을 미칠 수 있으므로 많은 연구가 필요할 것입니다. 당연히 시소러스 사전 자체도 서비스에 맞게 잘 구성되어 있어야 합니다. &lt;/p&gt;&lt;p&gt;다음으로.. 바로옆에 있는 index db는 색인기가 만들어 놓은 색인 정보들입니다. 이전 강좌에서 설명했던 내용이니 확인해 보시면 될 것이구요.. 다른것 하나는 term cluster dic인데 검색 엔진의 기본기능이 아닌 관계로 넘어가겠습니다. ^_^; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;사용자가 검색질의 엔진에 던지게 되면 방식은 여러가지가 있습니다. 물론 서비스를 구성하는 것에 따라 방법이 달라지게 되구요. 많이 쓰이는 것들은 인터넷 검색엔진들이 되겠지요. 보통 CGI를 통해 질의를 받아서 CGI가 엔진으로 전달하고 결과를 받게 됩니다. &lt;/p&gt;&lt;p&gt;엔진에서 클라이언트 API를 제공하거 어떤 프로토콜을 제공해 준다면 윈도용 어플리케이션에서도 결과를 받아볼 수 있겠지요. 어차피 소켓통신을 하는 데몬이기에 프로토콜만 알게 되면 어떠한 응용 프로그램에서도 엔진과 바로 맞붙어서 데이타를 주고 받을 수 있습니다.(당연하겠지요?) 그래서 이런 경우에는 client api, activeX 콘트롤, 일반 APPs, 관리도구 등에서 다양하게 접속하여 엔진의 결과를 받을 수 있습니다.&lt;span style="FLOAT: right; WIDTH: 1px; HEIGHT: 1px"&gt;&lt;/span&gt; &lt;/p&gt;&lt;p&gt;그러나 검색포탈이나 SI업체들의 검색엔진은 프로토콜을 공개하지 않습니다. 이유는 당연하겠지요. 네이버가 검색 프로토콜을 공개한다면 하루에도 수십번 해킹을 당할 수 있을 것입니다. 하지만 검색엔진을 직접 개발하는 한 그룹내에서는 이런한 프로토콜을 공개하는 것이 개발시 도움이 될 수 있습니다. &lt;/p&gt;&lt;p&gt;아무튼, 클라이언트에서 입력된 검색질의는 엔진에서 받아들이게 되면 맨 처음 질의분석기(Query Analayzer)라는 녀석이 받아들입니다. 그래서 유효한 검색질의인지, 유효하다면 엔진이 이해할 수 있는 방식으로 검색질의를 파싱한 후 어떤식으로 검색을 수행할지, 어떤 필드에서 검색을 할지, 키워드를 확장할지 등등을 결정하게 됩니다. &lt;/p&gt;&lt;p&gt;결정이 되면 바로 연산기(calculator)로 파싱된 질의를 전달하여 질의에 대한 연산을 수행합니다. 이때 연산기는 자연어처리모듈, 논리연산 처리모듈, 숫자처리 모듈들을 내장하여 검색옵션에 맞게 결과를 계산하게 됩니다. &lt;/p&gt;&lt;p&gt;연산기가 계산대상이 되는 데이타를 먼저 로딩하기 위해 파싱된 텀별로 index DB의 데이타를 읽기 위해 Retriever에게 질의를 던지게 되면 Retriever는 필요한 정보들을 index DB에서 로딩하여 연산기로 전달해 줍니다. &lt;/p&gt;&lt;p&gt;연산기가 모든 연산을 마치게 되면 결과는 순위화된 문서들의 일련번호와 문서들의 랭킹점수등이 남게 됩니다. 이러한 내용들을 Stream Generator로 전달하게되고 Stream Generator는 최종 사용자가 확인할 수 있는 결과(제목, 본문, URL, 기타 부가정보등등)를 만들어서 다시 질의분석기 에게 돌려주게 됩니다. &lt;/p&gt;&lt;p&gt;그러면 질의분석기는 정해진 프로토콜에 맞게 Stream을 정리하여 클라이언트에 전달하게 되고 최종 검색결과를 클라이언트에서 마음대로 조작한 후 보여지게 됩니다. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;그림에서 오른쪽에 Summary Server와 Log Server가 있습니다. 후자는 일반검색엔진과는 별 상관이 없는 부분입니다. Summary Server는 보통 검색엔진 내에 요약정보를 따로 두는 경우가 많습니다. 그러나 대용량 데이타일 경우는 요약정보가 하나의 서버에 같이 존재하게 되면 Disk I/O문제도 발생할 수 있으며 여러가지 성능에 안좋은 영향을 미칠 수 있으므로 위와 같이 요약서버 자체를 분리하여 구성할 수도 있습니다. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;이상 간단한 검색기 구조였습니다. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-3779435317451790939?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/3779435317451790939/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=3779435317451790939' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/3779435317451790939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/3779435317451790939'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/dic.html' title='검색 엔진 5 - 검색기 구조'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-927615414161588770</id><published>2007-08-13T22:13:00.000+09:00</published><updated>2007-08-13T22:19:27.292+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='검색 엔진'/><title type='text'>검색 엔진 4 - 색인기 구조</title><content type='html'>&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; align: "&gt;&lt;a href="http://irgroup.org/"&gt;IR 그룹&lt;/a&gt;의 하얀 눈길 님께서 작성하신 글입니다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; 원문은: " article_srl="'4287"&gt;참고로 그림은 원문에서 찾을 수 없어서 이미지 검색을 통해서 얻은 그림으로 대치되었습니다.따라서 원래 이미지와 맞지 않는 쌩뚱맞는 것일수도 있지만, 읽어본 결과 맞는 것 같습니다.&lt;/div&gt;&lt;p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; 원문은: " align="center" article_srl="'4287"&gt;&lt;img src="http://docs.google.com/File?id=ddvzq6wf_16f9r6kpjp" /&gt;&lt;/p&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; 원문은: " article_srl="'4287"&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;우선 색인 대상 데이타로 HTML, DB, W/P용 문서들, 기타 등등 Text-base의 모든 데이타는 색인 대상이 될 수 있습니다. 이러한 데이타를 검색엔진(특히 색인기)이 인지하려면 각각의 포맷을 알야아 할 것입니다. 그래야 필요한 정보를 추출할 수 있겠지요. &lt;/p&gt;&lt;p&gt;어제는 그러한 부분은 Dumper라고 간략히 말씀드렸읍니다. 이녀석을 오늘은 좀 다른말로 표현해보지요. 여기서는 Document Recognizer(문서 인식기)라고 표현하였습니다.&lt;br /&gt;물론 인터넷 어디를 뒤져봐도 이런 용어를 찾기 쉽지 않을 거구요. ^^;&lt;br /&gt;이녀석의 역할을 각각의 문서 포맷별로 필터를 가지고 있어서 해당 문서를 정확히 분석하여 F-TXT를 생성하는데 있습니다. 여기서 F-TXT는 검색엔진이 이해할 수 있는 형식화된 텍스트 문서입니다. 만일 색인기가 F-TXT형식으로 XML을 사용하겠다면 색인기는 XML파서만 있으면 되겠지요? 이런 경우라면 Document Recognizer는 각각의 문서들을 분석하여 XML로 재구성한 후 저장해 둘 것입니다.&lt;br /&gt;일반적인 엔진들은 Document Recognizer를 필요에 의해서 간단한 프로그램을 작성하기도 합니다. F-TXT의 형식은 정해질 지라도 검색 대상 문서들의 포맷을 모두 지원하지 못하기 때문에 서비스를 구성할 때 간단한 프로그램으로 색인 대상 데이타를 F-TXT로 변환합니다. 결국 색인기는 F-TXT라는 형식만 인식하는 구조로 작성하고 Document Recognizer를 서비스 개발자가 직접 작성하게 하면 아주 유연한 엔진이 될 수 있을 것입니다. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;다음은 F-TXT의 구성 예입니다. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;DOCID : 1 &lt;/p&gt;&lt;p&gt;TITLE : 정보검색시스템이란 무엇인가. &lt;/p&gt;&lt;p&gt;BODY : 정보검색이란... 어쩌구저쩌구.. 지화자 좋구나.... &lt;/p&gt;&lt;p&gt;DATE : 20040520 130222 &lt;/p&gt;&lt;p&gt;SIZE : 3428 &lt;/p&gt;&lt;p&gt;URL :http://내도메인/data/ir.html &lt;/p&gt;&lt;br /&gt;&lt;p&gt;위 예는 간단한 예일 뿐입니다. 엔진 구성하는 사람의 마음이죠. ^^; &lt;/p&gt;&lt;p&gt;F-TXT가 만들어 지면 F-TXT 파서는 퍼블리슁이 필요할 경우 HTML Generator에게 파싱된 데이타를 전달하여 서비스 페이지를 만들게 됩니다. 또한 index Generator에게도 파싱된 데이타를 전달하여 실제 색인을 하도록 도와줍니다. 결국 핵심이 되는 것은 index Generator로서 이 녀석이 모든 색인DB를 생성하고 화일들을 관리하게 되지요. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Index Generator는 형태소분석기를 내장합니다. 물론 형태소 분석기는 여러가지 사전을 가지고 있어서 이런 사전정보와 경험정보, 규칙들을 사용하여 형태소 분석을 수행합니다. 형태소분석기를 사용하는 이유는 이전 강좌에서 간단히 말씀드렸던것&lt;span style="FLOAT: right; WIDTH: 1px; HEIGHT: 1px"&gt;&lt;/span&gt; 같네요.. 다시 말하자면 한국어 특성을 고려한 색인어를 추출하기 위함입니다. 물론 형태소분석기가 없더라도 색인어는 추출할 수 있습니다. 또한 어떤 경우는 형태소분석기가 오히려 색인어를 제대로 추출하지 못하는 경우도 있습니다. 그러나 여기서 보여드리는 색인구조는 국내의 엔진들이 일반적으로 사용하는 구조를 말씀드리는 것이구요. 아무튼.. 색인기는 형태소분석기를 통해 색인어를 추출하고 추출된 색인어를 기반으로 역화일을 생성합니다. 그리고 최종 요약정보도 생성하고 색인 과정을 마치게 됩니다. 이때 생성되는 화일들이 mapping table, term(keyword) trie, posting file, summary file 등입니다. 여기서 term trie와 posting화일을 역화일구조로 작성하게 됩니다. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;위의 F-TXT 예를 기초로.. 검색서비스를 구성할 때 title에서만 검색, body에서만 검색, 날짜구간 검색 등의 검색서비스를 구축할 수 있을 것입니다. 이때 title, body, 날짜등은 별도의 역화일로 구성하면 의미상 명확할 뿐 아니라 검색효율을 상당히 높일 수 있습니다. 이유는 필터링을 할 필요가 없기 때문인데요.. 이렇게 구성하게 될 때 사용자가 title에서만 검색하는 명령을 내리게 되면 엔진에서는 title 필드에 해당하는 역화일을 찾아갈 수 있어야 합니다. 이런 부분을(title은 몇번째 역화일이다 라고 하는) 명시하는 것이 mapping table입니다. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;term(keyword) trie는 index Generator가 생성한 모든 term(keyword)들을 트리형태로 표현하고 있는 색인 정보 입니다. 엔진마다 b-tree, b+ tree, trie, p tree등 다양한 방법을 사용합니다. 성격에 맞는 자료구조를 사용하면 되겠네요.. term trie는 posting file의 offset을 가지고 있어서 어떤 term이 나타난 문서들의 목록을 posting화일로 찾아가 구할 수 있도록 합니다. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;posting화일은 문서들의 목록을 가지는 화일입니다. 단순히 문서번호를 나열해 둔 화일로서 term-trie에서 이 화일을 참조하여 문서목록을 가져옵니다. 여기서 문서목록이란 쉽게 생각하면 검색결과 목록이 될 수 있습니다. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;summary file은 요약화일로서 검색결과를 화면에 보여줄 대 화면에 출력 가능한 데이타들을 모아둔 화일입니다. 쉽게 구성한다면 F-TXT를 그대로 사용해도 무방하겠지요. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;그외의 모듈들은 사실 반드시 필요한 모듈들은 아닙니다. 필요에 의해 만들어 둘수도 있는 모듈들이라 설명은 하지 않겠습니다. &lt;/p&gt;&lt;p&gt;이상 간단한 색인기 구조였습니다. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-927615414161588770?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/927615414161588770/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=927615414161588770' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/927615414161588770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/927615414161588770'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/html-db-wp-text-base.html' title='검색 엔진 4 - 색인기 구조'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-2317765947818391326</id><published>2007-08-13T22:03:00.000+09:00</published><updated>2007-08-13T22:04:41.975+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='검색 엔진'/><title type='text'>검색 엔진 3 - 검색 엔진 구조도</title><content type='html'>&lt;a href="http://irgroup.org/"&gt;IR 그룹&lt;/a&gt;의 하얀 눈길 님께서 작성하신 글입니다.&lt;br /&gt;&lt;br /&gt;원문은 &lt;a href="http://irgroup.org/zb5/trackback.php?article_srl=4287"&gt;여기&lt;/a&gt;를 누르시면 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;참고로 그림은 원문에서 찾을 수 없어서 이미지 검색을 통해서 얻은 그림으로 대치되었습니다.&lt;br /&gt;따라서 원래 이미지와 맞지 않는 쌩뚱맞는 것일수도 있지만, 읽어본 결과 맞는 것 같습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;골치아픈 검색 모델을 잠시 접어두고 일단 시스템 구조가 어떻게 되어 있는지 구경해 보도록 하겠습니다. 아주 일반적인 사항이므로 대부분의 검색엔진들이 이러한 모양새를 갖추고 있다고 보면 되겠네요.&lt;br /&gt;&lt;br /&gt;단, 아래 그림의 저작권은 제게 있으므로 함부로 도용하지 마시길..&lt;br /&gt;=============================================================================&lt;br /&gt;검색엔진 구조도&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: center"&gt;&lt;img src="http://docs.google.com/File?id=ddvzq6wf_14hkj7tzpq" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;그림의 좌측을 보면 index target이 있습니다. 여기에는 html, 상용DB, 일반문서, 기타 여러 형식의 문서들이 존재할 수 있습니다. 이중 html문서들은 일반적으로 웹로봇을 통해 수집합니다. index target을 검색엔진이 색인하여 검색서비스를 제공하기 위한 기본 데이타들입니다.&lt;br /&gt;index target들은 특정한 필터들을 통해 검색엔진에서 인지할 수 있는 일반적인 형태의 텍스트 문서로 변환합니다. 저는 이러한 작업을 하는 녀석을 dumper라고 이름 붙였습니다. 이 dumper가 각 문서의 형식에 맞는 필터들을 가지고 있어서 html은 html parser를 호출해서 F-TXT를 만들고 doc는 doc 필터를 통해, hwp는 hwp 필터를 통해 F-TXT를 만듭니다.&lt;br /&gt;F-TXT는 형식화된 문서라는 의미로 formated-text라고 불렀습니다. F-TXT가 생성되고 나면 비로소 검색엔진의 색인 시스템이 인식할 수 있는 기본 문서들이 완성된 것입니다.&lt;br /&gt;물론 F-TXT 로 변환하지 않고 색인기가 직접 필터를 가지고 문서들을 분석하여 색인할 수 있습니다. 이것은 단순히 구현의 차이이지요.&lt;br /&gt;아래에 있는 스케쥴러는 주기적으로 변경되는 문서들을 색인하기 위한 것입니다. 웹문서라면 보통 보름에서 한달, 다른 컬렉션의 경우 서비스 용도에 맞게 하루 또는 여러방식으로 색인 주기를 설정할 수 있겠지요. 이런 작업을 스케쥴러가 총괄하게 될 것입니다.&lt;br /&gt;Indexer에서 빼 놓을 수 없는 것이 형태소분석기입니다. 물론 형태소분석기가 없다고 하더라고 검색엔진 구성은 가능합니다. 색인 텀(term, 키워드)을 어떻게 생성할 것인가에 따라 형태소 분석기는 사용될 수도 있고 아닐 수도 있습니다. 한글 정보검색시스템에서는 형태소분석기에 따라 성능차이가 많이 나기 때문에 거의 대부분 선호하고 있습니다.&lt;br /&gt;indexer는 형태소분석기를 통해 색인 텀을 생성하고 생성된 텀에 대해 문서번호와 함께 특수한 자료구조로 저장합니다. 보통 index db라고 쉽게 말하기도 하는데요. 역화일(도치 파일이라고도 합니다)이라는 구조로 색인 정보들을 저장합니다.&lt;br /&gt;이렇게 역화일에 분석되어 저장된 문서는 검색기에 의해 검색이 이루어집니다.&lt;br /&gt;&lt;br /&gt;색인기 부분을 보면 cache generator라는 것이 있습니다. 이것은 특수한 검색질의 같은 경우 연산시간이 너무 오래 걸릴 수 있기 때문에 미리 캐쉬로 만들어 두면 아주 좋은 속도를 낼 수 있습니다. 그래서 이런 모듈을 사용하여 캐쉬정보를 생성합니다. 캐쉬는 다양한 방법으로 구현할 수 있습니다만 보통 정적색인컬렉션이라면 웹서버에 검색결과 페이지 자체를 미리 만들어 두는 방법이 유용합니다.&lt;br /&gt;로그서버는 검색어로깅 및 시스템 로깅을 위해 사용합니다.&lt;br /&gt;요약서버는 별도로 구성하는 경우는 드믈며 색인기에서 역화일을 생성하면서 같이 만들어 두고 검색기에서 직접 읽는 방법을 많이 씁니다.&lt;br /&gt;저같은 경우 위 그림을 만들면서 실험적으로 요약서버를 분리하여 테스트해 봤습니다.&lt;br /&gt;생각외로 성능이 좋았습니다. 이유는 역화일과 요약정보가 하나의 서버에 존재하게 되면 disk i/o 버틀렉이 발생하여 역효과를 발생시켰었습니다. 그래서 서버를 분리하여 이 부분을 해소했었습니다.&lt;br /&gt;&lt;br /&gt;위 그림은 일반적인 엔진의 모습이며 실제 응용에 들어가게 되면 많은 부분이 달라질 수 있습니다. 서비스별로 특수한 엔진을 만드는 것이 바람직하기 때문에 위 내용이 반드시 정답이라고 할 수는 없네요.&lt;br /&gt;&lt;br /&gt;끝.&lt;br /&gt;==============================================================================&lt;br /&gt;&lt;br /&gt;시간이 나는대로 검색기, 색인기, 로봇, 요약서버 등등의 각 구조를 올려보겠습니다.&lt;br /&gt;제가 글재주와 말주변이 없어서 설명에 자신은 없군요.&lt;br /&gt;&lt;br /&gt;질문은 되도록 쉬운걸로... 오류는 반드시 지적을...&lt;br /&gt;&lt;br /&gt;그럼 오늘도 한단계 앞으로 나아가시길..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-2317765947818391326?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/2317765947818391326/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=2317765947818391326' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2317765947818391326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2317765947818391326'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/ir.html' title='검색 엔진 3 - 검색 엔진 구조도'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-7156901473791205920</id><published>2007-08-13T21:28:00.001+09:00</published><updated>2007-08-13T21:46:39.791+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='검색 엔진'/><title type='text'>검색 엔진2 - 검색 기법</title><content type='html'>&lt;a href="http://irgroup.org/"&gt;IR 그룹&lt;/a&gt;의 하얀 눈길 님께서 작성하신 글입니다.&lt;br /&gt;&lt;br /&gt;원문은 &lt;a href="http://irgroup.org/zb5/trackback.php?article_srl=4287"&gt;여기&lt;/a&gt;를 누르시면 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;드디어.. 5개월만에 새로운 글을 쓰게 되었습니다.&lt;br /&gt;회사 이직과 맞물려 너무 정신이 없었습니다.바쁘다는 핑계로.. 이렇게 소홀하게 되다니...&lt;br /&gt;==============================================================================&lt;br /&gt;검색 기법&lt;br /&gt;다음은 BELKIN, NICHOLAS J.and CROFT, W. BRUCE,"Retrival Techniques," ARIST, 22(1987), PP. 109-145 에서 발취한 내용들이다.&lt;br /&gt;BELKIN, NICHOLAS J.and CROFT, W. BRUCE등에 의해 제안된 검색기법의 분류방법&lt;br /&gt;+-- Exact match&lt;br /&gt;+-- Partial match --+-- Individual --+--- Structure-based&lt;br /&gt;                                   +-- Network +--- Feature-based&lt;br /&gt;&lt;br /&gt;1. Exact match techniques(완전일치 기법)&lt;br /&gt;검색된 도큐먼트들의 표현(representation)이 질문의 표현과 완전하게 일치된 것만 검색하는 방식이다. 초창기 대규모 검색시스템들에서 대부분 사용하던 방식이다. 이런 방법의 적용 예로는 불리언 검색, 전문검색, 스트링검색등이 있다.&lt;br /&gt;단점으로는 다음과 같은 것들이 지적되어 왔다.&lt;br /&gt;1) 이용자의 질의에 부분적으로 일치되는 경우의 텍스트들이 그 유용성에도 불구하고 검색에서 누락되는 예가 많다.&lt;br /&gt;2) 검색된 텍스트들에 대한 적절성의 순위를 정하지 못한다.&lt;br /&gt;3) 질문 및 텍스트 내에 존재하는 상호관련성이 있는 중요개념들을 전혀 고려하지 않는다.&lt;br /&gt;4) 질문의 논리적 형성과정이 까다롭다.&lt;br /&gt;5) 이용자의 질의 표현과 텍스트의 표현 비교가 오직 동일어휘로만 한정되어 있다.&lt;br /&gt;&lt;br /&gt;이러한 단점에도 불구하고 초창기 많이 쓰이게 된 이유는 다음과 같다.&lt;br /&gt;1) 검색기법을 변경하는데 드는 비용이 너무 많기 때문에 비경제적이다.&lt;br /&gt;2) "exact match"기법이외의 대체기법들을 아직까지 대규모 시스템 환경에서 운영(테스트)해 본적이 없다.&lt;br /&gt;3) 그러한 대체 기법들 조차도 실험적인 시스템 환경에서 테스트해 본 결과 그다지 만족스러운 것이 아니었다.&lt;br /&gt;4) 이용자의 정보요구나 질의를 표현하는데 있어서 블리안 기법이 비교적 우수하다고 볼 수 있다.&lt;br /&gt;그러나 현재 진보된 검색시스템들을 보게되면 위의 3,4번에 대한 이유가 무색해 진다. 현재 사용되고 있는 대부분의 상용 검색엔진들은 경험적으로나 이론적으로나 위의 3,4번에 대한 경우가 잘못된 생각임을 증명하고 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Partial match techniques(부분일치 기법)&lt;br /&gt;검색된 도큐먼트들의 표현이 질문의 표현과 부분적으로 일치된 경우의 것들로 함께 검색하는 방식이다. 여기서 Individual 방법은 이용자 질의를 각각의 개별 도큐먼트들과 비교 하는 방식을 말하며 Network 방법은 이용자 질의를 개별 도큐먼트들의 표현과 비교하는 것이 아니라 개별 도큐먼트들 및 이와 관련된 다른 도큐먼트들과의 관계성 에 중점을 두어 작성되는 표현들과 비교한 검색기법이다. 이러한 네트웍 검색기법 에서는 개별 도큐먼트들의 내용에만 전적으로 의존하여 검색이 이루어지기 보 다는 이들과 관련을 맺고 있는 네트웍 기법으로는 cluster에 근거한 검색기법 과 Browsing기법 및 Spreading activation기법이 있다.&lt;br /&gt;&lt;br /&gt;2.1 Individual, Feature-based&lt;br /&gt;이용자의 질의 및 도큐먼트들의 표현방식을 "색인어"와 같은 일련의 특징들로 표현하는 방식&lt;br /&gt;-&gt;이러한 일련의 Features(특징)들은 각각 가중치로 표현될 수 있으며, text내에서 나오는 보다 복잡한 현상들을 표현하기에 적합하다. 이러한 feature-based기법에는 다시 Formal mode(여기에 해당되는 기법으로, Vector space model, 확률모델, fuzzy set model 등이 있다)과 Ad-hoc model이 있다. 이러한 범주의 기법들은 이용자의 질의를, 일련의 특징들 혹은 색인어들로 나타내는 도큐먼트 표현과 비교하는 방식을 취하고 있다. 이때의 도큐먼트 표현물들은 수작업이나 자동색인의 방식으로 도큐먼트의 텍스트 상으로 부터 추출되어지며, 마찬가지로 이용자 질의용어 역시 자연어로 표현된 질문으로 부터 직접 추출되거나, 색인어휘상의 용어를 사용하기도 한다. 여기에서 "feature"로 채택되는 요소들은, 단어나 어근, 구 혹은 개념들로서 이들과 관련된 가중치(weighte)값을 지니게 된다. 이러한 가중치들은, 그러한 각 요소들이 한 도큐먼트에 출현하는 빈도수나 혹은 이의 역 빈도수에 의하여 측정될 수 있다. 이러한 가중치의 표현방법이나 사용방법 및 계산방법 등은 각 시스템이 채택하고 있는 검색기법에 따라 다를 수가 있다.&lt;br /&gt;(Formal) ==&gt; Vector space model, probabilistic model, fuzzy set model.&lt;br /&gt;&lt;br /&gt;2.1.1 Vector space model(벡터 공간 모델)&lt;br /&gt;벡터공간 모델 상에서 각 도큐먼트들과 질문자들은 n차원 공간속의 벡터들로 취급되며, 이때 각 차원들은 색인용어들로 표현된다.&lt;br /&gt;이 기법에 의한 검색절차는 다음과 같다.&lt;br /&gt;1) 용어의 가중치는 정규화된 도큐먼트내의 빈도(tf)와 이의 역빈도수를 조합하여 계 산한다.&lt;br /&gt;2) "낮은 식별치"(poor discriminatin value)의 값을 지닌 용어들은 시소러스내의 저 빈도용어들로 대치되며 구의 경우 고빈도 용어들로 대체된다.&lt;br /&gt;3) 각 도큐먼트들은 이용자 질문에 대해서 그 유사성의 순위별로 출력되며, 이러한 과정은 "코사인"상관도(cosine correlation)에 의해 계산된다(벡터 공간내에서 이 용자의 질의에 가장 근접해 있는 도큐먼트들을 직관적으로 검색해 낸다)&lt;br /&gt;&lt;br /&gt;2.1.2 Probabilistic model(확률모델)&lt;br /&gt;확률모델은 지금까지의 검색기술에 새로운 방법론을 제시한 것으로서, 그 기술적 기반은 위의 벡터공간 모델로 부터 나온 것이다. 이 모델의 기본적인 목적은 이용자의 질의에 대한 적절성의 고확률순으로 도큐먼트의 순위를 정하여 검색하는 것이다. 즉, 각각의 도큐먼트를 구성하는 용어의 가중치가 "1"혹은 "0"의 값을 가질 수 있고 또한 이러한 각각의 용어들은 다른 용어들에 대해서 독립성을 지녔다고 가정하여 각 도큐먼트들의 순위를 정하는 방법이다.&lt;br /&gt;&lt;br /&gt;2.1.3 Fuzzy set(퍼지 집합 이론)&lt;br /&gt;이것은 검색기법 상으로 볼 때 블리언 질문기법과 도큐먼트 순위 매김기법을 통합한 기법이나 벡터공간 모델에 기초한 확장된 블리언 검색기법과 비교해 볼 때, 이러한 통합에는 한계가 있음이 드러났다.&lt;br /&gt;&lt;br /&gt;2.1.4 Ad hoc(애드 혹 모델)&lt;br /&gt;이 모델의 기본은 질의 용어군과 도큐먼트 용어군과의 겹침(over-lap)의 정도를 측정하여 그 유사성의 정도에 의하여 문헌을 검색하는 기법이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.2 Individual, Structure-Based Techniques(개별적, 구조기반 기술)&lt;br /&gt;이러한 범주에 드는 검색모델의 특징은 이용자 질의나 도큐먼트의 내용을, 색인어 등의 방식이 아닌 좀 더 복잡한 구조적 형태(structure)로 표현하여 이를 비교하는 방식이다. 이러한 검색기술은 특히, 특정한 전문주제분야에 적용되는 것이 적절하다.&lt;br /&gt;&lt;br /&gt;2.2.1 Logic(논리모델)&lt;br /&gt;도큐먼트의 텍스트가 담고있는 핵심적인 정보는 몇개의 짧은 문장으로 표현될 수 있으며, 이러한 문장들은 일정한 논리식으로 표현이 가능하다. 이와 마찬가지로 이용자의 질의도 논리식에 의한 표현이 가능하며, 이러한 질의는 논리식과 연계된 추론법칙에 의해서 그 해답이 가능하다.&lt;br /&gt;예) 도큐먼트의 주제내용. "If a company sells computer, it is financially viable".&lt;br /&gt;==&gt; 논리식으로 표현 ==&gt; (for all(x) (if (sells x computer) (viable x)))&lt;br /&gt;이때 이용자의 질문(viable?)의 경우 "forward chaming"으로 해답이 가능하다. 이러한 모델의 가장 커다란 어려움은 각 텍스트들을 논리식으로 전환하는 작업인데, 현재는 수작업으로 하고 있다.&lt;br /&gt;&lt;br /&gt;2.2.2 Graph(그래프 모델) 이 모델은 그래프 형태의 표현방법을 이용한 검색기법이다. 즉, 그래프 형태의 표현방법은 노드들과 이러한 노드들간의 edges(links)들로 이루어져 있는데, 이러한 노드들과 edges들은 주로 자연어 처리과정을 통해서 얻어지는 의미망(semantic nets), 혹은 의미프레임(semantic frames)으로 표현된다. 검색기법은 질의어의 그래프 구조와 도큐먼트의 그래프 구조를 서로 비교하여 그 유사성에 의거하여 문헌을 검색하거나 그 순위를 정하는 방식이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.3 Network(네트웍 모델)&lt;br /&gt;&lt;br /&gt;2.3.1 Cluster(클러스터 모델)&lt;br /&gt;클러스터란, 내용이 유사한 일련의 도큐먼트군을 의미한다. 이것은 SMART프로젝트에 채택된 검색기법으로서, 클러스터 계층구조(CLUSTER HIERACHY)에 의한 것이었다.&lt;br /&gt;* 클러스터 계층구조&lt;br /&gt;--&gt; 전체의 도큐먼트들을 몇개의 클러스터들로 나눈후에 각각의 클러스트들을 또다시 작은 클러스터들로 나누는 반복된 작업구조.&lt;br /&gt;검색방법은 이용자의 질의내용을 최상위의 클러스터로 부터 최하위의 클러스터들 까지 하향식으로 비교하여 그 유사성의 큰 것부터 차례대로 검색해 내는 방식.&lt;br /&gt;&lt;br /&gt;2.3.2 Browsing(브라우징 기법)&lt;br /&gt;각각의 도큐먼트, 색인용어, 서지적 정보들을 시스템상에서 노드와 컨넥터들로 표현된 네트웍 구조로 만들 수 있다면, 이 때, 이용자는 이러한 네트웍을 훌터나가면서(Browsing) 필요한 도큐먼트들을 검색하는 기법. 이러한 Browsing기법에서 주목할 사항은 검색기법상 이용자 질문식의 형성(query formulation)에는 중점을 덜 두는 반면에, 이용자로 하여금 Browsing과정 중에서, 즉각적인 피드백을 강조하는 시스템이다.&lt;br /&gt;I R 시스템의 예&lt;br /&gt;노드(node) --&gt; 도큐먼트, 색인어, 주제영역지식, 저자, 저널명.&lt;br /&gt;링크(links) --&gt; 색인정보, 시소러스 정보, 인접노드정보, 인용, 저자사항.&lt;br /&gt;&lt;br /&gt;2.3.3 Spreding activation(스프래딩 액티베이션 모델)&lt;br /&gt;위의 Browsing기법과 유사한 모델&lt;br /&gt;네트웍 상에서 이용자의 질문에 해당되는, 어느 한 부분의 노드(색인어 혹은 도큐먼트) 및 이와 관련된 또 다른 노드들만 활성화(activate)시켜 가면서 최종 도큐먼트를 검색해 내는 방식.&lt;br /&gt; 예를들어 이용자의 질문에 의해서 어느 한 색인어가 선택되어 졌을 때, 이 색인어와 연결된 도큐먼트들 및 관련 색인들 역시 함께 활성화시키게 되는 방식.&lt;br /&gt;&lt;br /&gt;2.4 Feedback Methods(피드백 기법)&lt;br /&gt;이 기법은, 원래 "Feature-based"기법에서 발전되어 온 것으로서 현재는 모든 검색기법에서 응용되고 있다. 이 기법의 핵심은, 질의 용어에 대한 기준치를 검색도중에 수정해 가면서 최적의 도큐먼트들을 검색해 내는 방식이다. 이러한 가중치의 수정은, 적합한 것으로 판단된 도큐먼트들 속에 포함된 색인어들의 빈도수에 의해서 결정된다. 10-20%.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Relative Performance of Retrieval! Techniques(검색기법의 상호성능 비교)&lt;br /&gt;(Comparation Performance Studies)&lt;br /&gt;1) 전반적으로 완전일치(exact match)기법보다는 부분일치(paricial-match)기법에 의 한 검색 결과가 더우수한 것으로 나타났다.&lt;br /&gt;2) Feature-based기법 중에서는 특히 색인어에 대한 가중치 부여 기법을 사용한 확률 모델 기법이 가장 우수한 것으로 조사되었으며, 이때 용어의 가중치를 주는 방식 에 따라 그 검색성능이 크게 달라졌음이 밝혀졌다.&lt;br /&gt;3) 클러스터 검색기법의 경우 "individual feature-based"검색에 버금가는 성능을 지녔으며, 특히 다른 검색기법들에 비해서, 높은 정확율을 가져온 것으로 나타났다. 따라서 클러스터 기법은 "individual feature-based"모델을 대체할 수 있는 좋은 기법이다.&lt;br /&gt;==============================================================================&lt;br /&gt;오늘도 하나 배워가는 하루가 되시길...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-7156901473791205920?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/7156901473791205920/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=7156901473791205920' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/7156901473791205920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/7156901473791205920'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/2.html' title='검색 엔진2 - 검색 기법'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-5288732920269209282</id><published>2007-08-13T21:00:00.000+09:00</published><updated>2007-08-13T21:25:18.586+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='검색 엔진'/><title type='text'>검색 엔진 1 - 구성 요소</title><content type='html'>&lt;a href="http://irgroup.org/"&gt;IR 그룹&lt;/a&gt;의 하얀 눈길 님께서 작성하신 글입니다.&lt;br /&gt;&lt;br /&gt;원문은 &lt;a href="http://irgroup.org/zb5/trackback.php?article_srl=4287"&gt;여기&lt;/a&gt;를 누르시면 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;1주일에 한번씩 올리려 한 것이 개인적인 사유로 많이 늦어지고 있습니다.(핑계지요 )&lt;br /&gt;이번에 올릴 글을 작성하다 보니 글이 길어지는 것 같아 두 부분으로 나누었습니다.&lt;br /&gt;뒷부분은 별도 제목으로 하여 따로 올리려 합니다.&lt;br /&gt;두서없이 정리한 것이라 내용이 역시 부실하군요.&lt;br /&gt;&lt;br /&gt;============================================================================&lt;br /&gt;정보검색시스템의 구성요소&lt;br /&gt;&lt;br /&gt;1. 정보검색시스템이란?&lt;br /&gt; 정보 수요자가 필요하다고 예측되는 정보나 데이터를 미리 수집, 가공, 처리하여 찾기 쉬은 형태로 축적해 놓은 데이터 베이스로부터 요구에 적합한 정보를 신속하게 찾아내어 정보 요구자에게 제공하는 시스템을 말한다.&lt;br /&gt;&lt;br /&gt;2. 배경학문 &lt;br /&gt;자료구조론 (Speed &amp; Memory Trade-off) &lt;br /&gt;데이터베이스론 (DB Indexing) &lt;br /&gt;검색알고리즘 &lt;br /&gt;AI의 Search, NLP, Story understanding Algorithm &lt;br /&gt;ES의 Inferencing&lt;br /&gt;&lt;br /&gt;3. 구성요소&lt;br /&gt;3.1) 웹로봇   &lt;br /&gt;웹상에 존재하는 문서들을 가져오기 위해서 웹의 하이퍼텍스트 구조를 자동적으로 추적하여 참조되어지는 모든 문서들을 재귀적으로 검색하는 프로그램을 말한다. 여기서 '재귀적으로'라는 의미는 어떤 명시된 트래버스 알고리즘으로 유한하게 정의되어지는 것이 아님을 주목하라. 비록 로봇이 문서 선택을 위해 몇몇의 발견적인 학습법을 허락한다거나 방문하기 위한 문서의 순서를 정한다거나 하더라도 여전히 로봇이다.  일반적인 웹브라우저는 로봇이 아니다. 왜냐하면 그것들은 인간에 의해 수행되어진다. 그리조 참조되어지는 문서들을 자동적으로 수집하지 않는다.  크롤러(crawler), 스파이더(spider), 개더러(gatherer), 웸(worms), 안츠(ants) 등 다양한 이름으로 불리우지만 일반적인 명칭으로는 로봇이라 칭하는 비율이 높은듯 하다.  로봇을 얘기하면서 빼 놓을 수 없는 것이 로봇 배제 표준(robot exclusion standard)이다. 봇은 상당히 무책임한 프로그램이 될 수 있으며, 심한 경우는 웸바이러스와 같은 행동을 보일 수 있다. 필자의 경우 회사에서 로봇을 구동시키던 도중 국내의 유명 쇼핑몰의 DB를 죽여버린 경우가 있었다. 다행히 관용을 베풀어 주셔서 조용히 넘어갈 수 있었지만 돌이켜 보면 무척이나 위험한 상황이었다. 이처럼 잘못 구성된 로봇으로 인해 특정 사이트를 죽여버리거나 망 자체를 마비시킬 수도 있는 것이 로봇이다. 이런 로봇의 위험에서 자신의 웹사이트를 보호하기 위한 표준적인 방법이 로봇 배제 표준이라 생각하면 된다. 하지만 대다수의 로봇들이 이러한 표준을 지켜주는 것이 아니란 것을 명심하라. 독자가 로봇을 만들 생각이라면 반드시 이 표준을 지켜주기를 권장한다.  로봇 배제표준에 대한 자세한 설명은 시간이 나는대로 따로 간단한 강좌를 만들겠다.&lt;br /&gt;&lt;br /&gt;3.2)스토리지  &lt;br /&gt;검색엔진에서 사용할 색인용 데이타를 컴퓨터의 저장장치에 기록하여 두는 곳을 말한다. 초창기 상용화된 검색엔진들은 일반적인 DBMS를 사용하여 데이타를 저장하였다. 이는 관리 및 사용이 아주 용이하기 때문에 매우 효과적으로 수행될 수 있었으나 데이타가 대용량화 되어지고 알고리즘이 복잡해 지면서 점차 화일 시스템을 직접 제어하여 데이타를 저장하는 방식을 많이 사용한다. 단순하게는 화일에 필요한 키워드 정보와 포스팅화일 요약화일을 저장하는 방식에서 좀더 성능을 향상시키기 위해 물리적인 계층에서 저장장치(보통 하드디스크)를 제어하여 자체의 검색엔진 전용 화일 시스템을 구축하는 경우도 있다. 몇몇 공개된 소프트웨어 중에서는 검색엔진 전용 색인 DB를 만들어 배포하는 곳도 있다.   검색엔진을 구축하다보면 용도에 따라 Read-only 시스템으로 구축하는 경우와 read-write 시스템으로 구현하는 경우가 있다. 전자의 경우는 화일 시스템을 구성하는 것이 무척이나 간단한 문제이지만 후자일 경우는 아주 심각해진다. 허나 후자와 같은 시스템을 요구하는 업체들의 비중이 점점 높아지는 추세이며 업계에서는 이런 부분에 많은 투자를 하고 있는 시점이다.   검색엔진에서 사용되는 기본적인 스토리지의 구성은 보통 3단계로 구성되며, 이는 텀리스트, 포스팅 화일, 요약화일로 구성된다.&lt;br /&gt;&lt;br /&gt;3.3)색인기  &lt;br /&gt;웹로봇을 통해 수집된 문서들을 빠르고 정확하게 검색하기 위해 문서의 중요 키워드를 추출하고 이러한 키워드들의 상관관계나 문서들의 상관관계를 정의하여 스토리지에 저장하는 프로그램이다. 키워드를 추출하기 위해 형태소분석기나 스테머등을 사용하거나 또는 n-gram 방식을 사용하기도 한다. read-write시스템의 경우는 색인기와 검색기가 하나의 시스템으로 구성되기 때문에 임계영역에 대한 문제가 대두된다. 다양한 랭킹 알고리즘에 의해 색인기의 모양은 달라지게 되면 알고리즘의 복잡도와 추출되는 색인어의 양에 의해 색인 속도에 많은 영향을 주게 되며, 이러한 색인 속도는 색인기의 전체 성능을 평가하는 기준이 되기도 한다. 스토리지는 색인기의 일부분으로 구성될 수 있으며 결국 스토리지의 구조는 검색 모델(또는 랭킹 알고리즘)에 의해 결정되어진다.&lt;br /&gt;&lt;br /&gt;3.4)형태소분석기  &lt;br /&gt;형태소 분석이란 여러 형태소들의 묶음이 표층 형태로 나타나는 하나의 어절로부터 의미를 갖는 최소 단위인 각 형태소를 분석해는 내는 것으로 정의된다.(강승식) 문서의 핵심 키워드를 추출하는 기본적인 시스템이다. 검색엔진에서는 보통 형태소분석기의 모든 기능을 사용하지 않고 색인어 추출만 하기위해 특정 형태소만 취하는 경우가 대부분이다. 초기 정보검색에서는 색인어로 적합한 형태소는 명사로 국한하였다. 허나 발전을 거듭하면서 현재는 각 형태소의 구조적인 관계 및 의미관계까지 고려한 색인어를 추출하기도 하며, 이러한 방식은 자연어 검색의 기본이 된다.&lt;br /&gt;&lt;br /&gt;3.5)스테머  &lt;br /&gt;보통 어근 추출용으로 많이 사용되었으며 영어권 언어에 대해서 많이 적용된다. 언어적 특성상 한국어와 같은 교착어는 어미변화와 활용형들이 아주 심한 편이어서 단순한 스테밍 알고리즘만으로 처리하기에는 문제점이 있기 때문에 한국어는 형태소분석기를 주로 사용한다. 영어같은 경우 몇가지의 간단한 룰만 적용하여 스테머를 구성할 수 있기 때문에 속도가 빠르고 효율적인 시스템을 구성할 수 있다.&lt;br /&gt;&lt;br /&gt;3.6)검색기   &lt;br /&gt;사용자가 입력한 검색 질의를 색인기가 생성하여 둔 스토리지에서 정의된 검색 모델(랭킹 알고리즘)에 의해 가장 유사한 문서를 추출하여 검색하여 주는 기능이다. 질의 분석기가 별도로 내장되어 있어야 하며 특성상 대량의 정보를 빠른 시간안에 주어진 알고리즘으로 계산해 내는 능력이 필요하다. 순위화를 위해 랭커를 가지고 있으며 보다 빠른 검색을 위 캐쉬를 사용하기도 한다.&lt;br /&gt;&lt;br /&gt;3.7)브로커  &lt;br /&gt;검색엔진에서 사용하는 컬렉션은 다양한 여러 종류로 구성될 수 있다. 이러한 다양한 컬렉션에 대해 하나의 질의로 검색을 할 경우 어느 컬렉션을 검색할지 최종 검색된 컬렉션별 결과들을 어떻게 취합할지에 대한 문제가 발생하게 된다. 이러한 문제를 해결해 주는 것이 브로커이다. 입력된 질의를 분석하여 검색할 대상을 찾고 각 컬렉션에서 결과를 검색한 후 이에 대한 최종 결과를 취합하여 전달해 주는 역할을 하게된다. 포탈 사이트의 통합검색 CGI도 넓은 의미에서 브로커라 할 수 있겠다.&lt;br /&gt;&lt;br /&gt;3.8)요약기  &lt;br /&gt;문서의 핵심이 되는 내용을 간결한 문장으로 축약하여 주는 기능이다. 검색된 문서의 모든 내용을 보여주기에는 그 양이 너무 많기 때문에 검색자의 편의를 위해 잘 정제된 요약 내용을 보여줄 필요가 있다. 경우에 따라서는 검색기에 이런 요약기능을 부여하기도 하며 별도의 서버로 구축될 수도 있다. 자동요약 분야는 아직도 많이 연구가 되어지고 있는 분야이다. &lt;br /&gt;&lt;br /&gt;3.9)각종 필터   &lt;br /&gt;다양한 포맷의 문서들에서 텍스트 정보를 추출하기 위한 기능이다. doc 화일 같은 경우 binary로 구성되어 있기 때문에 실제 text정보를 추출해 주는 doc 필터가 필요하다. 또한 html문서도 그대로 색인시 html tag도 색인이 되어질 수 있으므로 html parser를 통해 필터링을 걸쳐 text정보만을 색인하게 된다. 이런식으로 text-based 검색엔진에서는 다양한 문서들에 대한 검색 서비스를 하고자 할 경우 각각의 문서 포맷에 맞는 개별적인 필터가 있어야만 한다.&lt;br /&gt;&lt;br /&gt;3.10)랭커   &lt;br /&gt;검색 결과에 대한 순위를 매겨주는 기능이다. 검색 모델 및 랭킹 알고리즘에 맞게 구성되어지는 것이 보통이며 검색기의 일 부분으로 동작하게 된다. 주된 기능은 질의에 대한 각 문서들의 연관성을 수치화 하는 기능과 결과 정렬 기능이다. 실제 검색 속도에 가장 영향을 많이 주는 부분은 포스팅화일을 스토리지에서 메모리로 로딩하는 과정과 이 랭커에서 랭킹을 하는 두 부분이다.&lt;br /&gt;&lt;br /&gt;3.11)질의분석기  &lt;br /&gt;사용자가 입력한 비 정규적인 질의를 파싱하여 검색에 적합하도록 정의된 정규화된 질의 문법으로 변환하는 기능이다. 입력된 질의는 대다수 내부적인 연산에 적합하게 구성되지 않는다. 이를 최대한 연산하기에 적절한 문법으로 변환하기 위한 필수 과정이다. 분석기는 때때로 형태소분석기나 기타 토큰 분리기 등을 포함하고 있어서 질의중에 꼭 필요한 키워드만 추출할 수 있도록 하기도 한다. 논리연산을 위해서 정의된 기호들을 연산자로 대치하기도 하고 질의에 대한 파스트리를 생성하기도 한다. 또한 주어진 컬렉션들 중에 어디에서 검색할 것인가를 명확히 표현해 주기도 한다.&lt;br /&gt;&lt;br /&gt;3.12)파서   &lt;br /&gt;문자열 파서가 대부분이다. 경우에 따라서는 오토마타, 형태소분석기, 기타 토큰분리기 등을 사용한다. 색인기에서 색인어 추출을 위해 사용하기도 하며 검색기에 포함되어 있는 질의 분석기에서 질의를 분석하기 위해서 사용하기도 한다.&lt;br /&gt;&lt;br /&gt;3.13)오토마타  &lt;br /&gt;유한오토마타를 사용하여 주어진 질의나 문서를 파싱하기 위해 사용한다.&lt;br /&gt;&lt;br /&gt;3.14)컬렉션  &lt;br /&gt;검색 대상이 되는 집합을 말한다. 웹문서 검색일 경우 로봇이 수집한 HTML문서등이 하나의 컬렉션이 될 수 있다. 다양한 조건 및 여러 필드 검색을 지원하기 위해 컬렉션은 여러개로 나뉘어 질 수 있으며 웹문서하나도 여러개의 컬렉션으로 쪼개어 구성시킬 수 있다. 예를 들어 &lt;a href="http://www.yahoo.co.kr/"&gt;www.yahoo.co.kr&lt;/a&gt; 하위의 문서 중에 '꾸러기'라는 키워드로 검색하고자 할 경우, 웹문서들의 text부분을 모아서 하나의 컬렉션으로 구성하고, url부분을 모아서 다른 하나의 컬렉션으로 구성한 후 두개의 컬렉션중에 url은 url 컬렉션에서 찾고, 키워드는 text 컬렉션에서 찾은 후 두 결과를 and 연산을 통해 최종 결과를 산출한다. 이런식으로 데이타 성격이 다른 여러개의 집합들을 개별 컬렉션으로 구성하여 다양한 연산을 통해 복잡하면서도 잘 정의된 검색 결과를 계산할 수 있다.&lt;br /&gt;&lt;br /&gt;3.15)DB  &lt;br /&gt;색인기가 생성한 색인 정보들을 저장할 DB를 말한다. 일반적인 상용 RDB를 사용하여 색인 DB를 구성할 수도 있으며 속도를 위해 파일 시스템을 제어하여 별도의 화일시스템으로 구성할 수도 있다. 컬렉션의 크기와 종류가 작을 경우는 상용 RDB를 사용하는 것이 사용하기에 아주 편리하다. 그러나 대용량 컬렉션일 경우는 파일 시스템을 직접 제어하는 것이 성능상 더 효율적일 경우가 많다. 검색엔진 전용으로 연구되어진 DB들이 몇몇 대학의 연구소를 중심으로 발표되어 있긴 하나 상용으로 적용된 사례가 많지 않다. 버클리 DB를 사용하여 동적 색인을 가능케 한 검색엔진들이 발표되어 있긴 하나 성능이 만족할 만 한지는 의문이다.&lt;br /&gt;&lt;br /&gt;3.16)프리뷰어  &lt;br /&gt;검색된 페이지를 직접 방문하지 않고 검색엔진 자체에 저장되어 있는 문서를 사용하여 엔진 자체에서 미리보기 형식으로 보여주는 기능이다. 웹로봇이 문서를 수집할 당시에 살아 있던 링크라 하더라도 검색하는 시점에서는 이미 삭제되어 버린 문서일 수도 있다. 또는 속도가 느려서 실제 페이지를 방문할 때 브라우져를 통해 보기가 만만찮을 경우도 있다. 이런 경우 엔진에서 저장하고 있는 데이타를 사용하여 미리보기 형식으로 데이타를 보여주어 사용자의 편의를 도모할 수 있다.&lt;br /&gt;&lt;br /&gt;3.17)중복제거기  &lt;br /&gt;최근 검색엔진들의 비약적인 발전으로 인해 검색 결과에서 중복되는 문서들이 나타나는 경우는 드물다. 실제 엔진 내부에는 중복된 내용을 가지는 문서들이 상당수 존재하는 것이 일반적인 현상이며, 이러한 중복 문서를 제거하기 위해 별도의 중복 제거기가 필요하다. 크게 3부분에서 중복문서를 제거시킬 수 있으며, 첫째로 로봇에서 문서를 수집하는 시점 또는 수집후에 모든 문서들을 비교해서 중복 문서를 제거할 수 있다. 둘째로 색인 시점에서 색인과 동시에 중복되는 문서를 제거시킬 수 있으며, 마지막으로 검색한 결과에 대해서 검색기에서 검사하여 결과를 조절하는 방식으로 제거시킬 수 있다. 구글이나 네이버에서는 마지막 방법까지 사용하여 중복문서를 제거한다. 이러한 방식 때문에 실제 검색 결과와 마지막에 보여지는 개수에 차이가 보여지기도 한다.&lt;br /&gt; &lt;br /&gt;3.18)역화일  &lt;br /&gt;파일 시스템 또는 데이터베이스 등과 같이 대량의 자료가 관리되는 곳에서 보다 빠르게 자료를 검색하기 위하여 각각의 자료에 대한 색인이 구성되어 있는 파일을 지칭하는 용어. 이러한 파일에는 각각의 데이터 레코드에 대한 키 값과 이러한 키 값에 의하여 지칭되는 레코드의 위치가 하나의 쌍을 이루고 있다. 키워드를 빠르게 찾기 위해 B+tree나 B-tree, trie, 페트리샤트리 등을 사용한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=============================================================================&lt;br /&gt;다음 강좌는 검색기법에 대해 간단히 정리하여 보겠습니다.&lt;br /&gt;그럼 좋은 하루 되세요.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-5288732920269209282?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/5288732920269209282/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=5288732920269209282' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5288732920269209282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5288732920269209282'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/1.html' title='검색 엔진 1 - 구성 요소'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-6271795641605615066</id><published>2007-08-10T19:01:00.000+09:00</published><updated>2007-08-10T19:03:27.690+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='소모적인 setting'/><title type='text'>DBEdit로 이클립스에서 DB작업을 간편하게..</title><content type='html'>&lt;div&gt;DBEdit..&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;dbEdit와 혼동 말자.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;DBEdit는 이클립스에서 Database를 보다 간편하게 사용하기 위한 tool이다.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://sourceforge.net/projects/dbedit"&gt;&lt;span style="color:#800080;"&gt;소스포지의 DBEdit홈페이지를 &lt;/span&gt;&lt;/a&gt;가서 DBedit를 다운받자.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;다운 받은 압축 파일을 풀면 features와 plugins디렉토리가 나타나는데 각 폴더 내용들을 이클립스의 features와 plugins폴더로 옮겨놓는다. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;그리고 이클립스를 실행해보자.&lt;/div&gt;&lt;div&gt;그림에서 볼 수 있는 바와 같이 Window메뉴의 Open Perspective의 Other메뉴를 보면 DBEdit가 새로 추가된 걸 볼 수 있다. &lt;/div&gt;&lt;div&gt;실행해보면 그림에서처럼 새로운 Tables와 관련된 바가 새로 나타난다.&lt;/div&gt;&lt;div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;img src="http://docs.google.com/File?id=ddvzq6wf_11dk5w7wdg" /&gt;&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;Database를 연결하기 위해서 Tables바 안 빈칸 아무곳에나 마우스 포인터를 옮겨 놓고 좌측 버튼을 클릭해보면 메뉴가 뜬다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;이 메뉴에서 New&amp;gt;Connection을 실행하면 연결 설정 다이얼로그가 뜬다. &lt;div&gt;1.다이얼로그에서 classpath탭을 선택해 JDBC 드라이버 파일을 클래스패스에 등록한다.(MySQL은 mysql-connector-java-x.x.x-bin.jar파일이 있는 것을 연결, Oracle은 class12.zip)&lt;/div&gt;&lt;div&gt;2.Common 탭에서 JDBC Driver 콤보박스의 드랍다운 버튼을 누르면 사용 가능한 JDBC 드라이버의 목록이 나오는데 적절한 것을 선택하면 된다.(org.gjt.mm.mysql.Driver)&lt;/div&gt;&lt;div&gt;3.JDBC 드라이버를 설정하면 바로 아래 Server URL항목에 해당 드라이버에 대한 JDBC URL 템플릿이 팝업으로 표시된다. 이를 선택해 Server URL난을 채운다.(host-&amp;gt;localhost,dbname-&amp;gt;해당DB이름)&lt;/div&gt;&lt;div&gt;4.다음 서버주소, 포트번호, SID등을 적절히 편집한다.(port는 MYSQL의 경우 대부분 3306)&lt;/div&gt;&lt;div&gt;5.사용자 아이디와 패스워드 등을 지정한 다음 Connect버튼을 누른다.&lt;/div&gt;&lt;div&gt;ex)&lt;/div&gt;&lt;div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;img src="http://docs.google.com/File?id=ddvzq6wf_12f8hkz6cd" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;그러면 데이터 베이스에 연결이 될것이다!!!!!&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;참고로 DBEdit는 기본 설정으로 100개씩의 row data만을 가지고 온다. 이를 해결하기 위해서는 preferences(Window메뉴에 있는)의 DBEdit 메뉴에서 설정해줘야한다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;또한 Shift + Ctrl + E를 누르면 조건에 맞는 data만 추려서 볼 수 있다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;Tables 뷰의 컨텍스트 메뉴에서 New&amp;gt;SQL File을 선택하면 SQL Editor가 열리며, 여기서 SQL문을 이용해 작업할 수 있다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;span style="color:#ff0000;"&gt;마지막으로 혹시 "Fetching children of MySQL"이라는 Error메시지를 보았다면, 다른 버전으로 다시 까는게 가장 빠른 해결책이라고 할 수 있다.&lt;/span&gt;&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;span style="color:#ff0000;"&gt;현재 글이 씌여지는 시점에도, 아직 근본적인 해결책은 찾지 못하고 있다고 전하고 있다. 나 역시 1시간 동안 해결책을 찾은 결론 끝에, 다시 깔았고.... 1분 만에 제대로 된 화면을 보았다... ㅜㅜ&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-6271795641605615066?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/6271795641605615066/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=6271795641605615066' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/6271795641605615066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/6271795641605615066'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/dbedit.html' title='DBEdit로 이클립스에서 DB작업을 간편하게..'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-4436972662055008051</id><published>2007-08-10T15:57:00.000+09:00</published><updated>2007-08-10T16:55:42.486+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion mining'/><title type='text'>Determining term subjectivity and Term orientation for opinion mining</title><content type='html'>Opinion mining관련한 굵직한 논문들을 서베이하는 것은 이걸로 대충 마무리 지어질 것 같다.&lt;br /&gt;물론, 그 동안 읽었던 논문들을 아직 블로그에는 다 기록하지 못했지만...&lt;br /&gt;&lt;br /&gt;이 논문은, Andrea esuli와 Fabrizio sebastiani의 작품이다.&lt;br /&gt;&lt;br /&gt;이 논문은 자동적으로 sentiment orientation을 확장하고 재생산 하는 알고리즘에 대한 힌트나 영감 혹은 subjectivity를 판단하는 데 있어서 어떤 감을 얻을 수 있을까 해서 읽었는데 소기의 목적을 달성하지는 못한 듯 싶다.&lt;br /&gt;&lt;br /&gt;논문에서는 기존 연구들(opinion mining관련한)이 sentiment orientation을 찾고 그걸 이용해 positive, negative한 글들로 분류하는 것에 대해 문제를 제기하고 있다.&lt;br /&gt;글이나 단어들은 opinion이나 emotion이 확연하게 드러나는 것들도 있지만, 그렇지 않은 것들도 많다. 따라서 먼저 주관적인 글과 객관적인 글 혹은 단어로의 구분을 한 뒤 positive, negative로의 구분이 순서에 맞다고 주장한다.&lt;br /&gt;따라서 opinion mining과 관련한 연구나 작업은 크게 3부류로 나눌 수 있다.&lt;br /&gt;먼저, 주관성 객관성을 파악하는 일 하나.&lt;br /&gt;그리고, positive 혹은 negative한 걸로 분류하는 것 둘.&lt;br /&gt;마지막으로, mild한 positive인지 strong한 negative인지 강도를 파악하는 것 셋.&lt;br /&gt;&lt;br /&gt;andrea와 fabrizio 두 사람의 방법은 다음과 같다.&lt;br /&gt;positive한 것과 negative한 것을 semi-supervised learning algorithm을 이용해 trainng한다.&lt;br /&gt;semi-supervised라고 한 이유는 training의 일부 셋은 맨 처음 labeling이 되어 있기 때문이다.&lt;br /&gt;즉, seed set이라고 할 수 있는 positive, negative한 집합을 맨 처음 만든다. 그리고 이 집합을 이용해 순차적으로 training의 셋을 넓혀간다.&lt;br /&gt;&lt;br /&gt;처음 :&lt;br /&gt;positive = positive seed set&lt;br /&gt;negative = negative seed set&lt;br /&gt;두번째:&lt;br /&gt;positive = 기존positive seed set+기존positive set의 유의어 set+기존negative seed set의 반의어 set&lt;br /&gt;negative = 기존negative seed set+기존negative set의 유의어 set+기존positive seed set의 반의어 set&lt;br /&gt;...&lt;br /&gt;K번째:&lt;br /&gt;positive = (K-1)positive seed set+(K-1)positive set의 유의어 set+(K-1)negative seed set의 반의어 set&lt;br /&gt;negative = (K-1)negative seed set+(K-1)negative set의 유의어 set+(K-1)positive seed set의 반의어 set&lt;br /&gt;이런 방법으로 sentiment orientation data set을 확장해 나간다.&lt;br /&gt;&lt;br /&gt;다음 방법은 한 단어에 대해서 word net gloss(즉, 단어 정의 혹은 뜻풀이)들을 합쳐서 textual representation을 만든다. 그리고 이 textual representation을 text indexing 기법인 vetorial form으로 변형한다. 그 후 stop words(이 의미를 잘 모르겠다.)를 지우고 남은 단어들은 consine-normalized tfidf로 weight를 설정한다.(아마도 turney논문에서 살펴본 기본이 되는 nice, good같은 단어들만을 남긴다는 의미 같은 데 확실히 모르겠다.) 이것은 비슷한 orientation을 갖는 단어들은 비슷한 gloss를 가질 것이라는 가정에 따른 것이다. 예를 들면, 정직과 진취는 가치를 높이는 단어들이 공통적으로 들어가겠지만 불신과 방해는 가치를 손상시키는 단어들이 뜻풀이에 공통적으로 들어갈 것이다.&lt;br /&gt;&lt;br /&gt;이 논문은 evaluation이나 result분석에 큰 의의를 둘 수 있는 논문이지만...&lt;br /&gt;&lt;br /&gt;지금은 필요하지 않은 관계로 조금 후에 시간이 되면 하도록............ 헉헉&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-4436972662055008051?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/4436972662055008051/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=4436972662055008051' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/4436972662055008051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/4436972662055008051'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/determining-term-subjectivity-and-term.html' title='Determining term subjectivity and Term orientation for opinion mining'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-2225858550281785347</id><published>2007-08-10T11:27:00.000+09:00</published><updated>2008-12-11T23:44:04.401+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Machine learning'/><title type='text'>SVM의 개념</title><content type='html'>SVM은 상당히 다룰 내용이 많은 learning algorithm이다.&lt;br /&gt;&lt;br /&gt;하지만, 아직은 SVM을 제대로 공부한 적이 없는 필자와 같은 상태의 사람들은 논문을 보거나 SVM을 프로젝트에 이용하려 할때 기본 개념을 알고 있을 필요가 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SVM(Support vector machine)은 2개의 범주를 분류하는 이진 분류기이다.&lt;br /&gt;&lt;br /&gt;다음 그림은 SVM의 개념을 설명하는 것이다. feature들은 그림과 같은 vector공간에 vector로 표시된다. 그림에서 보는 것처럼 하얀 색 vector들을 A그룹에 속하는 white point라고 하고, 그 반대로 검은색 vector들을 B그룹에 속하는 black point라고 하자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_ECA08t3QSQ0/RrvOpzE2m9I/AAAAAAAAABE/X9d38hOBooU/s1600-h/111.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5096894620780370898" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_ECA08t3QSQ0/RrvOpzE2m9I/AAAAAAAAABE/X9d38hOBooU/s320/111.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;이러한 벡터 가운데 같은 범주를 기준으로 바깥으로 위치한 벡터들의 연결선으로 이루어진 닫혀진 다각형을 convex hull이라고 한다. convex hull안의 벡터들은 그룹을 분류하는 데 그다지 큰 영향을 미치지 않는다. 그룹을 분류하는데 가장 큰 영향을 미치는 것들은 바깥에 위치한 벡터들이다. 그룹을 분류하는 선, 면을 hyperplane이라고 한다.&lt;br /&gt;그림에서 보는 것처럼 그룹을 나눌 수 있는 hyperplane은 무수히 많다.&lt;br /&gt;하지만, 직관적으로 그룹들의 convex hull에 속한 벡터들 중 가장 가까운 벡터와 수직거리로 가장 먼 거리를 가진 hyperplane이 2그룹을 효과적으로 분류할 것이다.&lt;br /&gt;이러한 hyperplane을 maximum hyperplane이라고 부르고 이때 가장 가까운 벡터들을 support vector라고 한다. hyperplane이 재조정 될때는 support vector역시 재계산 되어야 한다. hyperplane은 선형 또는 비선형 모든 형태로 표현이 가능하며 일정 수식의 방정식으로 표현이 가능하기 때문에 간단한 수식으로 두 그룹을 분류할 수 있다.&lt;br /&gt;&lt;br /&gt;이제 해야 할 일은 이 두 그룹 간의 거리를 최대한으로 하여 categorization할 때 발생할 수 있는 오류를 최소화 해야 한다. 그룹 간 거리를 최대한으로 하기 위해서 공업 수학 시간에 배운 적이 있을(공학도라면) 다변수 함수의 최대, 최소 값 찾는 데 이용되는 라고랑지의 미정계수법을 사용한다. 라고랑지 미정계수법의 원리는 그리 어려운 내용이 아니다.(수학적 내용 Lable의 라고랑지의 미정계수법 참고)&lt;br /&gt;&lt;br /&gt; 그런데 SVM 역시 두 그룹간의 거리를 최대로 하는 가중치 값들(다변수)을 정하는 것이므로 다른 머신 러닝 방법과 유사한 측면이 있다. 그렇다면, 왜 Decision tree, Concept learning, 그리고 neural network같은 걸 쓰지 않고 SVM을 쓰는 걸까? 그것을 바로 target이 2그룹 중 하나로 분류되는 경우에 특화되어 있기 때문이다. 예를 들면, 2가지 그룹으로 분류하는 방법으로 Decision tree를 쓸 수도 있고, neural network를 쓸수도 있고 Concept learning을 할 수도 있다. 만약 training set이 선형적인 hyperplane으로 나눠질 수 있다면 모든 경우가 거의 비슷한 성능을 할 것이다. 하지만 비 선형적인 경우 neural network가 가장 좋은 성능을 내게 될 것이라고 하자. 하지만, 만약 이 비선형성이 보다 높은 차원에서 볼 때 선형성을 뛴다고 하면 차원을 확대해서 보다 더 빠르고 쉬운 선형적 머신 러닝 알고리즘을 사용할 수 있지 않을까? 우리는 두 개의 그룹으로 분류하기 때문에 차원의 수를 아주 많이 확대하지 않고도 training set을 선형적으로 바꿀 수 있을 것이라고 직관적으로 생각할 수 있다. 그런 의미에서 SVM이 효과적인 측면을 갖는다고 말할 수 있다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-2225858550281785347?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/2225858550281785347/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=2225858550281785347' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2225858550281785347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2225858550281785347'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/svm_10.html' title='SVM의 개념'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ECA08t3QSQ0/RrvOpzE2m9I/AAAAAAAAABE/X9d38hOBooU/s72-c/111.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-8205204049760790112</id><published>2007-08-10T10:59:00.000+09:00</published><updated>2007-08-10T11:27:50.763+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion mining'/><title type='text'>SVM을 이용한 악성 댓글 판별 시스템의 설계</title><content type='html'>음.....&lt;br /&gt;&lt;br /&gt;강승식 교수님께 형태소 분석기를 문의 드리면서,&lt;br /&gt;하려고 하는 프로젝트에 설명을 드렸더니...&lt;br /&gt;정말 친절하시게도 논문 2편을 보내주셨다.&lt;br /&gt;이 논문은 김묘실씨와 강승식 교수님의 작품이다.&lt;br /&gt;&lt;br /&gt;관련된 논문은 많이 있지만... 한국에서 비슷한 연구를 수행했다니 신기했다.&lt;br /&gt;역시... 악성 댓글로 머리 아픈 한국에서 이런 연구 하나 없었다면 말이 되지 않겠지만...&lt;br /&gt;&lt;br /&gt;SVM을 이용한 이유는 누차 얘기했지만...&lt;br /&gt;Turney의 논문에 따른 결과라고 할 수도 있겠고,&lt;br /&gt;직관적으로 비방과 비방이 아닌 글의 2 그룹으로의 분류이기 때문이기도 하다.&lt;br /&gt;&lt;br /&gt;SVM을 이용하기 때문에 적절한 feature를 뽑아내는 게 가장 중요한 일이다.&lt;br /&gt;본 논문에서는 적절한 feature들을 뽑기위해 HAM(형태소 분석기)을 이용해 악성 댓글에서 자주 쓰이는 단어나, 서술어를 뽑아 data화 하였다.&lt;br /&gt;그 후 SVM을 적용해 trainng하였고, test하였다.&lt;br /&gt;&lt;br /&gt;평가 결과는 다음과 같다.&lt;br /&gt;먼저 긍정적인 댓글에 대한 결과이다.&lt;br /&gt;Accuracy = 0.615&lt;br /&gt;Precision = 0.505&lt;br /&gt;Recall = 0.79&lt;br /&gt;F1-measure = 0.62&lt;br /&gt;&lt;br /&gt;악성 댓글에 대한 실험 결과는 10-fold cross validation방식으로 측정하였다.&lt;br /&gt;cross validation이란 한 data set을 2개로 나눠서 하나는 training으로 다른 하나는 test로 이용하는 것이다. k-fold cross validation은 data set을 k개로 나누고, 하나는 test로 다른 k-1개의 data는 training으로 이용하는 것이다.&lt;br /&gt;&lt;br /&gt;여기서는 대략 70%정도의 F1-measure결과가 나왔다.&lt;br /&gt;&lt;br /&gt;70%정도의 성능이라면 대단히 우수하다고 볼 수 있지만,&lt;br /&gt;data set의 크기를 고려해보면 아직 유의한 결과라고 볼 수 없다.&lt;br /&gt;더 큰 data set을 고려해서 test한 결과를 생각해 보아야 할 것이다.&lt;br /&gt;&lt;br /&gt;주목할 만한 결과는 명사만을 feature로 선택했을 경우가 다른 품사를 포함하는 경우보다 성능이 1.1%정도 높았다고 한다. 1.1%면 유의한 의미를 지닌다고 얘기하기 힘들수도 있겠지만...&lt;br /&gt;또한, 어절자체를 포함한 경우가 어절을 포함하지 않고 명사만을 고려한경우보다 1.5%정도 성능 향상의 결과를 가져왔다. 이것은 네티즌들이 유행처럼 사용하는 신조어의 영향 때문이라고 보았는데 이런 신조어가 악성 리플에 자주 등장한다고 볼 수 있겠다. 또한 이런 신조어를 잘 살펴보는 것이 악성 댓글 검출의 성능 향상시킬 수 있는 방법이 될 수도 있다고 할 수 있다. &lt;br /&gt;여기서도 100자 미만의 문장 내에서 파악할 수 있는 감정의 크기의 한계가 드러난다는 언급이 있다.&lt;br /&gt;&lt;br /&gt;이 논문에서의 한계점을 또 지적하자면.&lt;br /&gt;무엇보다 인터넷 상에서 다양한 파생어가 발생하고,&lt;br /&gt;자주 쓰이는 것들을 고려하기 위해선 자동적으로 단어 data를 만들고 이들의 sement orientation을 찾는 알고리즘이 적용되어야 한다.&lt;br /&gt;또한 성능 개선을 위해 , text에서 단어들로 구분 되지 않는 룰들도 적용되어질 수 있을 것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;그건 그렇고....&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;형태소 분석기를 도데체 어디서 구할 수 있을까....&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;한국어 형태소 분석기는 너무 구하기가 힘들다..&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;이런 문제에 부딪힐 줄이야.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-8205204049760790112?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/8205204049760790112/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=8205204049760790112' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/8205204049760790112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/8205204049760790112'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/svm.html' title='SVM을 이용한 악성 댓글 판별 시스템의 설계'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-4800955334897535013</id><published>2007-08-09T22:25:00.000+09:00</published><updated>2007-08-10T11:15:18.438+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion mining'/><title type='text'>Opinion Analysis based on Lexical clues and their expansion</title><content type='html'>2007년 ICU 봄학기 IR수업에서 프로젝트로 했던 것과 연관된 한 논문이다.&lt;br /&gt;이때... IR 수업을 들었어야 했는데...&lt;br /&gt;&lt;br /&gt;너무 너무 아쉽다...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;그래도 지나간 일은 어쩔 수 없으니 사설은 그만하고 시작해볼까.&lt;br /&gt;논문은 IR랩의 김영호씨와 맹성현 교수님의 작품이다.&lt;br /&gt;&lt;br /&gt;Opinion analysis는 기본 개념에 대해서 앞선 글에서 자세히 다뤘기 때문에 어려운 내용은 아니다. 이 논문에서는 기존 Opinion analysis에서는 다루지 않았던 opinion holder를 찾는 문제도 포함하고 있다.&lt;br /&gt;&lt;br /&gt;논문은 세가지 문제를 다루고 있는데 subjectivity를 파악하고 semantic orientation을 찾고 마지막으로 opinion holder를 찾는 것이다.&lt;br /&gt;&lt;br /&gt;System을 자세히 살펴보자.&lt;br /&gt;1)Determining the subjectivity and its polarity&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-4800955334897535013?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/4800955334897535013/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=4800955334897535013' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/4800955334897535013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/4800955334897535013'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/opinion-analysis-based-on-lexical-clues.html' title='Opinion Analysis based on Lexical clues and their expansion'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-2354635496231303260</id><published>2007-08-09T21:05:00.000+09:00</published><updated>2007-08-09T21:07:55.423+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Image Processing'/><title type='text'>Histogram equalization</title><content type='html'>웬 뜬금 없는 Image Processing이냐 하시겠지만,&lt;br /&gt;처음 관심 있었던 것이 사용자 표정 인식이었었기 때문에...&lt;br /&gt;&lt;br /&gt;히스토그램 균등화란 gray-level에서 좁은 영역에 존재하는 픽셀들을 gray-level 전 영역으로 확장시켜 이미지의 pixel 값들이 전체 gray-level에 넓게 퍼져 이미지가 좀 더 잘 보이도록 만드는 것이다.&lt;br /&gt;&lt;br /&gt;예를 들면 만약 한 이미지가 gray-level 0에서 10에 분포하고 있다고 하자. 이러한 이미지는 너무 어두워 식별하기가 거의 불가능 하다. 이때 Histogram Equlalization을 사용해서 0-10의 gray-level에 존재하는 pixel값들을 0-255등의 넓은 영역의 gray-level로 확장시킨다. 그러면 어두워 식별이 어려웠던 이미지가 개선되어질 것이다.&lt;br /&gt;&lt;br /&gt;수식으로 복잡한 Histogram Equalization을 한 예로 이해해 보자.&lt;br /&gt;앞서 설명한 것처럼 0-10의 gray-level에 픽셀들이 다음 처럼 존재한다고 생각하자.&lt;br /&gt;gray-level                     pixel개수&lt;br /&gt;0                                  5&lt;br /&gt;1                                  5&lt;br /&gt;2                                  3&lt;br /&gt;3                                  2&lt;br /&gt;4                                  8&lt;br /&gt;5                                  10&lt;br /&gt;6                                  3&lt;br /&gt;7                                  5&lt;br /&gt;8                                  1&lt;br /&gt;9                                  2&lt;br /&gt;10                                 6&lt;br /&gt;&lt;br /&gt;Step1 : pixel의 전체 개수를 구한다.&lt;br /&gt;5 + 5 + 3 + 2 + 8 + 10 + 3 + 5 + 1 + 2 + 6 = 50&lt;br /&gt;&lt;br /&gt;Step2 : 각 gray-level의 확률 분포를 구한다.&lt;br /&gt;gray-level                   누적 확률&lt;br /&gt;0                                5/50 = 0.1&lt;br /&gt;1                                (5/50 = 0.1) + 0.1 = 0.2&lt;br /&gt;2                                (3/50 = 0.06) + 0.2 = 0.26&lt;br /&gt;3                                (2/50 = 0.04) + 0.26 = 0.3&lt;br /&gt;4                                (8/50 = 0.16) + 0.3 = 0.46&lt;br /&gt;5                                (10/50 = 0.2) + 0.46 = 0.66&lt;br /&gt;6                                (3/50 = 0.06) + 0.66 = 0.72&lt;br /&gt;7                                (5/50 = 0.1) + 0.72 = 0.82&lt;br /&gt;8                                (1/50 = 0.02) + 0.82 = 0.84&lt;br /&gt;9                                (2/50 = 0.04) + 0.84 = 0.88&lt;br /&gt;10                              (6/50 = 0.12) + 0.88 = 1.0&lt;br /&gt;&lt;br /&gt;Step3 : 확장하고 싶은 gray-level의 최대 값을 각 확률에 곱해 전 영역에 골고루 퍼지도록 한다.&lt;br /&gt;gray-level                   균등화된 새로운 gray-level 값&lt;br /&gt;0                                0.1 * 255 = 25.5(반올림) = 26&lt;br /&gt;1                                0.2 * 255 = 51&lt;br /&gt;2                                0.26 * 255 = 66.3 = 66&lt;br /&gt;3                                0.3 * 255 = 76.5 = 77&lt;br /&gt;4                                0.46 * 255 = 117.3 = 117&lt;br /&gt;6                                0.66 * 255 = 168.3 = 168&lt;br /&gt;7                                0.72 * 255 = 183.6 = 187&lt;br /&gt;8                                0.82 * 255 = 209.1 = 209&lt;br /&gt;9                                0.84 * 255 = 214.2 = 214&lt;br /&gt;10                              0.88 * 255 = 224.4 = 224&lt;br /&gt;&lt;br /&gt;Step4 : 이제 다시 이미지를 그려준다.&lt;br /&gt;0의 gray값을 같던 pixel들은 26의 그레이 값으로,&lt;br /&gt;4의 gray값을 같던 pixel들은 117의 그레이 값으로,&lt;br /&gt;10의 gray값을 같던 pixel들은 224의 그레이 값으로, 등등&lt;br /&gt;&lt;br /&gt;결국 0-255의 전체 그레이레벨로 확장될 것이다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-2354635496231303260?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/2354635496231303260/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=2354635496231303260' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2354635496231303260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2354635496231303260'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/histogram-equalization.html' title='Histogram equalization'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-6902706171862241961</id><published>2007-08-09T16:03:00.000+09:00</published><updated>2007-08-09T16:04:52.359+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='넋두리'/><title type='text'>양신규 교수님의 글</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;p&gt;정치에 대해서 그다지 관심도 없고, 존경도 없는 사람 중에 한 사람이지만, &lt;/p&gt;&lt;p&gt;간혹 이런 생각하게 하는 글이 있어서 읽어보고는 합니다. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;물론 양신규 교수님의 생각에 전적으로 동감하는 바는 아니지만, 읽어볼만 하네요.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;이 글의 원문은 &lt;a title="여기에서 보실 수 있습니다." href="http://neo.urimodu.com/bbs/zboard.php?id=forum_epolitics&amp;amp;page=7&amp;sn1=&amp;amp;amp;divpage=1&amp;sn=off&amp;amp;ss=on&amp;sc=on&amp;amp;select_arrange=name&amp;desc=desc&amp;amp;no=631" target="_blank"&gt;여기에서 보실 수 있습니다.&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;번호 279 날짜 1998년 11월 91일 55시 44분&lt;br /&gt;이름 양신규(skyang) 조회수 3&lt;br /&gt;제목 우파혁명가 떨어지다: The Fall of Newt Gingrich&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;나의 1994 년 글 깅그리치 vs. 클린튼 을 기억하는 사람은 내가 클린튼만이 아니라 뉴트 깅그리치에도 깊은 존경심과 애정이 있다는 것을 눈치 채고 있을 것이다.(이걸 또 미국 편향이라고 왜곡하는 조선일보나 문XX 같은 중상모략군이 있을까봐 미리 말하면; 난 그들보다 김대중, 김영삼, 김종필 씨를 더 존경하니깐 씰데없는 걸로 뒤에서 씹고 다니지 말기 바란다. 이씨 조선은 원균같은 중상모략군들 땜에 망했고, 남한이 망하면 조선일보, 문XX, 이XX, 박XX 같은 좀생이 중상모략군 들 땜에 망할 것이다. 고런 모략군들을 제어하는 방부제로 옮겨놓은 글이 저 아래 딴지일보의 글이다.)&lt;br /&gt;&lt;br /&gt;내가 깅그리치나 빌 클린튼을 존경하는 이유는 세 가지, 하나는 자신의 철학적 정치적 노선에 대해 진지하고 정직하다는 점이고, 다른 한가지는 그 노선을 유지하면서도 실제적 정치 프로세스에서 승리할 수 있는 현실적 능력이다. 그리고 마지막으로는 깡촌의 노동계급출신의 홀어머니 밑에서 자란 주제에 어렸을 때부터 가슴에 가공할 만한 야망을 품고, 어느 경우에도 그 야망을 버리지 않고 결국 성취해낸 뛰어난 능력과 그 굳건한 의지 때문이다. 아마 우리나라 삼김씨를 비롯해서 세계적으로 위대한 정치 지도자들에게서 공통적으로 발견되는 강점일 것이다.&lt;br /&gt;&lt;br /&gt;신자유주의 정치운동의 영웅 뉴트 깅그리치가 주적으로 삼은 대상은 역사적 사명을 다하고 사라져가는 관료주의 국가체제다.&lt;br /&gt;&lt;br /&gt;20세기 전반에 대공황과 두 차례 세계대전을 거치면서 소유-경영 일체의 자본가 계급은(아담스미스와 마르크스의 분석대상인 자본가 계급으로 우리나라의 재벌 가족에 해당함) 정치경제 영역에서의 권력을 상실한다. 생산대중과 연합해 이들을 몰아내고 새롭게 정치경제의 권력을 장악한 세력이 바로 관료적 파워엘리뜨 계층이다. 소련의 볼세비키 체제, 중국 일당독재체제, 미국의 뉴딜체제, 일본의 관료주의 체제, 유럽의 코포러티즘 (사민주의 체제)의 일관된 공통점은 바로 이 관료적 지배질서이다.&lt;br /&gt;&lt;br /&gt;이 쇠창살 (iron cage) 관료 체제의 등장을 제대로 예언한 사람이 이십세기 초의 막스 베버이고; 19세기자본가계급위주의 자유방임경제체제에서 20세기 관료적 지배로의 전이과정을 알아챈 사람이 금세기 중반의 폴라니 이며; 부패해 가는 이 체제의 문제점을 알아챈 사람이 역시 금세기 중반의 C. 라이트 밀즈이다.&lt;br /&gt;&lt;br /&gt;이 관료주의 국가체제는 1930년대의 대공황과 두차례의 세계대전을 거치면서 이전의 모든 전근대적 근대적 국가체제를 완벽하게 대치한다. 이 새로운 현대 관료주의적 국가체제는 이전의 영국식 자유방임적 국가체제; 프랑스식 보나빠띠즘식 국가체제; 독일, 일본, 이탈리아의 파시즘적 국가 체제를 차례로 무너뜨리고 세계를 전일적으로 재편하는 것이다. (연관된 얘기로 독일, 일본, 남한의 파시즘과 재벌과의 관계에 대한 간단한 노트가 다음에 올라온다. )&lt;br /&gt;&lt;br /&gt;아무튼, 경제적으로는 테일러-포디즘에 기반하고 정치적으로는 관료주의에 기반한 관료국가체제는 파시즘이라는 참혹한 종말적 범죄로부터 지구를 구하는 위업을 달성하지만, 인류의 공적인 파시즘을 무너뜨리자 마자 곧 부패의 길로 들어선다. 소위 자본주의 진영과 사회주의 진영이라고 억지로 가공의 적을 만들어내어 전국민을 공포 속으로, 세계를 핵전쟁의 위협에 몰아넣는다. 서방에서는 매카시적 반공주의의 광풍이 소련과 중국 등의 블록에서는 반자유주의적 광풍이 불어 양측모두 반인류적인 제국주의적 범죄와 타락의 길로 들어서는 것이다. 서방은 국가 개입의 케인즈주의로, 동구권에서는 스탈린의 일국 사회주의론으로 이론적 무기를 삼고 세계 민중을 죽음의 공포 바로 앞으로 몰아세운다.&lt;br /&gt;&lt;br /&gt;한국 전쟁과 월남전은 바로 이렇게 타락해가는 냉전하의 관료 국가체제의 모순을 적나라하게 노정한 사건이다. 그 이후 계속되는 박정희 지원, 전두환 지원 등을 통해 미국의 관료국가의 반동성은 한반도에서도 지속적으로 노정된다. 언젠가 모든 먼지가 걷히면 한국전쟁과 광주학살에 대한 배상을 미국 정부로 부터 반드시 받아내야 한다. 반인류적 범죄에 대한 책임과 배상은 천년이 지난 다음에도 반드시 이루어져야 한다.&lt;br /&gt;&lt;br /&gt;그렇기 때문에 1960년대 후반과 1970년대 초반 케네디-존슨-닉슨 행정부와 군산복합체를 상대로한 미국 학생들의 월남전 반전운동은 바로 지구 구하기 독수리 오형제적인 영웅적인 투쟁이었다. 이 반전운동과 궤를 같이한 유럽의 학생운동 역시 그 빛나는 성과를 물려 받아야 마땅하다. 물론 1980년대 한반도에서의 미 제국주의에 대한 투쟁 또한, 제국주의적 관료국가에 대한 반미운동으로 영웅적 투쟁으로 정당하게 역사적 업적을 인정받아야 한다. (북한은 그냥 넘어가자. 잘못말했다가 조선일보나 문XX에게 꼬뚜리 잡힐 테니...)&lt;br /&gt;&lt;br /&gt;이 지구를 구하는 대투쟁의 선봉에 섰던 세대 (미국의 빌 클린튼, 앨 고어, 영국의 토니 블레어, 프랑스의 조스팽, 독일의 슈뢰더, 애고 이탈리아는 그 누구냐. . .) 가 40-50 대가 되어서 세계 정치의 전면에 나서고 있는 것은 결코 우연이 아니고 전지구적인 민주화투쟁 세대의 정당한 권력 쟁취과정으로 읽어줘야 한다.&lt;br /&gt;&lt;br /&gt;부패한 관료국가체제의 종말기에 대담하게 끼어들어 영광을 나꿔채려던 세력이 바로 신자유주의 정치 동맹이다. 정치적으로는 소위 경제적 보수주의와 사회적 도덕주의의 결합이고, 계급적으로는 관료들과 전문경영자들에게 권력을 상실한 대자본가, 중소자본가 계급과 새로운 지식노동자 상층의 연합체인 이 신자유주의는 바로 케인즈와 스탈린 체제를 동시에 전면적으로 부정하며 1980 년부터 세계를 풍미한다.&lt;br /&gt;&lt;br /&gt;이 신자유주의 정치운동의 영웅들이 바로 마아가렛 대처, 헬무트 콜, 뉴트 깅그리치이다. 그들의 이론적 지주는 물론 1960년대 이후 줄기찬 이론적 투쟁을 해온 밀튼 프리드만, 게리 베커, 밥 루카스 등의 노벨상급의 시카고학파 경제학자들이다. 신자유주의 정치운동은 18세기 부르조아 자유주의 정치운동과 같은 것이다. 노동계급이 서방에서건 동방에서건 관료국가체제의 포로가 되어 냉전논리로 내몰리고 있을 때, 이들 대자본가, 중소자본가, 상층지식노동자들은 반케인지안적 반스탈린적 자세를 선명하게 견지하고 전지구적인 해방운동에 나서는 것이다.&lt;br /&gt;&lt;br /&gt;마치 18세기 부르조아들이 생산대중과 연대하여 생산력과 인간의 자유를 중세적 속박에서 해방시키는 선도에 나서듯이, 신자유주의동맹의 자본가와 상층지식노동자 연합은 관료주의적 거미줄에 걸려 헤메는 손노동계층과는 달리 이 거미줄에서 비교적 자유로운 새롭게 광범하게 성장하는 지식노동자를 동원 신자유주의적 혁명을 이루어 낸다.&lt;br /&gt;&lt;br /&gt;신자유주의적 정치 강령을 가장 선명하게 엮어낸 이가 바로 뉴트 깅그리치이다. 그의1994 년 소위 공화당 혁명의 '미국과의 계약'(Contract of America)이야말로 신자유주의적 정치운동의 압권이고, 그는 40 년 만에 상하 양원을 공화당이 장악하는 대사건의 주역이 된다.&lt;br /&gt;&lt;br /&gt;노동계급과 좌파세력이 스탈린주의와 케인지안적 냉전적 사고에서 헤메는 동안 대신 진보적 입장에 서왔던 신자유주의가 이제 그 역사적 사명을 다하고 다시 진보세력에게게 세계적 패권을 서서히 넘겨주고 있다. 독일의 지난달 총선에서의 사회당 집권과 이번달 미국 총선후 뉴트 깅그리치의 사임은 이 전지구적 권력이동을 상징하는 멋진 사건이다.&lt;br /&gt;&lt;br /&gt;나의 영웅 우파 혁명가 뉴트 깅그리치여, 편히 쉬기를. 그대는 위대한 인생을 살았다. 그대는 자본가를 동원 혁명을 성공시켰으나, 생산대중이 요구하는 진짜 진보의 방향을 읽지 못해서 클린튼-고어 에게 질 수 밖에 없었다.&lt;br /&gt;&lt;br /&gt;한국은 어디 뉴트 깅그리치같은 우파 혁명가 없나? 재벌-관료 연합의 체제를 쓸어버릴 대담한 혁명가 말이다.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-6902706171862241961?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/6902706171862241961/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=6902706171862241961' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/6902706171862241961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/6902706171862241961'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/blog-post_3614.html' title='양신규 교수님의 글'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-3966523666266833895</id><published>2007-08-09T11:04:00.000+09:00</published><updated>2007-08-09T15:25:52.397+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion mining'/><title type='text'>Turney의 논문을 통해 본 Opinion mining</title><content type='html'>&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;Measuring Praise and Criticism : Inference of Semantic Orientation from Association&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The evaluative character of a word is called its semantic orientation.&lt;br /&gt;&lt;br /&gt;semantic orientation이라는 말은 text를 이용한 감정인식인 emotion detection of text, text mining, opinion mining 등에서 자주 볼 수 있는 단어이다. 지금 살펴 볼 논문은 이러한 이와 같은 분야에서 다루는 Gloss, valence, evaluative character 등에 대한 개념을 이해하고 opinion mining에 있어서 중요한 착수점이 되는 연구에 대한 것이다.&lt;br /&gt;&lt;br /&gt;1. Introduction&lt;br /&gt;subjective meaning에 대한 초창기 연구에서, Osgood 등은 사람들에게 어떤 단어에 대해 점수를 매기게 했다. 각각의 단어는 달콤한/신, 남루한/세련된, 신성한/불경스런 과 같은 대립되는 두 단어 사이에서 7단계로 나눠진 등급 중에 하나로 점수가 매겨진다. 많은 실험 data를 이용해 Osgood 등은 사람들이 점수를 매기는 두 형용사 쌍들에서 3가지 중요한 factor를 발견하였다.&lt;br /&gt;&lt;br /&gt;사람들은 대부분 몇개의 형용사 싸에 점수를 매겼다.&lt;br /&gt;첫번째 가장 주된 쌍은, good/bad beautiful/ugly kind/cruel honest/dishonest 였다. Osgood 등은 이 쌍들을 evaluative factor라고 불렀다.&lt;br /&gt;두번째 쌍들은 potency factor라고 불렸는데, strong/week large/small heavy/light 였다.&lt;br /&gt;세번째 쌍들은 activity라고 불렸으며, active/passive fast/slow hot/cold 였다.&lt;br /&gt;&lt;br /&gt;evaluative factor는 이후 sematic orientation이라고 불리기도 하고, valence라고 불리기도 하며 언어학에 관련되어 중요한 factor로 쓰이게 되었다. semantic orientation은 positive, negative한 특성으로 분류할 수 있으며 또한 strong,mile와 같은 특성으로도 분류할 수 있다.&lt;br /&gt;&lt;br /&gt;사실 각 단어들에 대해서 sematic orientation을 결정하는 것은 개개인의 주관적 관점에 의해서 다를 수 있다고 생각되지만, 여러 연구 결과에서 sematic orientation이 상당한 일치를 보이는 상황을 볼 수 있으며 이를 통해 어떤 단어들에 대해선 지배적인 sematic orientation이 존재함을 알 수 있다.&lt;br /&gt;&lt;br /&gt;2. Application&lt;br /&gt;semantic orientation을 이용한 Application은 여러 분야에 걸쳐 나타날 수 있다.&lt;br /&gt;예를 들면,&lt;br /&gt;1)자동적으로 동의어와 반대말을 찾는 시스템(Hatzivassiloglou and McKeown(1997)),&lt;br /&gt;2)영화 감상평에 대해서 긍정적 반응, 부정적 반응을 구분하는 시스템(Turney 2002)),&lt;br /&gt;3)검색에 반영할 수도 있고(예를 들면 파리 여행 : positive인 경우 목적에 더 부합하는 질의 결과를 얻을 수도 있을 것이다.(Hearst 1992)),&lt;br /&gt;4)리뷰 요약으로 긍정 리뷰로 판명된 경우 가장 긍정적 문장을 보여줄 수도 있을 것이며,&lt;br /&gt;5)악플에 대한 filtering 기능을 제공 할 수도 있을 뿐만 아니라(Spertus 1997),&lt;br /&gt;6)Timelines에서 sentiment를 펼쳐 볼 수도 있다.(Tong 2001)) 이것은 advertiser, p0litician들이 여론을 파악하거나 광고 효과를 파악하는데 도움을 줄 수 있다.&lt;br /&gt;7)게임이나 chatbot같은 application에도 보다 더 현실적인 느낌을 주는데 이용될 수도 있다.&lt;br /&gt;8)마지막으로 survey resplonse들에 대한 분석에도 이용될 수 있다.&lt;br /&gt;&lt;br /&gt;3.Semantic orientation from association&lt;br /&gt;논문에서는 semantic association으로 부터 semantic orientation을 추론하고자 한다.&lt;br /&gt;한 단어의 semantic orientation은 positive한 단어들 집합과의 연관 정도에서 negative한 단어들 집합과의 연관 정도를 뺀것으로 계산된다.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://docs.google.com/File?id=ddvzq6wf_2cd8xsqcn" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;여기서 pword, nword는 문맥에 관계하지 않고 일반적으로 positive한, 또는 negative한 의미를 지니는 단어들을 선별할 필요가 있다. &lt;/p&gt;&lt;p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;여기서 사용된 positive한 단어들 집합은&lt;br /&gt;good, nice, excellent, positive, fortunate, correct, superior이다.&lt;br /&gt;그리고 negative한 단어들 집합은&lt;br /&gt;bad, nasty, poor, negative, unfortunate, wrong, inferior이다.&lt;/p&gt;&lt;p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;그렇다면 이 연관정도를 나타내는 A(Word1, Word2)는 어떻게 계산하는 걸까? 이 계산 방법엔 여러가지 알고리즘들이 있다. 본 논문에서는 2가지 알고리즘을 소개하고 있다.&lt;br /&gt;&lt;br /&gt;1)Sematic orientation from PMI&lt;br /&gt;Turney2001은 Pointwise Mutual Information이라는 방법을 이용해 연관 정도를 측정하였는데, 이 방법의 성능은 TOEFL에서 동의어 80개를 찾아내는 문제에서 74% 정확도를 보였다. &lt;/p&gt;sematic orientation, 즉 그 단어가 가지고 있는 근원적 의미(여기서는 positive한 단어들과 netgative한 단어들과의 상관 관계이지만...)를 어떻게 찾을 수 있을까? 직관적으로 sematic orientation을 정의할 수 있는 또 다른 언어들(good, nice등등)이 있을 것이며, 아마도 이러한 단어들은 전혀 관계없는 단어들보다 더 자주 같이 쓰일 것이라고 생각할 수 있다. PMI는 이러한 직관에 의거하여 연관 정도를 계산한다.&lt;br /&gt;&lt;br /&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;img src="http://docs.google.com/File?id=ddvzq6wf_3gth5tmdj" /&gt;&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;P(word1&amp;word2)는 word1, word2가 동시에 발생할 확률이다. 이것을 측정하기 위해 Turney는 Altavista 검색 엔진을 이요했다. 알타비스타는 350만개의 웹 페이지를 가지고 있다.(영어로 씌여진...) 각 페이지 마다 300개 정도의 단어가 있다고 가정할 때 적어도 척억개 이상의 단어가 있다고 할 수 있다. 알타 비스타를 쓴 이유는 이 당시 이 검색 엔진에서 NEAR 연산자를 쓸 수 있었는데, NEAR 연산자는 가까운 거리에 2 단어가 쓰여진 웹 페이지를 검색한다. 상대적으로 먼 거리에서 같이 씌여진 2단어는 연관성이 없을 수 있음을 감안한 것이라고 볼 수 있다.&lt;br /&gt;&lt;br /&gt;Hit수를 이용해 p(word1, word2)를 계산하면 다음과 같은 식을 생각할 수 있다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;img src="http://docs.google.com/File?id=ddvzq6wf_4cgxb3pd6" /&gt;&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;N은 웹 검색 엔진이 indexing한 전체 document숫자이고 hit함수는 해당 질의어로 검색된 web page 수이다. 이를 이용해 SO-PMI(word)를 계산해보면&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;img src="http://docs.google.com/File?id=ddvzq6wf_5cj47ksgk" /&gt;&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;과 같이 유도 될 수 있다.&lt;br /&gt;14개의 postive, negative word를 이용한 질의를 통해 SO-PMI가 계산되며 hits(nword), hits(pword)는 상수값이다. 다른 연관정도 계산 방법으로 Maniing과 Schutze(1999)방법이 있을 수 있고, Dunning(1993)이 제안한 likelihood ratio사용 방법이 있을 수 있다.(Z-score) 그러나 이 두 방법의 성능은 PMI보다 좋지 않은 것으로 알려져 있다.&lt;br /&gt;0으로 나누지 않기 위해 여기서는 hits함수 결과에 0.01을 더하는 방법을 취했고 이는 laplace smoothing효과를 가져온다고 한다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;2)Sematic orientation from LSA&lt;br /&gt;SO-LSA방법은 연관 정도를 계산하기 위해서 Latent Semantic Analysis(LSA)를 이용한다. LSA는 corpus내의 단어들 사이의 통계적 관계를 분석하기 위해 Singular Value Decomposition을 이요한다.(아직은 무슨 말인지 알 수 없을 것이다.)&lt;br /&gt;먼저, Matirx X를 만들기 위해서 text를 이용하는데 X의 row vector는 단어들을 나타내고 column vector는 단어 묶음(즉, sentences, paragraphs, documents)를 나타낸다. 각각의 cell은 한 chunk of text에 대한 한 단어의 가중치(weight)이다. 이 weight는 전형적으로 if-idf score로 계산된다.&lt;br /&gt;그 다음으로, singular value decomposition을 Matrix X에 적용시킨다.&lt;br /&gt;&lt;br /&gt;LSA는 PCA(Principal components analysis)와 유사하다. LSA는 original Matrix X대신에 축소형태로 smoothed matrix를 사용해(SVD를 이용) 단어들의 유사도를 측정한다.이 유사도는 LSA(Word1, Word2)로 표현되고 SVD가 적용된 Matrix의 row vector들 사이의 cosine of the angle을 취해 측정된다. 즉!!! 앞서 단어들 사이의 연관 정도가 단어들 사이의 유사도라는 개념으로 측정되는 것이다. 직관적으로 방법은 다르지만 일견 비슷해 보이는 면이 있어 보이지 않는가?&lt;br /&gt;&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;img src="http://docs.google.com/File?id=ddvzq6wf_6hfqnr5pf" /&gt;&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;LSA방법은 유사도를 consine of angle로 측정하기 때문에 값이 작을수록 더욱 유사한 값이 나오게 된다.&lt;br /&gt;따라서, PMI와는 반대로, PMI값이 양일때 단어가 positive했던것과는 달리 LSA에서는 negarive하다고 볼 수 있다.&lt;br /&gt;값이 음으로 나올때는 그 반대의 경우이다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;4.Related work&lt;br /&gt;관련 연구는 크게 3가지 그룹으로 나눌수 있다.&lt;br /&gt;단어를 positive, negative semantic orientation으로 분류하는 연구&lt;br /&gt;리뷰들을 positive, negative로 분류하는 연구&lt;br /&gt;text내에서 주관성을 인식하는 연구들이 그것이다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;1)Classifying Words&lt;br /&gt;Hatzivassiloglou and McKeown(1997)은 앞에서 연관 정도, 유사성에 대해서 살펴본 것처럼 semantic orientation을 결정하는 문제가 곧 단어를 분류하는 문제라고 생각했다. 그들은 4 단계의 supervised learning algorithm을 세웠는데 HM이라고 불리는 알고리즘이다.&lt;br /&gt;-1 : adjectives의 모든 conjunctions들이 주어진 corpus에서 추출된다.&lt;br /&gt;-2 : supervised learning algorithm이 단어들을 같은 semantic orientation을 갖는 것 끼리 묶고, 다른 semantic orientationd을 갖는 것들을 분류하는 방법으로서 label 쌍으로 된 adjectives들과 연관시킨다. 결과적으로 adjectives이 노드가 되고 link들은 같거나 다른 semantic orientation을 가리키는 graph가 된다.&lt;br /&gt;-3 : clustering algorithm을 통해 같은 semantic orientation을 갖는 것들끼리 묶어서 크게 2가지 묶음(same, different)으로 묶는다.&lt;br /&gt;-4 : positive adjectives가 보다 더 빈번하게 나타나기 때문에 higher average frequency를 갖는 cluster를 positive semantic orientation을 갖는 그룹이라고 한다.&lt;br /&gt;&lt;br /&gt;evaluation결과 training set이 늘어날 수록 HM의 accuracy는 향상 되었다. 이 결과를 볼때 큰 corpora에서 HM의 성능은 더욱 만족할 만할 것이라고 예측했다. 하지만, HM은 and나 or를 이용한 단어를 분류를 하기 때문에 동사나 명사에 대해서는 성능이 좋지 않을 것이다. 예를 들면 "나는 달리기가 빠르지만 걸음은 느리다."를 영어로 풀어볼때, but으로 묶이는 단어가 fast, slow이므로 adjective에는 만족할 만하지만 "사랑과 죽음", "로마제국의 성장과 몰락"같은 경우 전혀 이상한 점이 없지만 and로 묶인 두 단어들이 positive, negative한 반대 양상을 띈다. 이 경우에 효과적으로 대처하지 못하는 맹점이 있다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;2)Classifying Reviews&lt;br /&gt;Turney(2002)는 리뷰를 분류하기 위해 3단계 알고리즘을 세웠다.&lt;br /&gt;-1 : 한 단어는 형용사나 부사로 이루어진 두 단어구를 찾는다.(ex romantic ambience, horrific events)&lt;br /&gt;-2 : 찾아진 구들에 대해서 각각 semantic orientation을 SO-PMI를 이용해 계산한다.&lt;br /&gt;-3 : 계산된 값들의 평균을 취해 분류한다.&lt;br /&gt;&lt;br /&gt;연구 결과가 한 단어나 구들에 SO-PMI를 적용했을때 어떤 작용이 일어나 효과를 일으키는지 원리를 밝혀주지는 못하지만, 성능 면에서는 유용하다고 할 수 있다.&lt;br /&gt;한 단어만을 고려한다고 볼때는 각 단어에 대해서 manual하게 semantic orientation을 주석을 다는 것도 효과적인 방법일 수 있겠지만, 두 단어 이상을 함께 고려한 semantic orientation을 application에 응용하게 될 때는 그 노력의 크기가 비교할 수 없을 정도로 커지게 된다. 그러한 의미에서 Tuney의 So-A 방법은 automatic한 측면에서 의미가 있다. 또한 두 단어 이상의 semantic orientation의 필요성은 각 domain에 따라 같은 단어의 semantic orientation이 다를 수 있음을 생각해 보면 알 수 있다. 예를 들면, unpredictable이란 단어는 자동차에 대한 리뷰에서는 negative한 semantic orientation을 갖는다. "unpredictable steering"과 같은 경우를 생각해 보자. 한편, 영화 리뷰에서는 "unpredictable plot"처럼 unpredictable이 positvie한 semantic orientation을 갖는다고 볼 수 있다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;Pang 일행(2002)은 movie review를 positive, negative한 종류로 구분하는 방법에 있어서 고전적인 text classification 방법들을 적용했다. Pang일행은 세개의 supervised learning algorithm과 8개의 feature set들을 비교하였다. 총 24번의 조합 중에서 가장 좋은 결과를 낸 것은 feature집합이 한 단어들로 이뤄져 있고, 각 단어가 있고 없고에 상관하여(출현횟수와는 상관없이) SVM(Support vector machine)을 적용했을때였다. Pang의 알고리즘이 Tuney에 비해 더 정확할 것이라고 기대하는 이유는 Pang의 알고리즘이 supervised learning algorithm이기 때문이다. 한편, 각각의 domain에 따라 retraining이 필요할 것이라고 예상되는데 그 이유는 앞에서 본 자동차 리뷰와 영화 리뷰를 생각해 보면 알 수 있을 것이다.&lt;br /&gt;&lt;br /&gt;3)Subjectivity Analysis&lt;br /&gt;subjectivity analysis는 글자 그대로 주관이 들어간 글과, 사실을 전하는 글을 구별하는 일을 의미한다.[wiebe 2000; wiebe et al.2001] wiebe등은(2001) 자동적으로 주관이 들어간 글을 구별하는 작업은 매우 다양한 응용 분야에 쓰일 수 있다고 언급했다. flames를 인식하는 것(Spertus, 1997), email을 분류하는 것, radio 방송에서 speaker 역할을 분류하는 것, review들을 분류하는 것 등등이 그 예이다.&lt;br /&gt;물론 위에서 언급한 application들이 sematic orientation과 직접적으로 관련이 있을 수 있다고 할 수도 있지만, 일반적으로 2 단계 방법을 취한다. 먼저 subjectivity를 확인하고 그 다음 positive, negative한 것들로 구분하는 것이다.&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;/div&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;논문에는 Experiments결과도 상세히 적혀 있고, opinion mining이나 text mining 을 연구하고자 하는 사람들은 주의 깊게 살펴볼 내용도 있다. 하지만, 일단은 개략적으로 opinion mining이 뭔지, semantic orientation이 뭔지, 기본 개념에 충실하기 위해 이 정도 까지 살펴보도록 하자. 뭔가 신기한 개념들이 보이지 않는가? 적어도 재미있는 application으로의 활용 가능성은 볼 수 있지 않을까? &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-3966523666266833895?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/3966523666266833895/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=3966523666266833895' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/3966523666266833895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/3966523666266833895'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/measuring-praise-and-criticism.html' title='Turney의 논문을 통해 본 Opinion mining'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-6565368139309543426</id><published>2007-08-07T15:17:00.000+09:00</published><updated>2007-08-09T21:46:37.466+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Information Retrival'/><title type='text'>IR Chapter2 Modeling - 3 전형적 모델 외 다른 집합 모델</title><content type='html'>&lt;span style="color:#3333ff;"&gt;&lt;span style="font-size:130%;"&gt;1. 퍼지 집합 모델&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;/span&gt;&lt;br /&gt;"한 동안 내 마음은 멈춰 있을 것이다."&lt;br /&gt;이 문장을 키워드로 나열한다면, 이 문장이 갖는 원래의 의미가 표현이 될 수 있을까?&lt;br /&gt;&lt;br /&gt;문헌과 질의를 키워드 집합으로 표현하는 것은 해당 문헌과 질의가 실제 의미하는 내용의 부분적인 표현이 되며 결과적으로, 문헌과 질의 용어의 정합은 근접 또는 모호한 정합이 된다. 이는 질의 용어를 퍼지 집합으로 정의하고 각 문헌을 이 집합의 소속 정도(degree of membership)로 모델링할 수 있다.&lt;br /&gt;&lt;br /&gt;퍼지 집합 이론은 경계가 불분명한 클래스 표현을 다루며, 주요 개념은 클래스 원소와 연관된 소속 함수가 된다. 이 함수는 [0, 1] 구간의 값을 가지는데, 0은 클래스에 소속되지 않은 것을 말하고 1은 완전 소속을 나타낸다. 따라서 퍼지 집합의 소속 함수는 전형적인 불 논리의 이진값이 아닌 점증적인 값을 가진다.&lt;br /&gt;&lt;br /&gt;정의&lt;br /&gt;전체 집합 U에서, A와 B를 두 개의 퍼지 부분 집합이라고 하고 A^를 전체 집합 U에서 A의 여집합이라고 하자. 또 u를 U의 원소라 하면&lt;br /&gt;Standard complement&lt;br /&gt;cA(x) = 1 − A(x) : 여집합.&lt;br /&gt;Standard intersection&lt;br /&gt;(A ∩ B)(x) = min [A(x), B(x)]&lt;br /&gt;Standard union&lt;br /&gt;(A ∪ B)(x) = max [A(x), B(x)] (wiki 참조)&lt;br /&gt;&lt;br /&gt;퍼지 정보 검색은 시소러스를 이용하게 된다.&lt;br /&gt;시소러스는 용어간 관계를 정의한 것으로 용어간 연관 행렬(C벡터 : 키워드 연결 행결, Keyword connection matrix)을 정의함으로써 구성할 수 있는데, 이의 행과 열은 문헌 컬렉션의 색인어로 구성된다. 퍼지 집합 모델의 기본 개념은 질의 안의 색인어 집합을 시소러스에서 얻은 연관 용어로 확장하는 것이며, 결과적으로 사용자 질의만 사용한 것보다 더 많은 연관 문헌을 검색하게 된다.&lt;br /&gt;&lt;br /&gt;두 용어 Ki와 Kj간의 정규 연관 요소 Ci,j는 다음과 같이 정의 할 수 있다.&lt;br /&gt;Ci,j = Ni,j / (Ni + Nj - Ni,j)&lt;br /&gt;&lt;br /&gt;이 연관 행렬 식은 매우 일반적인 것으로 널리 사용된다.&lt;br /&gt;위 식을 조금 살펴보면 Ni,j는 Ki와 Kj가 동시에 실린 문헌의 개수이다. Ni는 Ki가 실린 문헌의 개수이고 Nj역시 마찬가지다. 이것은 Ki 혹은 Kj가 실린 문헌에서 Ki 그리고 Kj가 동시에 실린 문헌의 비율을 연관 요소 값이라고 보는 것으로 항상 동시에 실리는 경우 1로서 최대 값을 갖는다.&lt;br /&gt;&lt;br /&gt;이러한 fuzzy 집합을 이용하면, Ci,j 정규 연관 요소에 의해 질의가 확장이 될 수 있고, 이런 확장된 질의 집합에 의해서 더 좋은 검색결과를 가져올 수 있다.&lt;br /&gt;&lt;br /&gt;fuzzy 집합 모델과 관련한 내부 수식은 조금 더 구체적인 부분이 있지만, 그 내용이 단순하고 개념적인 것은 이미 다 언급되어 있어서 생략한다. fuzzy 집합 모델은 대중적이지 못하고 퍼지 이론에 관련된 문헌에만 논의되고 있다.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;color:#3333ff;"&gt;2. 확장 불리안 모델&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;불리안 모델은 단순하고 강력하지만, 용어 가중치를 제공하지 않기 떄문에 결과 집합의 순위화가 불가능하고, 결과 집합이 너무 크거나 작다. 이런 특성은 불리안 모델에 기반한 검색 시스템의 성능에 악영향을 미치게 된다. &lt;/span&gt;&lt;br /&gt;그래서 불리안 모델을 확장하여 부분 정합이나 용어 가중치를 줄 수 있는 방법이 새로 모색되었고, 불리안 질의에 벡터 모델의 특성을 가미한 확장 불리안 모델이 개발되었다.&lt;br /&gt;&lt;br /&gt;확장 불리안 모델은 기존 불리안 모델에 if-idf요소로써 용어 문헌쌍에 연관된 가중치를 적용하였다. 예를 들어 2개의 term(용어)만 적용한 좌표를 생각해보자.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-6565368139309543426?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/6565368139309543426/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=6565368139309543426' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/6565368139309543426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/6565368139309543426'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/ir-chapter2-modeling-3.html' title='IR Chapter2 Modeling - 3 전형적 모델 외 다른 집합 모델'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-5067814895671901818</id><published>2007-08-06T15:23:00.000+09:00</published><updated>2007-08-09T21:48:57.231+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion mining'/><title type='text'>블로그 쓰레드를 분석해서 중요한 블로거, 선동자를 찾는 방법</title><content type='html'>&lt;span &gt;NICT와 협력 관계를 맺고 있는 우리 랩은 몇가지 공동 연구를 진행하고 있다.&lt;br /&gt;(자세한 사항은 관리자가 아니라서 모르겠지만...)&lt;br /&gt;&lt;br /&gt;블로그나 웹 마이닝, social network등에 관심이 있어 서베이를 하던 중 NICT에서 나의 연구 목표와 비슷한 주제로 수행했던 프로젝트 논문을 발표했다.&lt;br /&gt;&lt;br /&gt;블로그엔 트랙백이라는 것이 존재하며, comment 기능도 있어서 conversational tool로서 볼 수도, 활용할 수도 있지만 블로그 사용자인 당신(?)은 hot topic 즉 뜨거운 감자인 논쟁 거리에 대해서 갑론 을박 서로 토론하는 내용의 글들을 트랙백을 따라서 보기는 뭔가 많이 부족하다고 느낀적이 없는가?&lt;br /&gt;&lt;br /&gt;현재 우리 블로그는 이러한 conversational 측면에서 논리의 흐름을 보여주는 측면은 상당히 빈약하다. 대부분 그런 점을 느끼겠지만... 사실 게시판(bulletin board)의 순서대로 작성된 글들에 비해 선 이런 측면에서 뭔가 모자란 느낌을 받을 수 있다. 그것은 우리 블로그가 하이퍼 링크된 블로그들의 snapshot같은 역할을 하도록 보여지고 있기 때문이다.&lt;br /&gt;&lt;br /&gt;이 논문은 그러한 내용들을 개선하고자 하는 노력으로 시도되었다.&lt;br /&gt;그리고 hot conversation들을 찾기 위해 이러한 conversation에서 중요한 위치를 차지하는 블로거들을 찾는 방법을 제안하였다. 블로그를 돌아다니다 보면, 블로거들이 적은 이 전의 글들을 통해 그들의 관심사를 알게 되고 답글, 인용 수 등을 보면 그가 얼마나 좋은 글을 썼는 지 짐작할 수 있다. 이러한 정보가 절대적으로 블로거의 위상에 힌트가 되지는 않지만, 중요한 정보를 준다는 사실엔 틀림없다. 이러한 독자가 블로그를 돌아다니며, 블로거들에 대해 판단하는 과정들을 컴퓨터가 할 수 있도록 자동화해서 hot conversation을 찾겠다는 이들의 시도는 3가지 가설에 의거한다.&lt;br /&gt;&lt;br /&gt;첫째, 선동자로서의 블로거는 다른 사용자들로 부터 in-link가 많을 것이다.&lt;br /&gt;즉, 좋은 블로그 글을 남기기 때문에 trackback이라던지 reply-link가 많을 것이라는 예상이다.&lt;br /&gt;둘째, 선동자로서의 블로거가 글을 남긴 뒤에는 topic에 있어서 변화가 있을 것이다.&lt;br /&gt;즉, 선동자가 글을 남기기 전의 쓰레드에서의 글들은 통일성없이 다양한 형태의 논지로 글을 쓰지만, 선동자가 글을 남긴 뒤에는 그 뒤 블로거 글들은 선동자의 글의 논지를 따르게 될 것이라는 예상이다.&lt;br /&gt;셋째, 선동자가 글을 남긴 뒤에는 일정 시간동안 쓰레드에 글이 더욱 많아질 것이다.&lt;br /&gt;즉, 선동자가 쓰레드에 활력을 일으키는 역할을 할 것이라는 예상이다.&lt;br /&gt;&lt;br /&gt;어찌 보면 당연한 얘기지만, 이러한 논문을 볼때 항상 경이로운 생각이 드는 것은 당연할 것 같은 이치에 대한 논리 정연한 논거와 그를 뒷받침하는 과학적 분석, 과학적 실험 설계에 대한 놀라움이다.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-5067814895671901818?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/5067814895671901818/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=5067814895671901818' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5067814895671901818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5067814895671901818'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/blog-post.html' title='블로그 쓰레드를 분석해서 중요한 블로거, 선동자를 찾는 방법'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-9101946699174843401</id><published>2007-08-02T20:03:00.000+09:00</published><updated>2008-12-11T23:44:05.372+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Information Retrival'/><title type='text'>IR Chapter2 Modeling - 2 전형적인 정보검색 모델</title><content type='html'>&lt;div&gt; &lt;/div&gt;&lt;div&gt;전형적인 정보 검색 모델에서 문헌은 색인어라고 불리는 키워드 집합으로 표현되며,&lt;br /&gt;이 색인어는 의미적으로 해당 문헌의 주제를 기억하는데 도움을 주는 단어이다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;문헌 내용을 요약하기 위해 용어의 중요도를 결정하는 일은 그리 단순한 문제가 아니지만,&lt;br /&gt;이 어려움에도 불구하고 용어의 중요도를 평가하는데 유용하거나 쉽게 측정할 수 있는 색인어의 특성이 존재한다. 예를 들어 수십만 개의 문헌 집합을 고려해 보자. 모든 문헌에 출현한 단어는 색인어로서 완전히 무용한데, 이는 어떤 문헌이 사용자가 관심있는 것인지에 대해 아무런 도움을 못 주기 때문이다. 반면, 단지 몇 개의 문헌에만 출현한 단어는 사용자가 관심있어 할 문헌 공간을 상당히 줄여주기 때문에 매우 유용하다.(이러한 개념에서 tf, itf가 도출될 수 있다.)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;따라서 문헌 내용을 설명하는데 같이 사용된 단어들이라 하더라도 다양한 비중을 가지고 있으며, 문헌의 색인어 각각에 가중치를 부여하는 효과를 가져온다.&lt;br /&gt;&lt;br /&gt;색인어 ki와 문헌 dj가 주어졌을때, Wi,j &gt;= 0 를 (ki, dj)쌍의 가중치라고 하면,&lt;br /&gt;이 가중치는 문헌의 의미적 내용을 설명하지 위한 색인어의 중요도를 정량화한다.&lt;br /&gt;&lt;br /&gt;색인어 가중치는 상호 독립적이라고 가정하지만, 실제 문헌 내에서의 색인어 출현은 서로 무관하지 않기 때문에 이는 너무 단순화한 것이 된다. 예를 들면 컴퓨터 네트워크 분야의 한 문헌을 색인하기 위새 '컴퓨터'와 '네트워크'가 사용되었다고 할 때, 한 문헌에서 이 두 단어가 서로 독립적으로 나타나지 않으며 두 단어가 상호 연관되어 있고 색인어 가중치도 영향을 받는다.&lt;br /&gt;그럼에도 불구하고 이런 색인어 가중치의 상호 독립적 가정은 모델을 매우 단순화하여 색인어 가중치 계산이나 빠른 순위 계산이 가능하게 한다. 더욱이 색인어 연관성을 고려한 연구가 좋은 결과를 낸 적이 없기 때문에 다른 언급이 없는 한 색인어는 상호 독립적이라고 가정한다.&lt;br /&gt;최근엔 용어 연관성에 근거하여 특정 문헌 집합에서 좋은 결과를 낸 최신의 검색 기술이 있으며, 이런 추세가 점점 확대되어 가는 듯하다. &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;다음에서 볼 전형적인 정보 검색 모델에서 중요한 개념은 이 세가지다.&lt;/div&gt;&lt;div&gt;&lt;span style="color:#ff0000;"&gt;문헌, 색인어, 질의&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color:#ff0000;"&gt;!!! 꼭 기억하자. 문헌은 색인어 집합이며, 색인어는 질의와 문헌을 연결해주는 매개체이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;다음으로 전형적인 정보 검색 모델 3가지에 대해 알아보자.&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#66cccc;"&gt;&lt;span style="font-size:130%;color:#3333ff;"&gt;1. 불리안 모델&lt;/span&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color:#66cccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;불리안 모델은 집합론과 불리안 대수에 기반한 단순 모델로서, 이때 질의는 명확한 의미를 가진 불리안 표현으로 정의된다.&lt;br /&gt;간결함과 단순한 불리안 모델에는 몇개의 중대한 단점이 있다.&lt;br /&gt;첫째, 검색 전략이 이진 값에 근거하여 순위 구분없이 연관/비연관 중의 하나로 결정된다는 점이며 이는 좋은 검색 성능을 방해한다. 따라서 불리안 모델은 실제로 정보 검색 모델ㅇ이라기 보다는 데이터 검색 모델에 더 가깝다.&lt;br /&gt;둘째, 불리안 표현이 명확한 의미를 지니기는 하지만, 사용자 요구를 불리안 표현으로 변환하는 것은 그리 간단하지가 않다.&lt;br /&gt;불리안 모델의 주요 장점은 모델의 명확한 형식과 단순성이며, 단점은 정확한 정합 때문에 검색 문헌이 너무 작거나 많다는 점이다. 오늘날, 색인어 가중치가 실질적인 검색 성능 향상을 가져온다고 알려져서 이 색인어 가중치를 고려한 벡터 모델이 선호되고 있다.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-size:130%;color:#3333ff;"&gt;2.벡터모델&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;벡터 모델은 이진 가중치 사용이 너무 제한적이어서(불리안 모델은 질의가 '나무 여행'이었다면, 본문에 '나무'만 있거나 '여행'만 있는 부분 정합의 경우는 제외된다.), 부분 정합이 가능한 틀을 제공한 것으로 인식할 수 있으며, 이는 질의나 문헌의 색인어에 비이진 가중치를 할당함으로써 가능하다.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;정의&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;벡터 모델에서 용어, 문헌 쌍(Ki, Dj)의 가중치 Wi,j는 양의 비이진 값이며, 질의 색인어도 가중치를 가진다. [Ki, q]의 가중치를 Wi,q &gt;= 0이라 하면, 질의 벡터 q벡터는 &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;q벡터 = (W1,q , W2,q , ... , Wt,q)로 정의되며, 여기서 t는 시스템 내의 전체 색인어 수이다. &lt;/div&gt;&lt;div&gt;문헌 Dj벡터는 Dj벡터 = (W1,j , W2,j, ... , Wt,j)로 표현된다.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_ECA08t3QSQ0/Rrf0cTE2m6I/AAAAAAAAAAU/EuG0kaNGs5Q/s1600-h/ì"&gt;&lt;img id="BLOGGER_PHOTO_ID_5095810270387149730" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_ECA08t3QSQ0/Rrf0cTE2m6I/AAAAAAAAAAU/EuG0kaNGs5Q/s320/%EC%A0%9C%EB%AA%A9+%EC%97%86%EC%9D%8C.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;따라서 색인어가 2개인 경우 다음처럼 2차원 벡터로 &lt;/div&gt;&lt;div&gt;질의와 문서가 표현될 수 있다. 보다 일반적으로 t차원 백터로 표시된다고 생각하자. &lt;/div&gt;&lt;div&gt;벡터 모델에서 문헌 Dj와 질의 q의 유사도 측정은 두 벡터 Dj벡터와 q벡터의 상관도로 구할 수 있으며, 이 상관도의 예로 두 벡터간 사이각의 코사인 값으로 정량화할 수 있다.&lt;br /&gt;&lt;br /&gt;벡터모델의 결과로는 코사인 값으로 0과 1 사이의 값을 매기게 된다. 즉, 벡터 모델은 문헌이 관련있나 없나만을 예측하기 보다는 질의와의 유사도 값에 따라 순위를 매기기 때문에 부분적으로 질의에 정합되는 문헌이라도 검색되며 또, 일정한 유사도 값 이상의 문헌만을 검색하기 위해 임계치를 둘 수 도 있다.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;그렇다면, 색인어 가중치는 어떻게 구할까? 언어학자들이 미리 정의 했둔걸까. 아니면 임의로 직접 값을 적절히 설정하는 것일까? 물론 여러 방법이 있을 수 있다. 여기서는 가장 효과적인 용어 가중치 기법의 주요 아이디어에 대해 집중해 보자. &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;먼저 용어 문헌쌍(문헌 색인어)가중치를 살펴보자.&lt;/div&gt;&lt;div&gt;정보 검색 문제를 클러스터링 중의 하나로 보는 관점은 Salton의 초반 작업에 따르며 후반에 나오는 클러스터링 기법의 기본 원칙과 연관이 있는데, 문헌을 객체의 전체 집합 C로 보고 사용자 질의를 모호한 객체 집합 A로 간주한다. 그러면 정보 검색 문제는 어떤 문헌이 집합 A에 속하는지 아닌지를 결정하는 클러스터링 문제로 간주할 수 있다. &lt;/div&gt;&lt;div&gt;클러스터링 문제에서는 두 가지 주요 과제를 해결해야 한다.&lt;/div&gt;&lt;div&gt;첫째는 집합 A에 속하는 객체를 잘 표현할 수 있는 특성을 결정하는 일이며, &lt;/div&gt;&lt;div&gt;둘째는 전체 컬렉션 C에서 집합 A에 속하는 것과 아닌것을 잘 구분할 수 있는 특성을 찾는 일이다.&lt;/div&gt;&lt;div&gt;첫번째 특성 집합은 클러스터 내 유사도(intra-cluster similarity)를 양자화하는데 사용되는데, 문헌 Dj에 출현한 용어 Ki의 빈도수를 측정함으로써 수치화된다. 이런 용어 빈도수는(term frequency) 통상 tf요소라고 불리며 그 용어가 문헌의 내용을 얼마나 잘 표현하는가의 척도가 된다.&lt;/div&gt;&lt;div&gt;두번째 특성 집합은 클러스터간 비유사도(inter-cluster dissimilarity)를 구하는데 사용되는데, 전체 문헌 컬렉션 중에서 용어 Ki가 출현한 문헌 빈도수의 역수를 계산함으로써 구할 수 있는데, 이는 역문헌 빈도수(inverse document frequency)요소라고 불리며, idf 요소 사용의 동기는 많은 문헌에 출현한 용어가 연관 문헌과 비연관 문헌의 구분에 무용하다는데 있다.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;다음으로 질의 용어 가중치(질의 색인어 가중치) 역시 tf/idf로 구해진다. &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;벡터 모델의 주요 장점은 &lt;/div&gt;&lt;div&gt;1. 용어-가중치 할당 기법이 검색 성능을 향상시키고,&lt;/div&gt;&lt;div&gt;2. 부분 정합 전략으로 질의 조건에 근접한 문헌 검색이 가능하며,&lt;/div&gt;&lt;div&gt;3. 코사인 순위화 수식이 문헌을 질의에 유사한 순서대로 정렬한다는 점이다.&lt;/div&gt;&lt;div&gt;반면, 벡터 모델은 색인어의 상호 독립성 가정이라는 이론적인 단점을 가지고 있지만 앞서 얘기한 대로 이 가정이 성능에서 문제를 가져온다고 볼 수는 없다.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;다른 많은 모델이 있지만, 일반적으로 벡터 모델이 더 우월하거나 비슷한 것으로 나타났으며, 더욱이 단순하고 빠르기 때문에, 벡터 모델은 현재 가장 대중적인 검색모델이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:130%;color:#3333ff;"&gt;3. 확률 모델&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:130%;color:#3333ff;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;여기서는 간략히 확률 모델의 중요 특성을 부각하기 위해 BIR(binary independence retrieval)이라는 전통 확률 모델을 소개한다.&lt;/div&gt;&lt;div&gt;만약, 사용자 질의가 주어졌을 때 확실히 연관된 문헌들의 집합이 존재하고 이를 이상적인 해답 집합이라 하며, 이 이상적인 해답 집합을 서술할 수만 있다면 그 문헌들을 검색하는데 문제가 없을 것이다. 따라서 질의 과정은 이상적인 해답 집합의 특성을 규정하는 작업으로 볼 수 있는데(정보 검색 문제를 클러스터링 문제로 해석하는 것과 유사), 문제는 이 특성이 정확히 무엇인지를 모르고 이 특성을 규정하는데 사용된 의미를 가진 색인어만 알고 있다는 점이다. 이 특성은 질의 시점에는 알 수 없으므로, 그것이 무엇인지 초기에 추정할 필요가 있으며, 이 초기 추정은 초기 문헌 집합을 검색하는데 사용될 예비 확률 표현을 생성하고, 사용자와의 상호작용을 통해 이상적인 해답 집합의 확률적 표현으로 개선된다. 즉, 반복적으로 해답 집합을 찾아가는 것이다.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;이 과정은 다음과 같이 진행된다.&lt;/div&gt;&lt;div&gt;사용자는 검색된 문헌 중에서 어떤 것이 관련이 있고 없는 지를 제시하며(실제로 검색된 최상위 문헌들만이 대상이 된다.), 시스템은 이 정보를 이용해 이상적인 해답 집합 표현으로 수정된다. 이 작업을 반복적으로 수행하면, 그 표현은 점점 실제 이상적인 해답 집합 표현에 가까워질 것이라고 기대할 수 있다.(자꾸 머신러닝이 떠오르는 건 왜일까.) &lt;/div&gt;&lt;div&gt;시작 시에는 이상적인 해답 집합에 대한 추정이 필요하다는 점만 인식하고 있으면 되고, 의식적인 개선 노력이 확률 용어로 표현된다.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;정의&lt;/div&gt;&lt;div&gt;확률 모델에서 색인어 가중치 변수는 모두 이진값으로 즉, Wij가 0이나 1인 가중치 값을 갖고 Di,q역시 0이나 1인 가중치 값을 갖으며, 질의 q는 색인어의 부분 집합이다. R(이상적인 해답 집합)을 초기 추정한 연관 문헌 집합이라고 하면, R^은 R의 여집합으로 비연관 문헌 집합이다. &lt;/div&gt;&lt;div&gt;P(R Dj벡터)는 문헌 Dj가 질의 q에 연관될 확률이고,&lt;/div&gt;&lt;div&gt;P(R^ Dj벡터)는 비연관 확률이다.&lt;/div&gt;&lt;div&gt;문헌 Dj와 질의 q의 유사도 sim(Dj, q)는 다음과 같이 정의 된다.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;sim(Dj, q) = 문헌 Dj가 질의 q에 연관될 확률 / 비연관 확률&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;또한 P(Ki R)과 같은 R집합 내에서 색인어 Ki가 포함되어 있을 확률과 같은 것은 알 수 없으므로 단순한 가정을 한다. 예를 들면&lt;/div&gt;&lt;div&gt;P(Ki R) = 0.5&lt;/div&gt;&lt;div&gt;P(Ki R^) = ni/N(ni는 Ki가 출현한 문헌수)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;확률 모델의 주요 장점은 이론상으로 문헌들이 연관 확률 값에 따라 내림차순으로 순위화 된다는 점이다. &lt;/div&gt;&lt;div&gt;단점은 문헌들을 연관/비연관으로 초기에 추정 분리할 필요가 있고, 문헌 내 색인어 빈도수가 고려되지 않는 방법이라는 사실과, 색인어에 대해 독립 가정을 적용했다는 점이다. 그러나 색인어 독립 가정은 실제 상황에서 성능에 어떤 영향을 미치는지 알 수 없으므로 문제가 있는지는 확실하지 않다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:130%;color:#3333ff;"&gt;4. 전통적 모델의 간략한 비교&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;일반적으로 부분 정합의 인식 불가로 인해 자주 낮은 성능을 보이는 불리안 모델이 세 전통 모델 중에서 가장 약한 것으로 여겨진다. 확률 모델이 벡터 모델보다 우월하다는 주장과 실험들이 있었지만, 이후 여러 측정을 통하여 일반 컬렉션의 경우 벡터 모델이 확률 모델보다 우월하다는 점이 일반적으로 받아들여지고 있다.&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-9101946699174843401?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/9101946699174843401/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=9101946699174843401' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/9101946699174843401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/9101946699174843401'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/ir-chapter2-modeling-2.html' title='IR Chapter2 Modeling - 2 전형적인 정보검색 모델'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ECA08t3QSQ0/Rrf0cTE2m6I/AAAAAAAAAAU/EuG0kaNGs5Q/s72-c/%EC%A0%9C%EB%AA%A9+%EC%97%86%EC%9D%8C.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-5296878836475562783</id><published>2007-08-02T11:33:00.000+09:00</published><updated>2007-08-10T11:15:31.058+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='소모적인 setting'/><title type='text'>기본적인 SQL문 정리</title><content type='html'>&lt;span &gt;네이버의 yura000님 께서 훌륭하게 정리하신 글이 있기에 퍼왔습니다.&lt;br /&gt;보는데 편하도록 글 배치와 색상은 약간 수정했습니다&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span &gt;제 1 장 데이터의 검색&lt;br /&gt;&lt;br /&gt;SQL 명령어는 다음과 같이 기술한다.&lt;br /&gt;&lt;br /&gt;■ SQL 명령어는 한 줄 혹은 여러 줄에 기술한다.&lt;br /&gt;■ 일반적으로 절들은 수정하기 쉽게 다른 줄에 기술한다.&lt;br /&gt;■ TAB 을 사용할 수 있다.&lt;br /&gt;■ SQL 명령어 단어는 생략하거나 분리할 수 없다.&lt;br /&gt;■ SQL 명령어는 대소문자를 구분하지 않는다.&lt;br /&gt;■ SQL 명령어는 ; 으로 종료한다.&lt;br /&gt;■ SQL 명령어는 SQL BUFFER 에 저장된다.&lt;br /&gt;■ SQL BUFFER 에 저장된 SQL 명령어는 /&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt; &lt;/span&gt;&lt;span &gt;혹은 RUN 으로 실행할 수 있다. SQL*PLUS 명령어는 다음과 같이 기술한다.&lt;br /&gt;■ SQL*PLUS 명령어는 기본적으로 한 줄에 기술한다.&lt;br /&gt;■ SQL*PLUS 명령어는 대소문자를 구별하지 않는다.&lt;br /&gt;■ SQL*PLUS 명령어는 SQL BUFFER 에 저장되지 않는다.&lt;br /&gt;■ SQL*PLUS 명령어는 다음과 같다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;• DESCRIBE table명 : TABLE 의 구조를 보여준다.&lt;br /&gt;• SAVE file명 : SQL BUFFER 를 file 로 저장한다.&lt;br /&gt;• START file명 : file 을 수행한다.&lt;br /&gt;• @ file명 : file 을 수행한다.&lt;br /&gt;• EDIT file명 : EDITOR 를 사용하여 file 을 편집한다.&lt;br /&gt;• SPOOL file명 : QUERY 결과를 file 에 저장한다.&lt;br /&gt;• SPOOL OFF : SPOOL FILE 을 닫는다.&lt;br /&gt;• HOST : SQL*PLUS 를 떠나지 않고 HOST 상태로 간다.&lt;br /&gt;• HELP 명령어 : SQL, SQL*PLUS, PL/SQL 에 대한 HELP 를 보내준다.&lt;br /&gt;• EXIT : SQL*PLUS 를 종료한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;1.SELECT 문장의 형식&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;br /&gt;SELECT 절에는 검색하고 싶은 COLUMN 명들을 기술한다..&lt;br /&gt;FROM 절에는 SELECT 절에서 기술된 COLUMN 명들이 포함된 TABLE 명을 기술한다.&lt;br /&gt;TABLE 의 모든 ROW 와 모든 COLUMN 을 검색한다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT *FROM table명 ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_DEPT TABLE 로부터 모든 ROW 와 COLUMN 을 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT *FROM S_DEPT ;&lt;br /&gt;&lt;br /&gt;특정 column의 검색SELECT 절에서 검색하고자 하는 COLUMN 명을 COMMA 를 사용하여 나열한다.&lt;br /&gt;COLUMN 순서는 검색하고 싶은 순서대로 나열한다.&lt;br /&gt;COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT column명, column명, column명,..FROM table명 ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 로부터 ID, LAST_NAME, START_DATE 를 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT ID, LAST_NAME, START_DATEFROM S_EMP ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;2.산술식을 사용한 검색산술 연산자를 사용하여 검색되는 데이타 값을 변경&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;산술 연산식은 COLUMN 명, 상수 값, 산술 연산자로 구성된다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT 산술연산식FROM table명 ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 로부터 ID, LAST_NAME, 연봉을 검색하시오.연봉은 SALARY * 12 로 계산한다.(+,-,*,/,())&lt;/span&gt;SELECT ID, LAST_NAME, SALARY * 12 FROM S_EMP ;&lt;br /&gt;&lt;br /&gt;Column alias기본적으로 COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다.&lt;br /&gt;그러나 많은 경우 COLUMN 명이 이해하기 어렵거나 무의미하기 때문에 COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다. ANSI SQL 92 와 호환을 위해 ALIAS 앞에 AS 를 붙일 수 있다.ALIAS 에 공백이나 특수문자가 포함되거나 대소문자를 구별하고 싶으면 " " 로 막아준다.COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT column명 alias, column명 "alias", column명 as alias FROM table명 ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME, (SALARY + 100) * 12, DEPT_ID 를 검색하시오.단, COLUMN ALIAS 는 Employee, ANNUAL_SALARY, DEPARTMENT NO 로 정의하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME "Employee", (SALARY + 100) * 12 AS ANNUAL_SALARY,DEPT_ID "DEPARTMENT NO" FROM S_EMP ;&lt;br /&gt;&lt;br /&gt;Column의 결합COLUMN 과 다른 COLUMN, 산술연산식, 상수 값과 결합하여 하나의 COLUMN 으로 결합할 수 있다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT column명 column명FROM table명;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 FIRST_NAME 과 LAST_NAME 을 결합하여 ALIAS EMPLOYEE 로 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT FIRST_NAME LAST_NAME EMPLOYEEFROM S_EMP ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;3. Null값 처리&lt;/span&gt;&lt;br /&gt;특정 COLUMN 에 값이 입력되어 있지 않을 때, 그 값을 NULL 이라 부른다.&lt;br /&gt;NULL 값은 0 이나 공백과 같지 않다. NULL 값이 산술 연산식에 포함되면 그 결과도 NULL 이다.&lt;br /&gt;그러므로 NVL FUNCTION 을 사용하여 NULL 값을 다른 값으로 대체하여야 한다.&lt;br /&gt;NULL 값을 다른 값으로 대체한다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;NVL (number_column, 9) NVL (date_column, '01-JAN-95') NVL (character_column, 'ABCDE')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME, COMMISSION 값을 검색하시오.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;COMMISSION 은 SALARY * COMMISSION_PCT /100 으로 계산하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, SALARY * NVL(COMMISSION_PCT,0) /100 COMMISSIONFROM S_EMP ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;4.중복 row의 제거&lt;/span&gt;&lt;br /&gt;SELECT 결과 값에 중복된 값이 있을 때 중복을 피하고 UNIQUE 하게 검색한다.&lt;br /&gt;중복된 ROW 를 제거한다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT DISTINCT column명, column명FROM table명;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_DEPT TABLE 에서 NAME 이 중복되지 않게 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT DISTINCT NAMEFROM S_DEPT ;&lt;br /&gt;&lt;br /&gt;데이타의 정렬SELECT 되는 ROW 의 순서는 알 수 없다.&lt;br /&gt;그러므로 ROW 를 SORT 하고 싶으면 ORDER BY 절을 사용하여야 한다.&lt;br /&gt;DATA 의 DEFAULT SORT 순서는 ASCENDING 이며 다음과 같다.&lt;br /&gt;&lt;br /&gt;• 숫자 : 1 에서 999 순으로 SORT 한다.&lt;br /&gt;• 날짜 : 01-JAN-92 에서 01-JAN-95 순으로 SORT 한다.&lt;br /&gt;• 문자 : A 에서 Z 순서로 SORT 한다.&lt;br /&gt;• NULL : ASC 순에서는 뒤에, DESC 순에서는 앞에 나온다.&lt;br /&gt;• 역순으로 SORT 하고 싶으면 COLUMN 명 뒤에 DESC 를 붙인다.&lt;br /&gt;• COLUMN 명 대신에 ALIAS 혹은 SELECT 한 COLUMN 의 순서로 지정할 수도 있다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT exprFROM table명ORDER BY {column명, expr} [ASCDESC] ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME, DEPT_ID, START_DATE 를 LAST_NAME 순으로 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, DEPT_ID, START_DATEFROM S_EMP ORDER BY LAST_NAME ;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;5.특정 row의 검색&lt;/span&gt;&lt;br /&gt;WHERE 절에서 조건식을 기술하여 조건을 만족하는 ROW 만 검색할 수 있다.&lt;br /&gt;조건식은 COLUMN 명, COMPARISON OPERATOR, VALUE 로 구성되어 있다.&lt;br /&gt;문자 값은 ' ' 으로 묶어주고 값의 대소문자를 구별하여 적어준다.&lt;br /&gt;날짜 값은 ' ' 으로 묶어주고 지정된 날짜 형태로 적어준다. '01-MAR-97' 숫자값은 값만 적어준다.&lt;br /&gt;특정 ROW 만 검색한다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT exprFROM table명WHERE expr operator value;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME 이 Magee 인 사원의 FIRST_NAME, LAST_NAME,TITLE 을 검색하시오. (=,&gt;,&lt;,&gt;=,&lt;=,&lt;&gt;)&lt;/span&gt;&lt;br /&gt;SELECT FIRST_NAME, LAST_NAME, TITLEFROM S_EMPWHERE LAST_NAME = 'Magee' ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;6.Between...and&lt;/span&gt;&lt;br /&gt;BETWEEN OPERATOR 를 사용하여 범위를 지정할 수 있다.&lt;br /&gt;범위를 지정할 때는 작은 값을 먼저 큰 값을 나중에 지정한다. 두 범위의 한계 값을 포함한다. &lt;span style="color:#3333ff;"&gt;BETWEEN...AND...&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;NOT BETWEEN...AND...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 START_DATE 가 09-MAY-91 에서 17-JUN-91 사이에 입사한 사원의 FIRST_NAME, LAST_NAME, START_DATE 를 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT FIRST_NAME, LAST_NAME, START_DATE FROM S_EMP&lt;br /&gt;WHERE START_DATE BETWEEN '09-MAY-91' AND '17-JUN-91' ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;7.In[list]&lt;/span&gt;&lt;br /&gt;IN OPERATOR 를 사용하여 나열된 값들 중에서 값을 검사한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;IN(LIST), NOT IN(LIST)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE에서 DEPT_ID 가 10 , 31, 41 혹은 50 인 사원의 FIRST_NAME,LAST_NAME, DEPT_ID 를 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT FIRST_NAME, LAST_NAME, DEPT_IDFROM S_EMPWHERE DEPT_ID IN (10, 31, 41, 50) ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;8.like&lt;/span&gt;&lt;br /&gt;찾고자 하는 값을 정확히 모를 때, LIKE OPERATOR 를 사용하여 문자형태가 같은 ROW 를 검색한다.&lt;br /&gt;WILDCARD 를 사용하여 문자의 형태를 지정한다.&lt;br /&gt;% : 여러 문자,&lt;br /&gt;_ : 한문자&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;LIKE '형태', NOT LIKE '형태'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE에서 LAST_NAME 이 M 으로 시작하는 사원의 LAST_NAME 을 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME FROM S_EMPWHERE LAST_NAME LIKE 'M%' ;&lt;br /&gt;SELECT LAST_NAME FROM S_EMPWHERE LAST_NAME LIKE '__M____' ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;9.is nullIS &lt;/span&gt;&lt;br /&gt;NULL OPERATOR을 사용하여 값이 NULL 인 것을 찾을 수 있다.&lt;br /&gt;NULL 값은 값이 정의되지 않은 것을 의미하기 때문에 = OPERATOR를 사용하여 어떤 값과 비교할 수 없기 때문에 사용한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;IS NULL, IS NOT NULL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE에서 COMMISSION_PCT 가 NULL 인 사원의 LAST_NAME, SALARY,COMMISSION_PCT 를 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT last_name, salary,commission_pct,last_name, salaryFROM s_empWHERE commission_pct is null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;10.And와 Or&lt;/span&gt;&lt;br /&gt;조건식의 결합조건식을 기술할 때 AND 와 OR 를 사용하여 여러가지 조건을 결합할 수 있다.&lt;br /&gt;AND 와 OR 가 같이 사용됐을 때 AND 가 먼저 수행되고 OR 가 나중에 수행된다.&lt;br /&gt;그러므로 우선순위를 바꾸고자 하면 ( ) 를 사용한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;WHERE 조건식 AND OR 조건식&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE에서 DEPT_ID 가 41 이고 TITLE 이 Stock Clerk 인 사원의 LAST_NAME, SALARY, DEPT_ID, TITLE 을 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, SALARY, DEPT_ID, TITLEFROM S_EMP WHERE DEPT_ID = 41AND TITLE = 'Stock Clerk' ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;11.Single Row Functions&lt;/span&gt;&lt;br /&gt;1)먼저, LOWER를 알아보자.&lt;br /&gt;소문자로 변환,모든 문자를 소문자로 변환시킨다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;LOWER(COLUMN명)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 FIRST_NAME, LAST_NAME 을 소문자로 출력시키시오.&lt;/span&gt;&lt;br /&gt;SELECT LOWER(FIRST_NAME), LOWER(LAST_NAME) FROM S_EMP WHERE LOWER(LAST_NAME) = 'smith' ;&lt;br /&gt;&lt;br /&gt;2)이번엔, 대문자로 변환인 UPPER를 보자.&lt;br /&gt;모든 문자를 대문자로 변환시킨다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;UPPER(COLUMN명)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 TITLE 을 대문자로 출력하시오.&lt;/span&gt;&lt;br /&gt;SELECT UPPER(TITLE) FROM S_EMP WHERE UPPER(LAST_NAME) = 'SMITH';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3)INITCAP&lt;br /&gt;첫글자만 대문자로 변환, 단어의 첫글자는 대문자로, 나머지는 소문자로 변환시킨다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;INITCAP(COLUMN명)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 TITLE 을 단어의 첫글자만 대문자로 출력시키시오.&lt;/span&gt;&lt;br /&gt;SELECT INITCAP(TITLE)FROM S_EMP ;&lt;br /&gt;&lt;br /&gt;4)SUBSTR&lt;br /&gt;문자의 부분을 자름문자를 시작위치(M)에서 자리수(N) 만큼 잘라준다.&lt;br /&gt;자리수(N)이 생략되면 시작위치(M)에서 끝까지 잘라준다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SUBSTR(COLUMN명, M, N)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_PRODUCT TABLE 에서 NAME COLUMN 의 앞에서 부터 3글자가 Ace 인 제품의 NAME 을 출력하시오.&lt;/span&gt;&lt;br /&gt;SELECT NAMEFROM S_PRODUCTWHERE SUBSTR(NAME, 1, 3) = 'Ace' ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5)Length&lt;br /&gt;문자의 길이를 계산문자의 길이를 RETURN 한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;LENGTH(COLUMN명)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_PRODUCT TABLE 에서 NAME, NAME 의 길이를 출력하시오.&lt;/span&gt;&lt;br /&gt;SELECT NAME, LENGTH(NAME)FROM S_PRODUCT;&lt;br /&gt;&lt;br /&gt;6)Round&lt;br /&gt;숫자의 반올림지정된 자리수(M) 밑에서 반올림한다.&lt;br /&gt;COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)은 다음과 같다.&lt;br /&gt;　　　　　 M : -3-2-1 0 1 2 3&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;ROUND(COLUMN명, M)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME, SALARY/22 의 값을 소수 2째 자리까지 나타내고&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;소수 3째 자리에서 반올림하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, ROUND(SALARY/22, 2) FROM S_EMP ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7)Trunc&lt;br /&gt;숫자의 절사지정된 자리수(M) 까지 나타내고 그 밑은 잘라버린다.&lt;br /&gt;COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)은 다음과 같다.&lt;br /&gt;　　　　 M : -3-2-1 0 1 2 3&lt;br /&gt;절사 값은 RETURN 한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;TRUNC(COLUMN명, M)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME, SALARY / 22 의 값을 십의 자리까지 나타내고 일의 자리는 버림&lt;/span&gt;SELECT LAST_NAME, TRUNC(SALARY/22, -1) FROM S_EMP ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8)나누기의 나머지, MOD&lt;br /&gt;M 을 N 으로 나누고 남은 나머지를 RETURN 한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;MOD(M, N)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]10 을 3 으로 나눈 나머지를 구하시오.&lt;/span&gt;&lt;br /&gt;SELECT MOD(10, 3)FROM SYS.DUAL ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;9)날짜의 연산&lt;br /&gt;DATABASE 안의 DATE 값은 다음과 같은 숫자로 저장되어 있다.&lt;br /&gt;■ CENTURY, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS그러므로 산술 연산을 할 수 있다.&lt;br /&gt;● DATE + NUMBER : 숫자만큼 일이 더해진 날짜가 RETURN 된다.&lt;br /&gt;● DATE - NUMBER : 숫자만큼 일이 빼진 날짜가 RETURN 된다.&lt;br /&gt;● DATE1 - DATE2 : 두 날짜 사이의 일수가 계산된다.날짜 계산을 한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;DATE + NUMBERDATE - NUMBERDATE1 - DATE2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME, 입사한지 90 일째 되는 날, 입사한지 며칠 됐는지 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, START_DATE + 90, SYSDATE - START_DATE FROM S_EMP;&lt;br /&gt;( 날짜에는 시간도 포함되어 있으므로 일수 계산의 결과가 소수로 나온다. )&lt;br /&gt;&lt;br /&gt;날짜 사이의 개월 수두 날짜 사이의 개월 수를 RETURN 한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;MONTHS_BETWEEN(DATE1, DATE2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME, 입사한지 몇 달이 됐는지 출력하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, MONTHS_BETWEEN(SYSDATE, START_DATE)FROM S_EMP ;&lt;br /&gt;(일이 포함되어 있어서 소수로 출력된다.)&lt;br /&gt;&lt;br /&gt;날짜에 달을 더함날짜에서 숫자(N) 개월만큼 더해진 날짜를 RETURN 한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;ADD_MONTHS(DATE, N)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME, START_DATE, 입사한지 3 개월되는 날짜를 출력하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, START_DATE, ADD_MONTHS(START_DATE, 3) FROM S_EMP ;&lt;br /&gt;&lt;br /&gt;지정한 요일 날짜날짜에서 지정한 요일(CHAR)이 될 날짜를 RETURN 한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;NEXT_DAY(DATE, 'CHAR')&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]오늘을 기준으로 돌아오는 금요일이 언제인지 출력하시오.&lt;/span&gt;&lt;br /&gt;SELECT SYSDATE, NEXT_DAY(SYSDATE, 'FRIDAY') FROM SYS.DUAL ;&lt;br /&gt;&lt;br /&gt;그 달의 마지막 날 날짜가 포함된 달의 마지막 날을 RETURN 한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;LAST_DAY(DATE)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]이번 달의 마지막 날은 언제인지 출력하시오.&lt;/span&gt;&lt;br /&gt;SELECT SYSDATE, LAST_DAY(SYSDATE) FROM SYS.DUAL ;&lt;br /&gt;&lt;br /&gt;날짜의 반올림형태에 따른 반올림 기준은 다음과 같다.&lt;br /&gt;• YEAR : 6월 이후• MONTH : 15일 이후&lt;br /&gt;• DAY : 12시 이후날짜 데이타를 지정된 형태까지 나타내고 그 이하에서 반올림한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;ROUND(COLUMN명, '형태')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;단, 15일 이후는 다음달로 올리시오.&lt;/span&gt;&lt;br /&gt;SELECT ID, LAST_NAME, ROUND(START_DATE, 'MONTH') FROM S_EMP ;&lt;br /&gt;&lt;br /&gt;날짜의 절사날짜 데이타를 지정된 형태까지 나타내고 그 밑은 잘라낸다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;TRUNC(COLUMN명, '형태')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오.단, 일자는 잘라버리시오.&lt;/span&gt;&lt;br /&gt;SELECT ID, LAST_NAME, TRUNC(START_DATE, 'MONTH') FROM S_EMP ;&lt;br /&gt;&lt;br /&gt;문자를 날짜로 변환, CHARACTER TYPE 을 지정된 형태의 DATE TYPE 으로 변환한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;TO_DATE(character_column명, '형태')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;단, START_DATE 의 값이 92/02/07 인 사원을 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, START_DATEFROM S_EMP WHERE START_DATE = TO_DATE('92/02/07', 'YY/MM/DD') ;&lt;br /&gt;&lt;br /&gt;날짜를 문자로 변환DATE 값은 기본적으로 DD-MON-YY 형태로 출력된다.&lt;br /&gt;이것을 TO_CHAR FUNCTION 을 사용하면 원하는 다른 형태로 변환할 수 있다.&lt;br /&gt;■ 형태를 지정할 때 사용된 대소문자로 출력된다.&lt;br /&gt;■ DAY 와 MONTH 형태는 공백을 포함한 9 자리로 출력된다.&lt;br /&gt;■ TO_CHAR 의 결과는 80 자리로 출력된다.&lt;br /&gt;DATE TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;TO_CHAR(date_column, '형태')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;단, START_DATE 의 형태는 1991/06/17 14:20:00 와 같이 출력하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, TO_CHAR(START_DATE, 'YYYY/MM/DD HH24:MI:SS'), START_DATEFROM S_EMP ;&lt;br /&gt;&lt;br /&gt;숫자를 문자로 변환, NUMBER TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;TO_CHAR(number_column명, '형태')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME, SALARY 를 검색하시오.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;단 SALARY 를 $1,450 와 같은 형태로 출력시키시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, TO_CHAR(SALARY, '$999,999') FROM S_EMP ;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;12.여러Table로부터 Data검색&lt;/span&gt;&lt;br /&gt;1)Equijoin&lt;br /&gt;SIMPLE JOIN (EQUI-JOIN)&lt;br /&gt;여러개의 TABLE 들로부터 정보를 검색하려면, SELECT 문장의 FROM 절에 TABLE명들을 적고 WHERE 절에 각 TABLE의 ROW들을 연결시킬 조건식을 기술한다.&lt;br /&gt;각 TABLE 의 COLUMN명이 중복될 때는 반드시 COLUMN명 앞에 TABLE명을 붙여야 한다.&lt;br /&gt;(중복되지 않을 때는 붙이지 않아도 되지만 명확성을 위해서나 ACCESS 를 위해서 붙이는 것이 좋다.)&lt;br /&gt;N 개의 TABLE 을 JOIN 할 때는 최소한 N-1 개의 조건식이 필요하다.&lt;br /&gt;복합 COLUMN 으로 JOIN 할 때는 더 많은 조건식이 필요하다.&lt;br /&gt;2개 이상의 TABLE 에서 = 조건식을 만족시키는 ROW 들을 연결하여 검색한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT table명.column명, table명.column명...FROM table1명, table2명 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;WHERE table1명.column1명 = table2명.column명 ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 과 S_DEPT TABLE 을 사용하여 사원들의 LAST_NAME, DEPT_ID,NAME 을 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME FROM S_EMP, S_DEPT&lt;br /&gt;WHERE S_EMP.DEPT_ID = S_DEPT.ID ;&lt;br /&gt;&lt;br /&gt;2)특정 row의 join&lt;br /&gt;JOIN 문장을 기술할 때 JOIN 조건식 이외에 다른 조건식을 AND 로 연결할 수 있다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT table명.column명, table명.column명...FROM table1명, table2명 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;WHERE table1명.column1명 = table2명.column2명 AND condition ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE과 S_DEPT TABLE 을 사용하여 LAST_NAME 이 Menchu 인 사원의 LAST_NAME, DEPT_ID, NAME 을 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME FROM S_EMP, S_DEPT&lt;br /&gt;WHERE S_EMP.DEPT_ID = S_DEPT.ID AND S_EMP.LAST_NAME = 'Smith' ;&lt;br /&gt;&lt;br /&gt;3)Table alias&lt;br /&gt;JOIN 문장에서 TABLE명이 긴 경우 TABLE명.COLUMN명 으로 적는 것이 매우 불편하다.&lt;br /&gt;그런데 TABLE명 대신 ALIAS 를 사용하면 편하게 사용할 수 있다.&lt;br /&gt;(SELECT 문장에서 TABLE명 대신 ALIAS 를 지정했다면 그 문장에서는 계속해서ALIAS 로 사용하여야 한다.)TABLE ALIAS를 사용하여 JOIN 문장을 간단하게 기술한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT alias명.column명, alias명.column명 FROM table1명 alias1명, table2명 alias2명&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;WHERE alias1명.column1명 = alias2명.column2명 ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_CUSTOMER TABLE과 S_REGION TABLE 을 사용하여 고객 명,지역번호,지역 명을 검색하시오.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;단, COLUMN ALIAS 와 TABLE ALIAS 를 사용하시오.&lt;/span&gt;&lt;br /&gt;SELECT C.NAME "Customer Name", C.REGION_ID "Region Id",R.NAME "Region Name"&lt;br /&gt;FROM S_CUSTOMER C, S_REGION R WHERE C.REGION_ID = R.ID ;&lt;br /&gt;&lt;br /&gt;4)Non-Equijoin&lt;br /&gt;NON-EQUIJOIN&lt;br /&gt;JOIN 문장에서 두 TABLE 을 JOIN 하는 조건식에 = OPERATOR 가 사용되지 않고 다른 OPERATOR 가 사용되는 것을 말한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT table명.column명, table명.column명...FROM table1명, table2명 WHERE 조인조건식 ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]EMP TABLE 과 SALGRADE TABLE 을 사용하여 사원의 ENAME, JOB, SAL,GRADE를 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT E.ENAME, E.JOB, E.SAL, S.GRADE FROM EMP E, SALGRADE S&lt;br /&gt;WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL ;&lt;br /&gt;(BETWEEN OPERATOR 대신에 &lt;= 와 &gt;= 를 사용해도 되지만 BETWEEN 이 간편하다.)&lt;br /&gt;&lt;br /&gt;5)Outer Join&lt;br /&gt;두 TABLE 을 JOIN 할 때 JOIN 조건식을 만족시키지 못하는 ROW 는 검색에서 빠지게 된다.&lt;br /&gt;그런데 이러한 ROW 들이 검색되도록 하는 것이 OUTER JOIN 이다.&lt;br /&gt;(+),즉 OUTER JOIN OPERATOR 를 데이타가 없는 어느 한쪽의 COLUMN 쪽에 붙인다.&lt;br /&gt;JOIN 결과, 데이타가 없는 쪽의 COLUMN 값은 NULL로 검색된다.&lt;br /&gt;조건식을 만족시키지 못하는 데이타도 검색한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT table명.column명, table명.column명&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;FROM table1명, table2명 WHERE table1명.column1명 = table2명.column2명(+)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 과 S_CUSTOMER TABLE 을 사용하여 영업사원의 LAST_NAME,SALES_REP_ID, NAME 을 검색하시오.단, 영업사원이 정해져 있지 않은 고객의 이름도 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT E.LAST_NAME, C.SALES_REP_ID,C.NAMEFROM S_EMP E, S_CUSTOMER CWHERE E.ID(+) = C.SALES_REP_ID ;&lt;br /&gt;&lt;br /&gt;6)Self Join&lt;br /&gt;TABLE 의 ALIAS 를 사용하여 마치 2 개의 TABLE 처럼 생각하여 자신의 TABLE 과 자신의 TABLE 을 JOIN 한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT alias명.column명, alias명.column명...FROM table명 alias1명, table명 alias2명&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;WHERE alias1명.column1명 = alias2명.column2명 ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 사원들의 LAST_NAME 과 그들의 상사 LAST_NAME 을 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT W.LAST_NAME "Woker", M.LAST_NAME "Manager" FROM S_EMP W, S_EMP M&lt;br /&gt;WHERE W.MANAGER_ID = M.ID ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;13.Group FunctionsGroup Function&lt;/span&gt;&lt;br /&gt;각각의 FUNCTION 은 ARGUMENT 를 받는데 기능은 다음과 같다.&lt;br /&gt;■ DISTINCT : 중복된 값은 제외한다.&lt;br /&gt;■ ALL : DEFAULT 로써 모든 값을 포함한다.&lt;br /&gt;■ COLUMN명 : NULL 값은 제외한다.&lt;br /&gt;■ * : NULL 값도 포함한다.&lt;br /&gt;1)TABLE 전체를 하나의 GROUP 으로 보고 GROUP FUNCTION 값을 RETURN 한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT group_function(column명), group_function(column명)...FROM table명 ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 회사 전체의 급여합계, 최고급여, 최소급여, 인원수를 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), COUNT(SALARY)FROM S_EMP ;&lt;br /&gt;-COUNT(SALARY)는 급여를 받는 사원의 총 인원수고 COUNT(*) 는 급여를 받지 않는 사원의 인원수도 포함된다.)&lt;br /&gt;&lt;br /&gt;2)소group으로 분리&lt;br /&gt;기본적인 SELECT 절(그룹화 되지 않은 SELECT절)에는 COLUMN 명과 GROUP FUNCTION이 같이 기술될 수 없다.SELECT 절에 COLUMN 명이 기술되려면 GROUP BY 절이 반드시 기술되어야 한다.&lt;br /&gt;SELECT 절에 기술된 COLUMN 명들은 전부 GROUP BY 절에 기술되어야 하며 GROUP BY 절에 기술된 COLUMN 명들은 SELECT 절에 기술되지 않아도 된다.(하지만 결과를 파악하기 위해서는 SELECT 절에 기술해주는 것이 좋다.)GROUP BY 절을 기술하면 GROUP BY 절에 기술된 COLUMN 값으로 1 개의 TABLE이 소 GROUP 으로 나눠진다. 결과는 COLUMN 값으로 SORT 되어서 출력된다.&lt;br /&gt;1 개의 TABLE 을 소 GROUP 으로 나누어 GROUP FUNCTION 값을 구한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT column1명[, column2명], group_function(column명) &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;FROM table명 GROUP BY column1명[, column2명] ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 DEPT_ID, TITLE 별로, 최고급여, 최소급여, 인원수를 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT DEPT_ID, TITLE, MAX(SALARY), MIN(SALARY), COUNT(SALARY)&lt;br /&gt;FROM S_EMPGROUP BY DEPT_ID, TITLE;&lt;br /&gt;&lt;br /&gt;3)특정 group의 선택&lt;br /&gt;HAVING 절이 기술됐을 때 처리되는 순서는 다음과 같다.&lt;br /&gt;① ROW 들이 GROUPing 된다.&lt;br /&gt;② GROUP 에 대해 GROUP FUNCTION 이 적용된다.&lt;br /&gt;③ HAVING 절을 만족하는 GROUP 을 선택한다.&lt;br /&gt;그러므로 GROUP BY 절과 HAVING 절의 순서는 바뀌어도 되지만 의미상 GROUP BY절 다음에 HAVING 절을 기술하는 것이 좋다.HAVING 절에서는 GROUP FUNCTION 을 사용하여 GROUP 에 대한 조건식을 기술한다. &lt;span style="color:#3333ff;"&gt;SELECT column1명[, column2명], group_function(column명)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;FROM table명GROUP BY column1명[, column2명] HAVING 그룹조건식 ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 TITLE 별로 급여합계를 검색하시오.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;단, 급여합계가 5000 이상인 GROUP 만 출력하시오.&lt;/span&gt;&lt;br /&gt;SELECT TITLE, SUM(SALARY) PAYROLL FROM S_EMP GROUP BY TITLE HAVING SUM(SALARY) &gt;= 5000 ;&lt;br /&gt;&lt;br /&gt;4)Group의 정렬&lt;br /&gt;기본적으로 GROUP BY 절에 기술된 COLUMN 값으로 SORT 된다.&lt;br /&gt;이 순서를 바꾸고자 하면 ORDER BY 절을 기술하면 된다. DATA 의 SORT 순서를 정한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT column1명[, column2명], group_function(column명) &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;FROM table명 GROUP BY column1명[, column2명] ORDER BY column명 group_function(column명) ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE에서 DEPT_ID 별로 인원수를 검색하시오.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;단, 인원수가 많은 부서부터 출력하시오.&lt;/span&gt;&lt;br /&gt;SELECT DEPT_ID, COUNT(*)FROM S_EMPGROUP BY DEPT_IDORDER BY COUNT(*) DESC ;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;14.Subquery&lt;/span&gt;&lt;br /&gt;1)Single Row Subquery&lt;br /&gt;SUBQUERY 의 결과가 1 개의 ROW 로 나오는 것을 SINGLE ROW SUBQUERY 라 하며 다음과 같은 OPERATOR 를 사용할 수 있다.=, &gt;, &gt;=, &lt;, &lt;=VALUE 값을 구하기 위해 SELECT 문장을 사용한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT column명, column명...FROM table명 WHERE column명 operator &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;(SELECT column명 FROM table명 WHERE 조건식 );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원과 같은 업무(TITLE)를 하고 있는 사원의 LAST_NAME, TITLE 을 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, TITLEFROM S_EMP&lt;br /&gt;WHERE TITLE = ( SELECT TITLE FROM S_EMPWHERE LAST_NAME = 'Smith') ;&lt;br /&gt;&lt;br /&gt;2)From절의 Subquery&lt;br /&gt;FROM 절에 기술된 SUBQUERY 문은 VIEW 처럼 사용된다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT alias명.column명, alias명,column명...&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;FROM table1명 alias1명, (SELECT column2명 FROM table2명WHERE 조건식) alias2명&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;WHERE alias1명.column1명 OPERATOR alias2명.column2명 ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 SALARY 가 회사평균급여 보다 적은 사원의 LAST_NAME,SALARY, 회사평균급여를 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT E.LAST_NAME, E.SALARY, S.AVGSAL FROM S_EMP E,&lt;br /&gt;(SELECT AVG(SALARY) AVGSAL FROM S_EMP) S WHERE E.SALARY &lt;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3)Multi Row Subquery&lt;br /&gt;SUBQUERY 의 결과가 여러 ROW 일 때는 반드시 IN OPERATOR 를 사용하여야 한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT column명, column명...FROM table명 WHERE column명 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;IN ( SELECT column명 FROM table명WHERE 조건식);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 과 S_DEPT TABLE 에서 Operations 부서에서 근무하는 사원의 LAST_NAME, TITLE, DEPT_ID 를 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP WHERE DEPT_ID&lt;br /&gt;IN (SELECT IDFROM S_DEPTWHERE NAME = 'Operations') ;&lt;br /&gt;&lt;br /&gt;4)Multi Column Subquery&lt;br /&gt;SELECT 문장의 WHERE 절에서 여러개의 COLUMN 값을 비교하려면 LOGICALOPERATOR 를 사용하여 여러개의 조건식을 기술하여야 한다.그런데 MULTI COLUMN SUBQUERY 를 사용하면 이를 해결할 수 있다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;SELECT column명, column명,,,FROM table명 WHERE (column명, column명...) &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;IN (SELECT column명, column명...FROM table명 WHERE 조건식);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 LAST_NAME Patel 인 사원과 같은 부서, 같은 업무를맡고 있는 사원의 LAST_NAME, TITLE, DEPT_ID 를 검색하시오.&lt;/span&gt;&lt;br /&gt;SELECT LAST_NAME, TITLE, DEPT_IDFROM S_EMP WHERE (DEPT_ID, TITLE)&lt;br /&gt;IN(SELECT DEPT_ID, TITLE FROM S_EMP WHERE LAST_NAME = 'Patel') ;&lt;br /&gt;SELECT LAST_NAME, TITLE, DEPT_IDFROM S_EMP WHERE (DEPT_ID)&lt;br /&gt;IN(SELECT DEPT_IDFROM S_EMP WHERE LAST_NAME = 'Patel')&lt;br /&gt;OR (TITLE) IN(SELECT TITLE FROM S_EMPWHERE LAST_NAME = 'Patel') ;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;15.Table 생성이름 붙이는 법&lt;/span&gt;&lt;br /&gt;이름은 다음의 규칙을 따라서 지정한다.&lt;br /&gt;■ TABLE 명이나 COLUMN 명은 문자로 시작하고 30 자 이내로 지정한다.&lt;br /&gt;■ A ~ Z, a ~ z, 0 ~ 9, _ , $ , # 을 사용할 수 있다.&lt;br /&gt;■ 한 USER 내에서는 다른 OBJECT 의 이름과 동일하게 지정할 수 없다.&lt;br /&gt;■ ORACLE7 SERVER 예약어를 사용할 수 없다.&lt;br /&gt;■ 대소문자를 구별하지 않는다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;16.Oracle 7 datatype&lt;/span&gt;&lt;br /&gt;COLUMN 의 DATATYPE 은 다음과 같다.&lt;br /&gt;■ CHAR(size) : 고정된 size 의 문자 값, 최대 255 자까지 지정할 수 있다.&lt;br /&gt;■ VARCHAR2(size) : size내에서의 가변길이 문자 값,최대 2000자까지 지정할 수 있다.&lt;br /&gt;■ LONG : 가변길이 문자 값, 최대 2 기가 바이트까지 사용할 수 있다. TABLE 당 한 개의 COLUMN 에만 지정 가능하다.&lt;br /&gt;■ NUMBER(p,s) : 정수, 소수 자리수의 합이 P, 소수 자리수가 s 인 숫자값, 최대 38 자리수까지 지정할 수 있다.&lt;br /&gt;■ DATE : 날짜와 시간 값, B.C. 4712년 1월 1일부터 A.D. 4712년 12월 31일까지 입력할 수 있다.&lt;br /&gt;■ RAW(size) : size 내에서의 가변길이 BINARY DATA&lt;br /&gt;■ LONGRAW : 가변길이 BINARY DATA&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;17.다른 table로부터 table생성&lt;/span&gt;&lt;br /&gt;기존하는 TABLE 로 부터 데이타와 구조를 복사하여 TABLE 을 생성한다.&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;CREATE TABLE table명 [(column명, column명...)]AS subquery ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]S_EMP TABLE 에서 DEPT_ID 가 41 인 사원들의 ID, LAST_NAME, USERID,START_DATE 만을 복사하여 EMP_41 TABLE 을 생성하시오.&lt;/span&gt;&lt;br /&gt;CREATE TABLE EMP_41AS SELECT ID, LAST_NAME, USERID, START_DATEFROM S_EMPWHERE DEPT_ID = 41;(S_EMP TABLE 에서 COLUMN명, TYPE, SIZE, NOT NULL CONSTRAINT 가 복사되어 EMP_41 TABLE 이 생성되며, 데이타는 DEPT_ID = 41 인 ROW 만 복사된다.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;18.&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Constraint&lt;/span&gt;&lt;br /&gt;CONSTRAINT의 종류는 다음과 같다.&lt;br /&gt;■ NOT NULL&lt;br /&gt;COLUMN 에 NULL 값이 입력되는 것을 허용하지 않는다.COLUMN-CONSTRAINT 로만 기술해야 한다.&lt;br /&gt;■ UNIQUE&lt;br /&gt;한 개의 COLUMN 혹은 복합 COLUMN 을 UNIQUE KEY 로 지정한다.UNIQUE KEY 에는 중복된 값을 허용하지 않는다.한개의 COLUMN 으로 구성된 UNIQUE KEY 는 NULL 값을 허용한다.COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.복합 COLUMN 으로 구성된 UNIQUE KEY 는 TABLE-CONSTRAINT 로만 기술해야 한다.UNIQUE KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.&lt;br /&gt;■ PRIMARY KEY&lt;br /&gt;ROW 를 UNIQUE 하게 대표할 수 있는 한개의 COLUMN 혹은 복합 COLUMN 으로 지정한다.PRIMARY KEY 에는 중복된 값과 NULL 값을 허용하지 않는다.TABLE 당 한 개의 PRIMARY KEY 만 지정할 수 있다.COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.복합 COLUMN 으로 구성된 PRIMARY KEY 는 TABLE-CONSTRAINT 로만 기술해야 한다.PRIMARY KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.&lt;br /&gt;■ FOREIGN KEY&lt;br /&gt;한개의 COLUMN 혹은 복합 COLUMN 으로 지정한다.&lt;br /&gt;같은 TABLE 혹은 다른 TABLE의 PRIMARY KEY 나 UNIQUE KEY 값을 참조한다.&lt;br /&gt;FOREIGN KEY 값은 모 TABLE 에 존재하는 데이타와 같던가 NULL 값을 허용한다.&lt;br /&gt;COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.&lt;br /&gt;※ CHECK : 각각의 ROW 가 만족해야할 조건을 지정한다.조건식은 QUERY 조건식과 동일하게 지정한다.&lt;br /&gt;단, 다음과 같은 것은 사용할 수 없다.&lt;br /&gt;CURRVAL, NEXTVAL, LEVEL, ROWNUM, SYSDATE, USER COLUMN 이나TABLE-CONSTRAINT 로 기술할 수 있다.&lt;br /&gt;&lt;br /&gt;CONSTRAINT 명은 다음과 같이 지정한다.&lt;br /&gt;• CONSTRAINT 는 DICTIONARY 에 저장되므로 참조하기 쉽게 의미있게 붙여준다.&lt;br /&gt;• 일반적으로 TABLE명_COLUMN명_CONSTRAINT종류와 같은 형태로 지정한다.&lt;br /&gt;• 사용자가 CONSTRAINT 명을 지정하지 않으면 ORACLE7이 SYS_Cn의 형태로 붙인다.&lt;br /&gt;• 동일한 USER 내에서 CONSTRAINT명은 UNIQUE해야 한다.&lt;br /&gt;CONSTRAINT 는 다음과 같이 기술할 수 있다.&lt;br /&gt;COLUMN-CONSTRAINT : column명 [CONSTRAINT constraint명] constraint종류&lt;br /&gt;TABLE-CONSTRAINT : [CONSTRAINT constraint명] constraint종류(column명, column명..)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;19.Table 생성&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;CREATE TABLE table명&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;(column명 type(size) [DEFAULT VALUE] [column constraint],&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;column명 type(size) [DEFAULT VALUE] [column constraint],.... ,&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;[table constraint] ,[table constraint] ,.... ) ;&lt;/span&gt;&lt;br /&gt;&lt;span color="#3333ff"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff9900;"&gt;[ 예제 ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;20.Data DICTIONARY&lt;/span&gt;&lt;br /&gt;DICTIONARY&lt;br /&gt;• DATABASE 가 만들어 졌을때 DICTIONARY TABLE 도 만들어 진다.&lt;br /&gt;• DATABASE 가 사용중일때 DICTIONARY TABLE 은 ORACLE7 SERVER 에 의해 UPDATE 된다.&lt;br /&gt;• 사용자들은 DICTIONARY TABLE 을 SELECT 할 수 있다.&lt;br /&gt;• DICTIONARY TABLE 은 SYS USER 의 소유다.&lt;br /&gt;• DICTIONARY TABLE 의 값은 대문자로 들어있다.&lt;br /&gt;• DICTIONARY TABLE 의 종류는 다음과 같은 방법으로 알 수 있다.&lt;br /&gt;SELECT * FROM DICTIONARY ;&lt;br /&gt;&lt;br /&gt;DICTIONARY TABLE 의 종류는 다음과 같다.&lt;br /&gt;• USER : USER 가 소유하고 있는 OBJECT 의 정보를 보여준다.&lt;br /&gt;• ALL : USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.&lt;br /&gt;• DBA : DBA USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.&lt;br /&gt;&lt;br /&gt;활용예&lt;br /&gt;DICTIONARY TABLE 의 검색예는 다음과 같다.&lt;br /&gt;■ 자신이 갖고 있는 TABLE 의 이름을 검색한다.&lt;br /&gt;SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE';&lt;br /&gt;■ 자신이 갖고 있는 OBJECT 의 종류를 검색한다.SELECT 　　DISTINCT OBJECT_TYPEFROM 　　USER_OBJECTS;&lt;br /&gt;■ GRANT 와 관련된 DICTIONARY TABLE 의 이름을 검색한다.SELECT 　　TABLE_NAMEFROM 　　DICTIONARYWHERE 　　UPPER(COMMENTS) LIKE '%GRANT%';&lt;br /&gt;■ S_EMP TABLE 의 CONSTRAINT 종류를 검색한다.SELECT 　　CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION,R_CONSTRAINT_NAMEFROM 　　USER_CONSTRAINTSWHERE 　　TABLE_NAME = 'S_EMP';&lt;br /&gt;■ S_EMP TABLE 의 COLUMN CONSTRAINT 를 검색한다.SELECT 　　CONSTRAINT_NAME, COLUMN_NAMEFROM 　　USER_CONS_COLUMNSWHERE 　　TABLE_NAME = 'S_EMP'&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-5296878836475562783?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/5296878836475562783/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=5296878836475562783' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5296878836475562783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5296878836475562783'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/sql_02.html' title='기본적인 SQL문 정리'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-1553517511873379617</id><published>2007-08-01T18:46:00.000+09:00</published><updated>2007-08-09T21:57:37.752+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='소모적인 setting'/><title type='text'>기본적인 sql 문</title><content type='html'>&lt;span style="font-family:trebuchet ms;"&gt;1. 행의 삽입 - INSERT &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;1)INSERT문의 기본 구성&lt;br /&gt;형식&lt;br /&gt;INSERT [INTO] {table_name view_name}[(column_list)] {VALUES values_list select_statement}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;- INSERT 절&lt;br /&gt;행을 삽입할 테이블 또는 뷰를 지정한다.&lt;br /&gt;전체 행이 아닌 특정 컬럼들을 지정하는 컬럼 리스트를 사용할 수 있다&lt;br /&gt;- VALUES절&lt;br /&gt;삽입할 데이터를 지정한다.&lt;br /&gt;모든 자료형들은 각각의 입력 형식을 가진다&lt;br /&gt;VALUES('123-45-6789', 'Chen', 'Sue', '900 555-1221', '214 Main St. ' , 'Kent' , 'WA' , '98000', 0)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;**********사용 예제************&lt;br /&gt;디폴트 옵션&lt;br /&gt;DEFAULT VALUES&lt;br /&gt;INSERT table_name DEFAULT VALUES&lt;br /&gt;- 모든 컬럼에 대해 디폴트 값을 가지는 행을 삽입한다. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;DEFAULT&lt;br /&gt;INSERT table_name&lt;br /&gt;VALUES( ..., DEFAULT, .....)&lt;br /&gt;- 지정된 컬럼에 디폴트 값을 삽입한다.&lt;br /&gt;- 변수가 values_list에 나타날 수 있다.&lt;br /&gt;&lt;br /&gt;고려사항&lt;br /&gt;- 해당 컬럼에 대한 디폴트나 사용자정의 자료형에 대한 디폴트 값이 존재하는 경우에 그 값이 삽입된다.&lt;br /&gt;- 컬럼이 IDENTITY 속성을 가지거나 timestamp자료형인 경우에는 적절한 값이 삽입된다.&lt;br /&gt;- DEFAULT의 경우에는 IDENTITY속성을 가지는 컬럼에 대해서는 유효하지 않다.&lt;br /&gt;- 컬럼에 디폴트가 없고 NULL이 허용되는 경우에는 NULL 이 삽입된다.&lt;br /&gt;- 컬럼에 디폴트가 없고 NULL이 허용되지 않는 경우에는 에러를 반환하고 INSERT는 실패한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;부분 데이터의 삽입&lt;br /&gt;NULL이나 디폴트 값을 허용하는 컬럼에 대해서는 데이터를 지정하지 않을 수 있다.&lt;br /&gt;INSERT [INTO] {table_name view_name} (column_list) {VALUES vlaues_list select_statement}&lt;br /&gt;- INSERT 절에 컬럼 이름을 명시한다.&lt;br /&gt;- VALUES 절의 값들은 각각 column_list의 컬럼들에 대응된다.&lt;br /&gt;- 열거 되지 않은 컬럼들에 대해서는 DEAFULT와 같이 처리된다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;INSERT publishers (pub_id, pub_name)VALUES ('9975', 'Unbound Press') &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;=&gt;publishers라는 테이블에 pub_id, pub_name이라는 칼럼에다가 각각 '9975', 'Unbound Press'라는&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;값을 넣어라.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2)SELECT를 사용한 행의 삽입&lt;br /&gt;&lt;br /&gt;SELECT 문을 사용하여 하나 이상의 다른 테이블로부터 이미 존재하는 테이블로 행을 삽입할 수 있다.&lt;br /&gt;INSERT table_name&lt;br /&gt;SELECT column_list FROM table_list WHERE search_conditions&lt;br /&gt;&lt;br /&gt;고려사항&lt;br /&gt;- 같은 테이블에서도 가능하다.&lt;br /&gt;- 삽입할 테이블과 SELECT 결과 집합은 컬럼의 개수, 컬럼의 순서, 자료형 등에 호환성이 있어야 한다.&lt;br /&gt;- 완전히 같은 자료형이거나 SQL서버가 자동적으로 호환성이 있도록 변화 할 수 있는자료형이어야 한다.&lt;br /&gt;- INSERT만을 사용하는 경우와는 달리 한번에 여러 행을 삽입한다.&lt;br /&gt;- 생략된 컬럼에 대해서는 해당 컬럼에 디폴트가 존재하는지 또는 NULL이 허용되는지를 확인해야 한다.&lt;br /&gt;&lt;br /&gt;저장 프로시져를 사용한 삽입&lt;br /&gt;저장 프로시져에 의해 반환되는 결과 값을 사용하여 테이블을 조작할 수 있다.&lt;br /&gt;INSERT [INTO] table_name&lt;br /&gt;EXECUTE {procedure_name @procedure_name_var}&lt;br /&gt;[[@parameter_name=]{value @variable [OUTPUT] DEFAULT }&lt;br /&gt;{,[@parameter_name=]{value @variable[OUTPUT] DEFAULT}]...]&lt;br /&gt;- 저장 프로시져는 로컬 또는 원격 시스템에 있을 수 있다.&lt;br /&gt;- 결과 정보를 로컬 테이블에 저장하는데 주로 이용한다.&lt;br /&gt;&lt;br /&gt;고려사항&lt;br /&gt;- 삽입할 테이블은 반드시 미리 생성 되어 있어야 한다.&lt;br /&gt;- 테이블에는 저장 프로시져 내의 SELECT 문장에 의한 결과 데이터들이 삽입된다.&lt;br /&gt;- 저장 프로시져에서의 PRINT, RAISERROR, FETCH등의 결과는 테이블에 삽입되지 않는다.&lt;br /&gt;- SELECT문의 결과로 반환되는 데이터들은 반드시 테이블의 컬럼들과 자료형이 일치해야 한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. SELECT 문의 기본구성&lt;br /&gt;&lt;br /&gt;- SELECT&lt;br /&gt;- 검색할 컬럼들을 지정&lt;br /&gt;- FROM&lt;br /&gt;- 검색할 테이블을 지정&lt;br /&gt;- WHERE&lt;br /&gt;- 검색할 테이블 내의 행을 결정&lt;br /&gt;- WHERE절이 없는 경우에는 해당 테이블의 모든 행들을 검색한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT select_list [INTO new_table_] FROM table_source [WHERE search_condition]&lt;br /&gt;[GROUP BY group_by_expression]&lt;br /&gt;[HAVING search_condition]&lt;br /&gt;[ORDER BY order_expression [ASC DESC] ]&lt;br /&gt;// 참고 : [ ] = 생략가능 { } = 중복가능 = 선택가능&lt;br /&gt;// 잘 모르겠으면 Books Online을 100% 활용하자. &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;이장 까지의 이 글의 출처를 다음과 같이 밝힙니다.&lt;br /&gt;&lt;a href="http://sqler.pe.kr/"&gt;&lt;/a&gt;&lt;a class="bl04 u" href="http://sqler.pe.kr/" target="_blank"&gt;http://sqler.pe.kr/&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;3. Alter 명령어 사용법&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;컬럼 추가 mysql&gt; alter table 테이블명 add 컬럼명 varchar(50); &lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;추가할 필드를 기존 테이블의 제일 마지막에 위치 mysql&gt;alter table 테이블명 add 추가할필드명 필드타입; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;추가할 필드를 기존 테이블의 제일 첫번째에 위치 mysql&gt;alter table 테이블명 add 추가할필드명 필드타입 first; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;추가할 필드를 기존 테이블의 중간에 위치 mysql&gt;alter table 테이블명 add 추가할필드명 필드타입 after 생성될필드가 위치할 앞 필드명; &lt;/p&gt;&lt;/span&gt;컬럼 삭제 mysql&gt; alter table 테이블명 drop 컬럼명;&lt;br /&gt;&lt;br /&gt;컬럼명,타입 변경 mysql&gt; alter table 테이블명 change 컬럼명 컬럼명1 varchar(12);&lt;br /&gt;&lt;br /&gt;컬럼 타입 수정 mysql&gt; alter table 테이블명 modify 컬럼명 varchar(14);&lt;br /&gt;&lt;br /&gt;마지막으로 테이블명 수정 mysql&gt; alter table 테이블명 rename 테이블명1;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;테이블의 필드명을 다른 이름으로 변경 mysql&gt;alter table 테이블명 change 기존필드명 바꿀필드명 바뀐필드타입;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;테이블명 변경 mysql&gt;alter table 테이블명 rename 바뀔테이블명;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;4. Auto_increment된 걸 리셋&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;TRUNCATE TABLE tbl_name;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;이때 tbl_name 내의 모든 data는 사라지지만, entry나 entry 속성은 그대로 남는다. (리셋과 같다고 보면됨)&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-1553517511873379617?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/1553517511873379617/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=1553517511873379617' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/1553517511873379617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/1553517511873379617'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/sql.html' title='기본적인 sql 문'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-8444158441962595476</id><published>2007-08-01T14:46:00.001+09:00</published><updated>2007-08-01T15:38:27.118+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='소모적인 setting'/><title type='text'>foreign key 설정 방법</title><content type='html'>이 글의 다음과 같은 출처를 밝힙니다.&lt;br /&gt;&lt;a href="http://blog.naver.com/moreta/"&gt;http://blog.naver.com/moreta/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What is a foreign key?&lt;br /&gt;A foreign key means that values in one table must also appear in another table.&lt;br /&gt;The referenced table is called the parent table while the table with the foreign key is called the child table. The foreign key in the child table will generally reference a &lt;a class="con_link" href="http://www.techonthenet.com/oracle/primary_keys.php" target="_blank"&gt;primary key&lt;/a&gt; in the parent table. A foreign key can be defined in either a CREATE TABLE statement or an ALTER TABLE statement.&lt;br /&gt;&lt;br /&gt;Using a CREATE TABLE statement&lt;br /&gt;The syntax for creating a foreign key using a CREATE TABLE statement is:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CREATE TABLE table_name(&lt;br /&gt;column1 datatype null/not null,&lt;br /&gt;column2 datatype null/not null,&lt;br /&gt;...&lt;br /&gt;CONSTRAINT fk_column FOREIGN KEY (column1, column2, ... column_n)&lt;br /&gt;REFERENCES parent_table (column1, column2, ... column_n)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;CREATE TABLE supplier (&lt;br /&gt;supplier_id numeric(10) not null,&lt;br /&gt;supplier_name varchar2(50) not null,&lt;br /&gt;contact_name varchar2(50),&lt;br /&gt;CONSTRAINT supplier_pk PRIMARY KEY (supplier_id)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;CREATE TABLE products (&lt;br /&gt;product_id numeric(10) not null,&lt;br /&gt;supplier_id numeric(10) not null,&lt;br /&gt;CONSTRAINT fk_supplier FOREIGN KEY (supplier_id)&lt;br /&gt;REFERENCES supplier(supplier_id)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;In this example, we've created a primary key on the supplier table called supplier_pk.&lt;br /&gt;It consists of only one field - the supplier_id field. Then we've created a foreign key called fk_supplier on the products table that references the supplier table based on the supplier_id field. We could also create a foreign key with more than one field as in the example below:&lt;br /&gt;&lt;br /&gt;CREATE TABLE supplier (&lt;br /&gt;supplier_id numeric(10) not null,&lt;br /&gt;supplier_name varchar2(50) not null,&lt;br /&gt;contact_name varchar2(50),&lt;br /&gt;CONSTRAINT supplier_pk PRIMARY KEY (supplier_id, supplier_name)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;CREATE TABLE products (&lt;br /&gt;product_id numeric(10) not null,&lt;br /&gt;supplier_id numeric(10) not null,&lt;br /&gt;supplier_name varchar2(50) not null,&lt;br /&gt;CONSTRAINT fk_supplier_comp FOREIGN KEY (supplier_id, supplier_name)&lt;br /&gt;REFERENCES supplier(supplier_id, supplier_name)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In this example, our foreign key called fk_foreign_comp references the supplier table based on two fields - the supplier_id and supplier_name fields.&lt;br /&gt;&lt;br /&gt;Using an ALTER TABLE statement&lt;br /&gt;The syntax for creating a foreign key in an ALTER TABLE statement is:&lt;br /&gt;&lt;br /&gt;ALTER TABLE table_name add&lt;br /&gt;CONSTRAINT constraint_name FOREIGN KEY (column1, column2, ... column_n)&lt;br /&gt;REFERENCES parent_table (column1, column2, ... column_n);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;ALTER TABLE products add&lt;br /&gt;CONSTRAINT fk_supplier FOREIGN KEY (supplier_id)&lt;br /&gt;REFERENCES supplier(supplier_id);&lt;br /&gt;&lt;br /&gt;In this example, we've created a foreign key called fk_supplier that references the supplier table based on the supplier_id field.&lt;br /&gt;We could also create a foreign key with more than one field as in the example below:&lt;br /&gt;ALTER TABLE productsadd CONSTRAINT fk_supplier FOREIGN KEY (supplier_id, supplier_name) REFERENCES supplier(supplier_id, supplier_name);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-8444158441962595476?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/8444158441962595476/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=8444158441962595476' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/8444158441962595476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/8444158441962595476'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/08/foreign-key.html' title='foreign key 설정 방법'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-2544029998004795552</id><published>2007-07-31T16:20:00.000+09:00</published><updated>2007-08-09T21:58:24.242+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Information Retrival'/><title type='text'>IR Chapter2 Modeling - 1</title><content type='html'>전형적인 정보 검색 시스템은 문헌을 색인하고 검색하기 위해 색인어를 사용한다.&lt;br /&gt;색인어는 명사들로 이루어진 키워드(연관 용어들의 집합)라고 할 수 있지만, 일반적으로 텍스트 내에 나오는 어떠한 단어들도 색인어라고 불리울 수 있다. 색인어를 사용한 검색은 문헌의 의미와 사용자 정보 요구가 색인어 집합을 통하여 자연스럽게 표현될 수 있다는 생각에 근거하고 있다. 이 색인어를 이용한 검색은 간단하지만, 크게 2가지 문제를 야기한다.&lt;br /&gt;1) 문헌 또는 사용자 요구의 많은 의미가 단어 집합으로 바뀌면서 그 의미의 상당 부분을 소실하기 때문에 문제의 과도한 단순화라는 문제를 일으킨다. 실제로 웹 검색의 결과들이 적절한 질의 형성을 하지 못하는 사용자의 경우에 상당히 불만족스러워하게 되는 예들은 자주 보는 현상이다.&lt;br /&gt;2)또 다른 문제는 어떤 문헌이 연관된 것이고 어떤 문헌이 비연관된 것인가를 예측하는 문제로서 소위 랭킹 알고리즘(검색된 문헌을 순서화하는 순위 작업)과 관계된 것이다.&lt;br /&gt;&lt;br /&gt;정보 검색은 크게 축적(ad hoc)과 여과(filtering)로 분류할 수 있다.&lt;br /&gt;전형적인 정보 검색 시스템에서는 새로운 질의가 들어와도 시스템 내부에 축적된 문헌들은 상대적으로 변함이 없는데 문헌을 축적하고 이에 대해 검색 결과를 보여주는 시스템을 ad hoc이라고 부른다.&lt;br /&gt;여과 작업은 사용자의 질의가 상대적으로 정적이고 새로운 문헌이 시스템에 들어왔다 분배되는 동작 모드를 말한다. 이 여과 작업을 위해서는 사용자의 기호도를 기술한 사용자 프로파일(user profile)이 만들어지고, 새로 입력된 문헌을 이 profile과 비교하여 특정 사용자의 관심 사항과 연관된 문헌을 제공한다. 이 선택된 문헌들의 순위까지고 제공하는 filtering의 변형을 routing이라고 부른다. 일단 여과 작업에서 가장 중요한 부분은 순위화가 아니라 사용자 기호에 근거한 프로파일 작성 부분이다. 이 프로파일을 효과적으로 작성하기 위한 방법으로 사용자로 하여금 직접 키워드 집합을 쓰게 하기도 한다. 그러나 새로운 관심 영역에서 적절한 키워드를 알기는 어렵기 때문에 좀더 정교한 방법으로 제시되는 방법은 먼저 사용자가 관심 키워드 집합을 작성하고 이에 연관된 문헌들이 제공됬을때 실제로 관련이 있는지에 대한 정보를 피드백해 주는 것이다.&lt;br /&gt;&lt;br /&gt;정보 검색 모델은 순위 결정 알고리즘에 따라 분류된다. 정보 검색 모들은 다음과 같은 특성으로 정의된다.&lt;br /&gt;정의&lt;br /&gt;정보 검색 모델은 다음과 같은 /D, Q, F, R(qi, di)/ 4개의 구성 요소로 정의된다.&lt;br /&gt;(1)D : 소장된 문헌에 대한 논리 표현의 집합&lt;br /&gt;(2)Q : 사용자 정보 요구에 대한 논리 표현의 집합인 질의. 즉, Query.&lt;br /&gt;(3)F : 문헌 표현, 질의와 이들의 관계를 모델링한 틀&lt;br /&gt;(4)R(qi, di) : D와 Q의 원소인 질의 qi, 문헌 dj를 연관시켜 주는 순위 결정 알고리즘.&lt;br /&gt;모델을 정의하기 위해서 우선, 문헌과 사용자 요구의 표현을 고려해야 하며, 이 표현이 결정되면 이들을 모델링할 틀을 구상한다. 이틀에서는 순위화 함수가 포함되는데, 예를 들면 전통적인 불리안 모델에서는 문헌집합과 표준적인 집합 연산자로 구성되며, 전형적인 벡터 모델에서 이 틀은 t 차원의 벡터 공간과 벡터 계산을 위한 표준 선형 대수 연산자로 구성되고, 확률 모델은 집합, 표준 확률 연산과 베이즈 정리로 구성된다.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-2544029998004795552?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/2544029998004795552/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=2544029998004795552' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2544029998004795552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/2544029998004795552'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/07/ir-chapter2-modeling-1.html' title='IR Chapter2 Modeling - 1'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-5546453966748243951</id><published>2007-07-31T15:57:00.001+09:00</published><updated>2007-08-09T21:58:47.013+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Information Retrival'/><title type='text'>IR Chapter 1</title><content type='html'>&lt;span style="font-family:trebuchet ms;"&gt;웹을 이용한 사용자의 작업은 크게 2가지로 볼 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;검색과 브라우징이 그것이다.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;검색이란, 사용자 질의를 통해 웹 상의 연관된 문헌들을 찾는 작업을 말한다.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;브라우징이란, 빈약하게 정의된 그러나 내재적으로 광범위한 관심을 가진 경우 문헌 집합이 사용자의 기호에 따라 이리 저리 튈 수 있는 것을 얘기한다. 예를 들면 축구에 관심있는 나는 축구라는 검색어를 시작으로 브라질 축구 교실에 관한 문헌을 읽고, 세계 기행에 관한 글을 읽고, 한비야의 글을 읽을 수 있다. 이러한 초기 목적이 명확하게 정의되어 있지 않으면서 시스템 사용 중에 목적이 바뀔 수도 있는 것이 브라우징이다&lt;/span&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-5546453966748243951?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/5546453966748243951/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=5546453966748243951' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5546453966748243951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5546453966748243951'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/07/chapter-1.html' title='IR Chapter 1'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-5320161430549720897</id><published>2007-07-30T15:39:00.000+09:00</published><updated>2007-08-09T21:59:19.002+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='textual affect sensing'/><title type='text'>textual affect sensing</title><content type='html'>&lt;span &gt;text에서 감정을 찾는 방법은 크게 다음의 4가지 방법으로 분류할 수 있다.&lt;br /&gt;Keyword spotting, lexical affinity, statistical natural language processing, 그리고 hand-crafted&lt;br /&gt;model이다. 이 네 가지 방법의 장단점에 대해서 자세히 살펴보자.&lt;br /&gt;&lt;br /&gt;1.Keyword spotting&lt;br /&gt;Keyword spotting 방법은 감정을 분명하게 드러내는 단어들(예를 들면 happy, sad같은)을 text에서 찾아내고 이를 통해 text에 담겨진 감정을 찾는 방법이다.&lt;br /&gt;이와 관련한 연구 중에 Elliot's affective Reasoner라는 연구가 있었다. 이 연구에서는 198개의 강한 감정이 드러나는 단어들을 정의하고 extremly, somewhat같은 정도를 나타내는 단어와 did that, wanted to같은 힌트나 근거가 담긴 말들을 찾아 text의 감정을 분석한다.&lt;br /&gt;다른 연구로는 Ortony's affective Lexicon이라는 연구가 있었다. 이 연구에서는 자주 사용되는 감정언어들을 그룹화하였다.&lt;br /&gt;이런 Keyword spotting 방법은 다음과 같은 두가지 문제를 안고 있다.&lt;br /&gt;첫번째는, 부정이 포함될때 인식하기 어렵다는 점이다.&lt;br /&gt;예를 들면, I am happy라는 말은 행복하다고 인식하지만&lt;br /&gt;I am not happy at all. 같은 말은 인식이 용이 하지 않다는 점이다.&lt;br /&gt;특히 우리나라 말처럼 부정의 말이 여러 방법으로 사용되는 경우엔 더욱 어려울 수 있다.&lt;br /&gt;두번째는, 두드러진 감정 언어가 실제 text의 감정이 아닐 수도 있고, 두드러진 감정 언어를 사용하지 않고 감정을 표현하는 문장이 많다는 점이다.&lt;br /&gt;예를 들면 '동생은 나에게 화해를 원했지만, 나는 기쁘게 법정으로 향하기를 결심했다.'라는 문장은 고소의 대상이 누가 되느냐에 따라 감정의 해석은 천차 만별이 될수 있다. 기쁘게 라는 단어는 반어적인 용도로 쓰였을지도 모른다.&lt;br /&gt;이런 문제들을 지녔음에도 불구하고 쉽게 알고리즘을 구현할 수 있고 부담이 없는 장점이 있기 때문에 종종 사용된다.&lt;br /&gt;&lt;br /&gt;2.Lexical affinity&lt;br /&gt;Lexical affinity는 임의의 단어에 특정한 감정의 확률적 affinity를 정하는 방법이다.&lt;br /&gt;예를 들면, accident라는 단어는 75% 정도가 negative affect를 가리키는 용도로 쓰인다고 assign될 수 있다. 따라서 이러한 확률적 affinity가 단어마다 미리 정해져야 하는데, 이를 위해 linguistic corpus들로 부터 train되어 진다.&lt;br /&gt;이 방법은 keyword spotting보다 약간 복잡하지만, 조금 향상된 성능을 보여준다.&lt;br /&gt;이 방법 역시 2가지 단점을 보인다.&lt;br /&gt;첫번째는, 순수하게 Lexical affinity를 word-level에서 사용하면, 부정문이나 다른 의미로 사용된 경우에서 오작동을 할 수 있다.&lt;br /&gt;예를 들면, I avoided an accident같은 부정의 의미를 담고 있는 문장에서 적절한 감정을 잡아내지 못한다. 또한 I met my girlfriend by accident 같은 다른 뜻으로 사용된(우연히라는) 경우에 대해서도 적절하게 대처하지 못한다.&lt;br /&gt;두번째는, lexical affinity probabilities가 사용된 source(text)의 장르 등에 의해 bias되는 영향이 있다는 점이다. 이로 인해 domain에 상관없는 모델을 만들기가 어렵기 때문에 재사용 가능한 모델을 개발하기란 대단히 힘이 든다.&lt;br /&gt;&lt;br /&gt;3.Statistical Natural Language Processing&lt;br /&gt;Statistical Natural Language Processing은 감정에 대해서 주석이 달린 text들의 corpus들을 이용해 training하는 machine learning algorithm을 이용하는 것이다.&lt;br /&gt;이 방법은 keyword spotting에서 처럼 감정을 명확히 전달하는 단어들의 affective valence(valence는 정도라고 해석하면 될 듯 하다)를 learning하며 lexical affinity에서 처럼 임의의 단어에 대한 valence역시 learning되고 구두점 같은 요소들에 대해서도 learning하여 많은 feature들을 통해 적절한 감정 인식을 수행할 수 있다.&lt;br /&gt;그러나 이러한 statistical 한 방법 때문에 문장 단위의 감정 해석에는 문제가 있다. 적어도 한 문단에서 페이지 단위의 글에서 뽑아낼 수 있을 정도의 정보가 필요하기 때문이다.&lt;br /&gt;이를 이용한 방법으로는 Goertzel's Webmind 프로젝트나 Cellia Ovesdotter의 Emotions from text등을 들 수 있다.&lt;br /&gt;&lt;br /&gt;4.Hand-Crafted Models&lt;br /&gt;Dyer와 Schand와 같은 사람들은 affect sensing을 깊은 통찰력에 관한 문제로 보았다. 특히 Dyer의 DAYDREAMER는 affective state를 인간의 필요, 목적, 욕구에 대한 심리학적 이론들을 토대로 hand-crafted model로 모델링하였다. 이러한 모델들은 text 분석에 있어서 깊은 통찰력을 요구한다. 이러한 모델링 방식은 최신의 semantic parsing 기법들이 제공할 수 있는 정보들 보다는 보다 더 깊은 통찰력을 요구한다.&lt;br /&gt;&lt;br /&gt;최근엔 이러한 4가지 문제의 접근 방식과는 전혀 다른 방식으로 text로 부터 emotion을 찾아내려는 연구가 있다. Hugo 등이 제안한 A model of textual affect sensing using real-world knowledge가 대표적인 것이다.&lt;br /&gt;이 연구는 글자 그대로, 우리가 알고 있는 상식(common sense)을 통해서 sentence로 부터 emotion을 찾아 내자는 목표를 가진다. MIT에 있던 그들은 MIT내의 ConceptNet이나 Open Mind Common Sense와 같은 프로젝트를 통해서 이와 같은 영감을 가진 것으로 보인다.&lt;br /&gt;먼저 OMCS database에서 Ortony's Affective Lexicon이 밝힌 emotion을 두드러지게 나타내는 단어들을 통해서 emotion grounds라는 subset을 만들어 낸다. 이 단어들은 어떤 문맥에서도 비교적 비슷한 의미를 갖기 때문에 emotion grounds라고 하기에 부족함이 없다는 이유이다.&lt;br /&gt;subset을 만들어낸 이후에는 text로 부터 감정을 뽑아내기 위한 분석을 수행할 수 있는 commonsense affect model이라는 것을 만들어 적용한다. 이것은 commonsense affect model이 서로 경쟁하고 보완하는 모델들의 집합일 수 있을 것이라는 생각에서 나온 것이다.(이 부분의 이해가 약간 석연치 않아 잘못 이해하고 있는 듯 하지만...)이러한 모델들은 공통된 구조화된 entry들을 갖고 있으며, 각각은 다음과 같은 형태의 값을 갖는다. 이 값들은 0.0 이상의 값을 갖는다.&lt;br /&gt;[a happy, b sad, c anger, d fear, e disgust, f surprise]&lt;br /&gt;또한 모델들은 다음과 같다.&lt;br /&gt;1) Subject-Verb-Object-Object Model&lt;br /&gt;예로 Getting into a car accident can be scary를 생각해보자.&lt;br /&gt;-&gt;Model ==&gt; Subject : 일반 사람, Verb : get into, Object1 : car accident, Object2 : ...&lt;br /&gt;value ==&gt; 0 happy, 0 sad, 0 anger, 1.0 fear, 0 disgust, 0 surprise&lt;br /&gt;로 된다. 이때 negation은 subject, object, verb의 수식어구로 처리되고 multiple SVOO가 있는 경우는 휴리스틱한 방법으로 가장 적절한 것들만 남기고 나머지는 버린다.&lt;br /&gt;이 모델의 장점은 문장 단위의 event context를 그대로 보존한다는 점에서 정확성 측면의 강점이 있다.&lt;br /&gt;2) Concept-level Unigram Model&lt;br /&gt;3) Concept-level Valence Model&lt;br /&gt;&lt;br /&gt;4) Modifier Unigram Model&lt;br /&gt;Moldy bread is disgusting, Fresh bread is delicious와 같은 문장에서 보이는 것처럼, 부사구가 감정을 전달하는데 중요한 역할을 하는 경우가 있다는 점에 주목한 모델이다.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Trebuchet MS;font-size:85%;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-5320161430549720897?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/5320161430549720897/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=5320161430549720897' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5320161430549720897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5320161430549720897'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/07/textual-affect-sensing.html' title='textual affect sensing'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-5715069172743555429</id><published>2007-07-28T16:55:00.000+09:00</published><updated>2007-09-04T17:48:28.625+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Machine learning'/><title type='text'>Designing A learning system : Machine learning1 - 2</title><content type='html'>&lt;span style="font-family:trebuchet ms;"&gt;machine learning한 system을 설계하는 basic design isssue에 대해서 알아보기 위해서&lt;br /&gt;word checker champion을 가리는 tournament에서 우승하기 위한 Machine learning program을&lt;br /&gt;디자인 하는 경우를 생각해보자.&lt;br /&gt;&lt;br /&gt;이 경우,&lt;br /&gt;Task T: playing checkers&lt;br /&gt;Performance measure P : percent of games won in the world tournament&lt;br /&gt;Traning experience E : games played against itself.&lt;br /&gt;라는 걸 먼저 염두에 두자.&lt;br /&gt;&lt;br /&gt;소기의 목적을 달성하기 위해 먼저 무엇을 해야할까? 즉, 어떻게 해야 많이 이길 수 있을까?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;그 이면에는 효과적인 머신 러닝 방법에 대한 고민과 직결되어 있다. 이러한 효과적인 머신 러닝 방법을 디자인 하기 위해서 우리가 고려해야할 것들은 다음과 같다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;1. Choosing the Traning Experience &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Trebuchet MS;"&gt;즉, 어떤 경험을 통해 기계 학습을 한다고 할 때 어떠한 training set들이 효과적일 것인가의 대한 고민을 얘기한다. 또한 이 고민에는 training set을 이용해 기계 학습을 할 때 고려해야 할 것들에 대해서도 고민한다. 예를 들면, 몇 단계 앞의 수까지 고려하게 할 것인가.. 혹은 보드의 처음부터 기계 스스로 배우게 할 것인가 아니면 각 보드의 상태를 설정해 놓고 가장 좋은 수를 찾는 것을 trainig set으로 부터 배우게 할 것인가 등등의 것들까지 training에 관한 전반적인 고민들이 이루어 져야 한다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. Choosing the target function &lt;/p&gt;&lt;p&gt;그 다음으로는 우리가 이러한 기계학습을 통해 달성하고자 하는 목표를 design하는 것이다. 즉, checker에 있어서 우리는 게임에서 이기길 원하기 때문에 다음과 같은 형태로 target function을 디자인 할 수 있을 것이다.&lt;br /&gt;만약 b가 이겼을 때의 board 상태를 나타낸다면, V(b) = 100&lt;br /&gt;만약 b가 졌을 때의 board 상태를 나타낸다면, V(b) = -100&lt;br /&gt;만약 b가 비겼을 때의 board 상태를 나타낸다면, V(b) = 0&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;3.Choosing a Representation for the target function&lt;/p&gt;&lt;p&gt;그 다음으로 우리는 고려해야 할 변인들을 생각하고 그것들을 이용해 target function을 수식으로 나타내야 한다.&lt;br /&gt;예를 들어, board의 승리와 연관되어 있는 변수들로는 다음과 같은 것들이 있다고 하자.&lt;br /&gt;검은 색 지역의 개수, x1&lt;br /&gt;붉은 색 지역의 개수, x2&lt;br /&gt;검은 색 왕들의 개수, x3&lt;br /&gt;붉은 색 왕들의 개수, x4&lt;br /&gt;붉은 색에 의해 공격 받고 있는 검은 색 지역들의 수, x5&lt;br /&gt;검은 색에 의해 공격 받고 있는 붉은 색 지역들의 수, x6&lt;br /&gt;이젠 이러한 변인들을 이용해 다음과 같은 target function을 디자인 할 수 있다&lt;br /&gt;V(b) = w0 + w1x1 + w2x2 + w3x3 + w4x4 + w5x5 + w6x6&lt;/p&gt;&lt;p&gt;4.Choosing a Function Approximation Algorithm&lt;/p&gt;&lt;p&gt;그 다음으로 적당한 training set을 이용해 target function의 가중치 값들을 조정하여 target function이 실제 target function과 가깝게 작동할 수 있도록 해야 한다.&lt;/p&gt;&lt;p&gt;5.Estimating training values&lt;/p&gt;&lt;p&gt;그 다음으로 test set을 이용해 target function이 어느정도 정확하게 작동하는지 performance를 체크 할 수 있어야 한다.&lt;/p&gt;&lt;p&gt;6.Adjusting the weights&lt;/p&gt;&lt;p&gt;이후 test set에서의 오류 값들을 고려하여 다시 target function의 weight값들을 보정할 수 있는 단계를 거치게 할 수 있다. 이 경우 보통 LMS 방법을 주로 사용한다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-5715069172743555429?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/5715069172743555429/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=5715069172743555429' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5715069172743555429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/5715069172743555429'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/07/designing-learning-system-machine.html' title='Designing A learning system : Machine learning1 - 2'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5074348724364984885.post-7186351435826558864</id><published>2007-07-28T16:28:00.000+09:00</published><updated>2007-08-09T22:00:42.787+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Machine learning'/><title type='text'>Machine Learning1</title><content type='html'>&lt;span &gt;어떤 컴퓨터 프로그램에 있어서.&lt;br /&gt;&lt;br /&gt;어떤 종류의 업무 T에 대한,(the class of tasks)&lt;br /&gt;경험들 E를 통하여,(the source of experience)&lt;br /&gt;성능 혹은 성과 P를 향상 시키는 것을(the measure of performance to be improved)&lt;br /&gt;&lt;br /&gt;learning이라고 한다.&lt;br /&gt;&lt;br /&gt;예를 들면 checker를 하는 컴퓨터 프로그램의 경우,&lt;br /&gt;&lt;br /&gt;checker game을 하는 업무에 대해&lt;br /&gt;그 동안의 checker game의 경험을 통해&lt;br /&gt;상대방을 이기는 능력의 정도(횟수)를 향상 시키는 경우를&lt;br /&gt;&lt;br /&gt;learning이라 할 수 있다.&lt;br /&gt;&lt;br /&gt;일반적으로 well-posed(defined) learning problem하기 위해선,&lt;br /&gt;the class of tasks, the measure of performance to be improved, and the source of experience&lt;br /&gt;이 세 가지를 명확하게 규정해야 한다.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5074348724364984885-7186351435826558864?l=channelofchaos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://channelofchaos.blogspot.com/feeds/7186351435826558864/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5074348724364984885&amp;postID=7186351435826558864' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/7186351435826558864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5074348724364984885/posts/default/7186351435826558864'/><link rel='alternate' type='text/html' href='http://channelofchaos.blogspot.com/2007/07/machine-learning1.html' title='Machine Learning1'/><author><name>Chan</name><uri>http://www.blogger.com/profile/11244808291741154821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
