Inverted Index + Similar search

Similar search, すなわち、コーパスの中から、クエリと一番似いている文を出す。
以下のコード、similar関数はクエリsentenceのキーワードの全部含む文を捜す。
メリット:
  • 処理が早い。
  • メモリをあまり使わなっかた。
デメリット:
  • sentenceのキーワードの順番を考察しなかった。
  • sentenceのキーワードの一部含む文の検索する関数をまだ実装しなかった。
  • 結果がいくつがあったら、ソートした方がいいかな?

#!/usr/bin/python
# -*- coding: utf8 -*-

import codecs

class Index:
    """
    転置インデクス(逆索引)を管理するクラス。
    buildメソードは、パラメータのコーパスに対して転置インデクスを作成する。
    union : 和集合
    intersection : 共通集合
    difference : 差集合
    symmetric_difference : 対称的差集合
    prints(セット)
    """
    def __init__(self):
        self.index = {}
        self.index_number = 0
        self.corpus = []
        return
       
    def build(self, corpus_path):
        fi = codecs.open(corpus_path, "r", "utf8")
        for line in fi :
            self.index_number += 1
            self.corpus.append(line)
            bow = line.split()
            for word in bow :
                if self.index.has_key(word) :
                    self.index[word].add(self.index_number - 1)
                else :
                    self.index[word] = set([self.index_number - 1])
        return
              
    def union(self, X, Y):
        if not self.index.has_key(X) :
            print "No such keyword", X
            return []
        if not self.index.has_key(Y) :
            print "No such keyword", Y
            return []
        return (self.index[X] | self.index[Y])
   
    def intersection(self, X, Y):
        if not self.index.has_key(X) :
            print "No such keyword", X
            return []
        if not self.index.has_key(Y) :
            print "No such keyword", Y
            return []
        return (self.index[X] & self.index[Y])
   
    def difference(self, X, Y):
        if not self.index.has_key(X) :
            print "No such keyword", X
            return []
        if not self.index.has_key(Y) :
            print "No such keyword", Y
            return []
        return (self.index[X] - self.index[Y])

    def symmetric_difference(self, X, Y):
        if not self.index.has_key(X) :
            print "No such keyword", X
            return []
        if not self.index.has_key(Y) :
            print "No such keyword", Y
            return []
        return (self.index[X] ^ self.index[Y])
 
    def prints(self, ans):
        for i in ans :
            print i, self.corpus[i]
        return
   
    def length(self, X):
        if self.index.has_key(X) : return len(self.index[X])
        else : return 0

    def similar(self, sentence):
        # return intersection of words in sentence
        ans = self.index[sentence[0]]
        for w in sentence :
            ans = ans & self.index[w]
        return ans
   







Comments