Вернуть документ, наиболее похожий на документ запроса, с помощью подобия Cosine в python

У меня есть набор файлов и документ с запросом. Моя цель - вернуть наиболее похожие документы путем сравнения с документом запроса для каждого документа. Чтобы использовать косинусное сходство, мне нужно сопоставить строки документа с векторами. Также я уже сделал это. создал функцию tf-idf, которая вычисляет для каждого документа.

Чтобы получить индекс строк, у меня есть такая функция;

def getvectorKeywordIndex(self, documentList):
    """ create the keyword associated to the position of the elements within the    document vectors """
    #Mapped documents into a single word string
    vocabularyString = " ".join(documentList)
    vocabularylist= vocabularyString.split(' ')
    vocabularylist= list(set(vocabularylist))
    print 'vocabularylist',vocabularylist
    vectorIndex={}
    offset=0
    #Associate a position with the keywords which maps to the dimension on the vector used to represent this word
    for word in vocabularylist:
        vectorIndex[word]=offset
        offset+=1
  print vectorIndex
  return vectorIndex,vocabularylist  #(keyword:position),vocabularylist

а для косинусного сходства моя функция такова;

 def cosine_distance(self,index, queryDoc):

    vector1= self.makeVector(index)
    vector2= self.makeVector(queryDoc)

    return numpy.dot(vector1, vector2) / (math.sqrt(numpy.dot(vector1, vector1)) * math.sqrt(numpy.dot(vector2, vector2)))

TF-IDF есть;

def tfidf(self, term, key):

    return (self.tf(term,key) * self.idf(term))

Моя проблема в том, как я могу создать makevector, используя список индекса и словаря, а также tf-idf внутри этой функции. Любой ответ приветствуется.


person Barbaros26    schedule 28.02.2012    source источник


Ответы (1)


Вы также должны передать vectorIndex в makeVector и использовать его для поиска индексов терминов в документах и ​​запросах. Игнорируйте термины, которых нет в vectorIndex.

Имейте в виду, что при работе с документами вам действительно следует использовать вместо этого матрицы scipy.sparse массивов Numpy, иначе у вас быстро закончится память.

(В качестве альтернативы рассмотрите возможность использования Vectorizer в scikit -learn, который обрабатывает все это за вас, использует scipy.sparse матриц и вычисляет значения tf-idf. Отказ от ответственности: я написал части этого класса.)

person Fred Foo    schedule 28.02.2012