Similar search, すなわち、コーパスの中から、クエリと一番似いている文を出す。 以下のコード、similar関数はクエリ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 |