Skip to content

Instantly share code, notes, and snippets.

@p-baleine
Last active June 20, 2018 21:06
Show Gist options
  • Save p-baleine/7cb535ef3a931afea55e6780651c3cad to your computer and use it in GitHub Desktop.
Save p-baleine/7cb535ef3a931afea55e6780651c3cad to your computer and use it in GitHub Desktop.
読書メモ〜『情報検索の基礎』 第1章
# p.3、論理検索モデル(Boolean retrieval model)
import glob
import os
DATA_PATH = '../data/Boolean_Retrieval/shakespeare_collection'
DOCUMENTS = [
'Tragedies/Antony and Cleopatra',
'Tragedies/Julius Caesar',
'Comedies/The Tempest',
'Tragedies/Hamlet',
'Tragedies/Othello',
'Tragedies/Macbeth'
]
# 用語と文章の関係(term-document)からなる結合行列をつくる
matrix = utils.create_incidence_matrix(
[os.path.join(DATA_PATH, d) for d in DOCUMENTS])

読書メモ〜『情報検索の基礎』 第1章

以前購入して積読してしまっていた情報検索の基礎を最近読み始めたのでそのメモです。


『情報検索の基礎』はタイトル通り、検索エンジンを実現するために必要となる基礎知識が網羅的に記載されている本で、扱われている内容は、逆インデックスやインデックスの圧縮から、tf-idf、k近傍法やSVMなどの分類手法、クラスタリングなど広範に及びます。どちらかというと、古典的ないわゆるプログラミングの教科書に近いスタイルで記述されており、各章は文章と若干の数式、特定の言語に依らない疑似コードによる説明と演習問題で構成されています。

個人的には前述の通り、情報検索が網羅的に記述されている点、教科書的なスタイルで記載されている点に加えて、各章の分量が多すぎず少なすぎないのでリズム良く取り組める点にとても勉強意欲をそそられました。

あくまで説明は文書と疑似コードに限られるので、実際に自分で作って動かして結果を目で見てみたい人間としては、各章の重要箇所については自分で実装してみたくなります。これは実際に実装してみた際のメモです。


# `Brutus AND Caesar AND NOT Calpurnia`という質問に答える
matrix.loc['Brutus'] & matrix.loc['Caesar'] & (~matrix.loc['Calpurnia'])
import glob
import os
import re
import pandas as pd
import string
def tokenize(line):
return line.split()
def normalize(line):
table = line.maketrans('', '', string.punctuation)
return line.translate(table)
def create_incidence_matrix(
document_paths,
tokenize=tokenize,
normalize=normalize):
"""Create incidence matrix from texts under document paths.
"""
docs = []
# Collecting terms.
for p in document_paths:
terms = []
for txt in glob.glob(os.path.join(p, '*.txt')):
with open(txt) as f:
terms.append(sum(
[tokenize(normalize(l)) for l in f], []))
docs.append(list(set(sum(terms, []))))
# Create dictionary.
vocab = [w for w in set(sum(docs, []))]
# Create matrix.
data = dict((os.path.basename(p),
dict((w, 1 if w in doc else 0) for w in vocab))
for p, doc in zip(document_paths, docs))
return pd.DataFrame(data)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment