{"componentChunkName":"component---src-templates-blog-post-js","path":"/wandalgorithm/","result":{"data":{"site":{"siteMetadata":{"title":"/dev/yukarinoki"}},"markdownRemark":{"id":"a41c7f9f-d10c-5a18-8fce-cad22e8e6762","excerpt":"概要 WANDやblock WANDについて日本語の資料が少なかったので、まとめておく。 情報検索 この記事において、情報検索とは、「複数の単語を入力し、大量のドキュメントの中から、入力単語と最も関連性が強いドキュメントを、関連性が高い順に出力するもの」をいう。 Top-k query Top-k…","html":"<h1 id=\"概要\" style=\"position:relative;\"><a href=\"#%E6%A6%82%E8%A6%81\" aria-label=\"概要 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>概要</h1>\n<p>WANDやblock WANDについて日本語の資料が少なかったので、まとめておく。</p>\n<h1 id=\"情報検索\" style=\"position:relative;\"><a href=\"#%E6%83%85%E5%A0%B1%E6%A4%9C%E7%B4%A2\" aria-label=\"情報検索 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>情報検索</h1>\n<p>この記事において、情報検索とは、「複数の単語を入力し、大量のドキュメントの中から、入力単語と最も関連性が強いドキュメントを、関連性が高い順に出力するもの」をいう。</p>\n<h3 id=\"top-k-query\" style=\"position:relative;\"><a href=\"#top-k-query\" aria-label=\"top k query permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Top-k query</h3>\n<p>Top-kクエリとは、上の情報検索において、上位k個を求めるクエリのことである。Top-1なら、最も関連性の強い一つのドキュメントを出力する。</p>\n<h1 id=\"転置インデックス\" style=\"position:relative;\"><a href=\"#%E8%BB%A2%E7%BD%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9\" aria-label=\"転置インデックス permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>転置インデックス</h1>\n<p>転置インデックスとは、それぞれのドキュメントについて、単語ごとの関連スコアを計算し、それを隣接リストの形にまとめたものである。<br>\n例えば、my, search, wordの3つの単語について、d1からd7までの7つのドキュメントから、転置インデックスを求めたものは下図のようになる。  </p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/c0cbd4f213382680368604f2786023fd/442cb/inverted_index.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 65.54054054054055%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACcklEQVQ4y3WTCVMaQRCF+f//waqYqpRoRCM3cgoiYDhkua9ll/tQERBQAb/MrDFltOiq2enumXn75nWPiQ/2+vr6z1+v18xmUxaLR2bTqeGvlgtjlvFS5OezmbHv41mTdJ6fn1lvNkbi6ekJudbWVC6t3yiETwlY9kh5zfz2HIj5kODpHkrIQsS6T0trGOe22+0boPxUK2Xana6R6Ha7jEZjeu0metLBfTmMeu3grhRCSzqZVMI0RdxTfEY86OhfASXL98R0+sDjYmkA5gJmbgtBcsEj6rEzOhk3jbiVpPs7LfEzOXf0Twwl2Pv9P2o4Gg4IeaxkYkECrjMiPgepqJ9owEXmOopey1NWkjxMJv9ryCdbrVZsNlvBUCft/0kz5SXhOaR0ZacYtVGJu4Q8HXYV06Q1VWKxOIqSZTy+FfoNGQ5HdFsq2rWNftZL7eqMUd5PK+XkrnxBo1792wkvxlXfhwQ2ybJLVrLSMjGfz1ksV/Q7mgE0LoYoRU5op908qlcM8kE67Ta7zLRrYdDvYT8xc+l3YrOYcVmPCXvteGwWlGyGQa+DpjZQG3W6Qh5NrRtkvgAuFgteXtaCoU4x8gs97SUbOkFLnVOO2VGTHtK+Q2pxG9ngMfmLE+oJB7WYlXqlgEl2u6Io5JSc0dDDwYCR0LLXaorWcIqrekTLWLkXfaiL+FZI0EjYjHwjYaeveMXwMxYaN2ulNw0N3QQzafIHK/FaJGD6/IcohIu094DixTFDcUiCxB37hqZK4IiM74B2yk01ekq1lNutoXyvlUKWVqNCKX9DTWzWBINaSaGUuxH5MtWiQlns0YUv85P7O/4ABgmzicWW4ogAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"inverted_index\"\n        title=\"inverted_index\"\n        src=\"/static/c0cbd4f213382680368604f2786023fd/fcda8/inverted_index.png\"\n        srcset=\"/static/c0cbd4f213382680368604f2786023fd/12f09/inverted_index.png 148w,\n/static/c0cbd4f213382680368604f2786023fd/e4a3f/inverted_index.png 295w,\n/static/c0cbd4f213382680368604f2786023fd/fcda8/inverted_index.png 590w,\n/static/c0cbd4f213382680368604f2786023fd/442cb/inverted_index.png 752w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>情報検索において、転置インデックスは事前計算しておくこととする。<br>\nこのスコア(s: 2など)は、具体的にはドキュメント中のその単語の出現頻度などである。</p>\n<h2 id=\"ドキュメントのスコア\" style=\"position:relative;\"><a href=\"#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E3%82%B9%E3%82%B3%E3%82%A2\" aria-label=\"ドキュメントのスコア permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ドキュメントのスコア</h2>\n<p>例えば、上図の転置インデックスを持つドキュメント群に対して、“my search word”という3つの単語で検索を行ったとする。この時、“my search word”に対するドキュメントd1のスコアをどう求めるかはいろいろな流儀がある。単純に和を取る方法（1 + 2 = 3がスコアになる）、もしくは単語の重要度を入力しスコアと内積を取る方法（例えば、{my: 1, search:3, word: 2}のように入力し、スコア 1 * 1 + 2 * 3 + 0 * 2 = 6を得る）などがある。  </p>\n<p>この記事では、単純に和を取る方法を採用した場合について記述する。</p>\n<h1 id=\"情報検索アルゴリズム\" style=\"position:relative;\"><a href=\"#%E6%83%85%E5%A0%B1%E6%A4%9C%E7%B4%A2%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0\" aria-label=\"情報検索アルゴリズム permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>情報検索アルゴリズム</h1>\n<p>転置インデックスが与えられれば、ナイーブには、すべての転置インデックスを確認し、すべてのドキュメントについてスコアを求め、それをpriority queueに入れていけば、Top-kクエリに回答できる。  </p>\n<p>なので、情報検索アルゴリズムは「転置インデックスの読み取り回数をいかに少なくするか(= 転置インデックスをいかにスキップするか)」を工夫することになる。</p>\n<h1 id=\"daatdocument-at-a-time\" style=\"position:relative;\"><a href=\"#daatdocument-at-a-time\" aria-label=\"daatdocument at a time permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>DAAT(Document At A Time)</h1>\n<p>DAATは、ナイーブな情報検索アルゴリズムです。Document At A Timeという名前の通り、その時のドキュメントを見ていくアルゴリズムです。</p>\n<p>まず、すべての検索ワードの転置インデックスの先頭にポインタを置きます。\nDAATは各イテレーションで、ポインタが置かれているドキュメントのうち最もドキュメントIDの小さいドキュメントについてスコアを計算します。スコア計算に使われたポインタをその転置インデックスの次の要素に移動させます。これをすべてのポインタが転置インデックスの終端に着くまで行います。</p>\n<p><img src=\"/4485f163c7fea3e17e3b63d796a7cc13/daat.gif\" alt=\"daat\"></p>\n<h1 id=\"ナイーブに毛が生えたアルゴリズム\" style=\"position:relative;\"><a href=\"#%E3%83%8A%E3%82%A4%E3%83%BC%E3%83%96%E3%81%AB%E6%AF%9B%E3%81%8C%E7%94%9F%E3%81%88%E3%81%9F%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0\" aria-label=\"ナイーブに毛が生えたアルゴリズム permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ナイーブに毛が生えたアルゴリズム</h1>\n<p>todo</p>\n<h1 id=\"wandアルゴリズム\" style=\"position:relative;\"><a href=\"#wand%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0\" aria-label=\"wandアルゴリズム permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>WANDアルゴリズム</h1>\n<p>todo</p>","tableOfContents":"<ul>\n<li><a href=\"/wandalgorithm/#%E6%A6%82%E8%A6%81\">概要</a></li>\n<li>\n<p><a href=\"/wandalgorithm/#%E6%83%85%E5%A0%B1%E6%A4%9C%E7%B4%A2\">情報検索</a></p>\n<ul>\n<li>\n<ul>\n<li><a href=\"/wandalgorithm/#top-k-query\">Top-k query</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p><a href=\"/wandalgorithm/#%E8%BB%A2%E7%BD%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9\">転置インデックス</a></p>\n<ul>\n<li><a href=\"/wandalgorithm/#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E3%82%B9%E3%82%B3%E3%82%A2\">ドキュメントのスコア</a></li>\n</ul>\n</li>\n<li><a href=\"/wandalgorithm/#%E6%83%85%E5%A0%B1%E6%A4%9C%E7%B4%A2%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0\">情報検索アルゴリズム</a></li>\n<li><a href=\"/wandalgorithm/#daatdocument-at-a-time\">DAAT(Document At A Time)</a></li>\n<li><a href=\"/wandalgorithm/#%E3%83%8A%E3%82%A4%E3%83%BC%E3%83%96%E3%81%AB%E6%AF%9B%E3%81%8C%E7%94%9F%E3%81%88%E3%81%9F%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0\">ナイーブに毛が生えたアルゴリズム</a></li>\n<li><a href=\"/wandalgorithm/#wand%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0\">WANDアルゴリズム</a></li>\n</ul>","frontmatter":{"title":"WANDアルゴリズム、効率的なTop-kのために","date":"December 20, 2021","description":"IR(情報検索)における基本的なアルゴリズムである、WANDアルゴリズムについて"}}},"pageContext":{"slug":"/wandalgorithm/","previous":{"fields":{"slug":"/readings_Dec20/"},"frontmatter":{"title":"Dec 2020 読んだもの、やったこと"}},"next":{"fields":{"slug":"/udonsharp1/"},"frontmatter":{"title":"UdonをC#で書く方法　初歩編"}}}}}