2012-04-25 13 views
6

Tôi đang cố gắng để làm theo các Wikipedia Article on latent semantic indexing bằng Python sử dụng đoạn mã sau:Latent Semantic Analysis bằng Python biệt

documentTermMatrix = array([[ 0., 1., 0., 1., 1., 0., 1.], 
          [ 0., 1., 1., 0., 0., 0., 0.], 
          [ 0., 0., 0., 0., 0., 1., 1.], 
          [ 0., 0., 0., 1., 0., 0., 0.], 
          [ 0., 1., 1., 0., 0., 0., 0.], 
          [ 1., 0., 0., 1., 0., 0., 0.], 
          [ 0., 0., 0., 0., 1., 1., 0.], 
          [ 0., 0., 1., 1., 0., 0., 0.], 
          [ 1., 0., 0., 1., 0., 0., 0.]]) 
u,s,vt = linalg.svd(documentTermMatrix, full_matrices=False) 

sigma = diag(s) 
## remove extra dimensions... 
numberOfDimensions = 4 
for i in range(4, len(sigma) -1): 
    sigma[i][i] = 0 
queryVector = array([[ 0.], # same as first column in documentTermMatrix 
        [ 0.], 
        [ 0.], 
        [ 0.], 
        [ 0.], 
        [ 1.], 
        [ 0.], 
        [ 0.], 
        [ 1.]]) 

Làm thế nào toán học nói rằng nó nên làm việc:

dtMatrixToQueryAgainst = dot(u, dot(s,vt)) 
queryVector = dot(inv(s), dot(transpose(u), queryVector)) 
similarityToFirst = cosineDistance(queryVector, dtMatrixToQueryAgainst[:,0] 
# gives 'matrices are not aligned' error. should be 1 because they're the same 

gì không làm việc, với toán trông không đúng: (từ here)

dtMatrixToQueryAgainst = dot(s, vt) 
queryVector = dot(transpose(u), queryVector) 
similarityToFirst = cosineDistance(queryVector, dtMatrixToQueryAgainsst[:,0]) 
# gives 1, which is correct 

Tại sao rou te làm việc, và lần đầu tiên không, khi tất cả mọi thứ tôi có thể tìm thấy về toán của LSA cho thấy đầu tiên là chính xác? Tôi cảm thấy như tôi đang thiếu một cái gì đó hiển nhiên ...

+0

Loại bỏ '## thứ nguyên bổ sung nào ...' liên quan? – Avaris

+0

được chỉnh sửa để hiển thị giảm xếp hạng – Jmjmh

+0

tại 'u, s, vt = linalg.svd (a, full_matrices = False)', ở đâu là 'a' đến từ ??? – Oerd

Trả lời

7

Có một số mâu thuẫn trong mã của bạn gây ra lỗi trước khi bạn nhầm lẫn. Điều này làm cho nó khó hiểu chính xác những gì bạn đã thử và lý do tại sao bạn đang bối rối (rõ ràng bạn đã không chạy mã như nó được dán, hoặc nó sẽ có ném một ngoại lệ trước đó).

Điều đó nói rằng, nếu tôi làm theo đúng mục đích của bạn, cách tiếp cận đầu tiên của bạn gần như chính xác. Xét đoạn mã sau:

documentTermMatrix = array([[ 0., 1., 0., 1., 1., 0., 1.], 
          [ 0., 1., 1., 0., 0., 0., 0.], 
          [ 0., 0., 0., 0., 0., 1., 1.], 
          [ 0., 0., 0., 1., 0., 0., 0.], 
          [ 0., 1., 1., 0., 0., 0., 0.], 
          [ 1., 0., 0., 1., 0., 0., 0.], 
          [ 0., 0., 0., 0., 1., 1., 0.], 
          [ 0., 0., 1., 1., 0., 0., 0.], 
          [ 1., 0., 0., 1., 0., 0., 0.]]) 
numDimensions = 4 
u, s, vt = linalg.svd(documentTermMatrix, full_matrices=False) 
u = u[:, :numDimensions] 
sigma = diag(s)[:numDimensions, :numDimensions] 
vt = vt[:numDimensions, :] 
lowRankDocumentTermMatrix = dot(u, dot(sigma, vt)) 
queryVector = documentTermMatrix[:, 0] 
lowDimensionalQuery = dot(inv(sigma), dot(u.T, queryVector)) 
lowDimensionalQuery 
vt[:,0] 

Bạn sẽ thấy rằng lowDimensionalQueryvt[:,0] đều bình đẳng. Hãy suy nghĩ của vt như là một đại diện của các tài liệu trong một không gian con chiều thấp. Trước tiên, chúng tôi ánh xạ truy vấn của chúng tôi vào không gian con đó để nhận lowDimensionalQuery và sau đó chúng tôi so sánh nó với cột tương ứng là vt. Sai lầm của bạn đang cố gắng so sánh truy vấn được chuyển đổi với vectơ tài liệu từ lowRankDocumentTermMatrix, nằm trong không gian ban đầu. Vì truy vấn được chuyển đổi có ít phần tử hơn tài liệu "được tái tạo", Python đã phàn nàn.

+1

cảm ơn bạn. câu trả lời tuyệt vời – Jmjmh

Các vấn đề liên quan