Вернуть наиболее похожий документ по сравнению с документом запроса, используя косинусное сходство в python - PullRequest
3 голосов
/ 28 февраля 2012

У меня есть набор файлов и документ запроса. Моя цель - вернуть наиболее похожие документы, сравнив их с документом запроса для каждого документа. Чтобы использовать косинусное сходство, сначала мне нужно сопоставить строки документа с векторами. Также я уже создал функцию 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 внутри этой функции. Любой ответ приветствуется.

1 Ответ

1 голос
/ 28 февраля 2012

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

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

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

...